Class CheckerMain
- java.lang.Object
-
- org.checkerframework.framework.util.CheckerMain
-
public class CheckerMain extends java.lang.ObjectThis class behaves similarly to javac. CheckerMain does the following:- add the
javac.jarto the runtime classpath of the process that runs the Checker Framework. - parse and implement any special options used by the Checker Framework, e.g., using "shortnames" for annotation processors
- pass all remaining command-line arguments to the real javac
-AoutputArgsToFile=FILENAMEcommand-line argument or-AoutputArgsToFile=-to output to standard out."To run the Checker Framework" really means to run java, where the program being run is javac and javac is passed a
-processorcommand-line argument that mentions a Checker Framework checker. There are 5 relevant classpaths: The classpath and bootclasspath when running java, and the classpath, bootclasspath, and processorpath used by javac. The latter three are the only important ones.Note for developers: Try to limit the work done (and options interpreted) by CheckerMain, because its functionality is not available to users who choose not to use the Checker Framework javac script.
- add the
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.util.regex.PatternBOOT_CLASS_PATH_REGEXA pattern to match bootclasspath prepend entries, used to construct one-Xbootclasspath/p:command-line argument.protected static java.lang.StringCHECKER_BASE_DIR_NAMEProcessor shorthand is enabled for processors in this directory in checker.jar.static java.lang.StringCHECKER_QUAL_PATH_OPTOption name for specifying an alternative checker-qual.jar location.static java.lang.StringCHECKER_UTIL_PATH_OPTOption name for specifying an alternative checker-util.jar location.protected java.io.FilecheckerJarThe path to the jar containing CheckerMain.class (i.e.protected java.io.FilecheckerQualJarThe path to checker-qual.jar.protected java.io.FilecheckerUtilJarThe path to checker-util.jar.protected static java.lang.StringCOMMON_BASE_DIR_NAMEProcessor shorthand is enabled for processors in this directory in checker.jar.static java.lang.StringJAVAC_PATH_OPTOption name for specifying an alternative javac.jar location.protected java.io.FilejavacJarThe path to the javacJar to use.static java.lang.StringJDK_PATH_OPTOption name for specifying an alternative jdk.jar location.protected static java.util.regex.PatternJVM_OPTS_REGEXMatches all-Jarguments.
-
Constructor Summary
Constructors Constructor Description CheckerMain(java.io.File checkerJar, java.util.List<java.lang.String> args)Construct all the relevant file locations and Java version given the path to this jar and a set of directories in which to search for jars.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidaddMainToArgs(java.util.List<java.lang.String> args)voidaddToClasspath(java.util.List<java.lang.String> cpOpts)voidaddToProcessorpath(java.util.List<java.lang.String> ppOpts)voidaddToRuntimeClasspath(java.util.List<java.lang.String> runtimeClasspathOpts)protected voidassertValidState()Assert that required jars exist.protected java.util.List<java.io.File>collectArgFiles(java.util.List<java.lang.String> args)Return the arguments that start with @ and therefore are files that contain javac arguments.protected java.util.List<java.lang.String>createCompilationBootclasspath(java.util.List<java.lang.String> argsList)Returns the compilation bootclasspath fromargsList.protected java.util.List<java.lang.String>createCpOpts(java.util.List<java.lang.String> argsList)protected java.util.List<java.lang.String>createPpOpts(java.util.List<java.lang.String> argsList)Returns processor path options.protected java.util.List<java.lang.String>createRuntimeClasspath(java.util.List<java.lang.String> argsList)protected static java.util.List<java.lang.String>expandArgFiles(java.util.List<java.io.File> files)Return all the lines in all the files.protected static @PolyNull java.lang.StringextractArg(java.lang.String argumentName, @PolyNull java.lang.String alternative, java.util.List<java.lang.String> args)Remove the argument given by argumentName and the subsequent value from the list args if present.protected static java.util.List<java.lang.String>extractBootClassPath(java.util.List<java.lang.String> args)Remove all-Xbootclasspath/p:or-J-Xbootclasspath/p:arguments from args and add them to the returned list.protected static java.util.List<java.lang.String>extractCpOpts(java.util.List<java.lang.String> args)Return the last-cpor-classpathoption.protected static java.io.FileextractFileArg(java.lang.String argumentName, java.io.File alternative, java.util.List<java.lang.String> args)Remove the argument given by argumentName and the subsequent value from the list args if present.protected static java.util.List<java.lang.String>extractJvmOpts(java.util.List<java.lang.String> args)Remove all-Jarguments fromargsand add them to the returned list (without the-Jprefix).protected static java.util.List<java.lang.String>extractOptWithPattern(@Regex(1) java.util.regex.Pattern pattern, boolean allowEmpties, java.util.List<java.lang.String> args)Find all args that match the given pattern and extract their index 1 group.protected static java.util.List<java.lang.String>extractPpOpts(java.util.List<java.lang.String> args)Remove the-processorpathoptions and their arguments from args.static java.lang.StringfindPathTo(@Nullable java.lang.Class<?> cls, boolean errIfFromDirectory)Find the jar file or directory containing the .class file from which cls was loaded.java.util.List<java.lang.String>getExecArguments()Invoke the compiler with all relevant jars on its classpath and/or bootclasspath.intinvokeCompiler()Invoke the compiler with all relevant jars on its classpath and/or bootclasspath.static voidmain(java.lang.String[] args)Any exception thrown by the Checker Framework escapes to the command line.static booleanmatchesCheckerOrSubcheckerFromList(java.lang.String processorString, java.util.List<@FullyQualifiedName java.lang.String> fullyQualifiedCheckerNames)Returns true if processorString, once transformed into fully-qualified form, is present in fullyQualifiedCheckerNames.static booleanmatchesFullyQualifiedProcessor(java.lang.String processorName, java.util.List<@FullyQualifiedName java.lang.String> fullyQualifiedCheckerNames, boolean allowSubcheckers)Given a shorthand processor name, returns true if it can be expanded to a checker in the fullyQualifiedCheckerNames list.protected voidreplaceShorthandProcessor(java.util.List<java.lang.String> args)For every "-processor" argument in args, replace its immediate successor argument using unabbreviateProcessorNames.protected static java.lang.StringunshorthandProcessorNames(java.lang.String processorsString, java.util.List<@FullyQualifiedName java.lang.String> fullyQualifiedCheckerNames, boolean allowSubcheckers)Takes a string of comma-separated processor names, and expands any shorthands to fully-qualified names from the fullyQualifiedCheckerNames list.
-
-
-
Field Detail
-
javacJar
protected final java.io.File javacJar
The path to the javacJar to use.
-
checkerJar
protected final java.io.File checkerJar
The path to the jar containing CheckerMain.class (i.e. checker.jar).
-
checkerQualJar
protected final java.io.File checkerQualJar
The path to checker-qual.jar.
-
checkerUtilJar
protected final java.io.File checkerUtilJar
The path to checker-util.jar.
-
CHECKER_QUAL_PATH_OPT
public static final java.lang.String CHECKER_QUAL_PATH_OPT
Option name for specifying an alternative checker-qual.jar location. The accompanying value MUST be the path to the jar file (NOT the path to its encompassing directory)- See Also:
- Constant Field Values
-
CHECKER_UTIL_PATH_OPT
public static final java.lang.String CHECKER_UTIL_PATH_OPT
Option name for specifying an alternative checker-util.jar location. The accompanying value MUST be the path to the jar file (NOT the path to its encompassing directory)- See Also:
- Constant Field Values
-
JAVAC_PATH_OPT
public static final java.lang.String JAVAC_PATH_OPT
Option name for specifying an alternative javac.jar location. The accompanying value MUST be the path to the jar file (NOT the path to its encompassing directory)- See Also:
- Constant Field Values
-
JDK_PATH_OPT
public static final java.lang.String JDK_PATH_OPT
Option name for specifying an alternative jdk.jar location. The accompanying value MUST be the path to the jar file (NOT the path to its encompassing directory)- See Also:
- Constant Field Values
-
BOOT_CLASS_PATH_REGEX
protected static final java.util.regex.Pattern BOOT_CLASS_PATH_REGEX
A pattern to match bootclasspath prepend entries, used to construct one-Xbootclasspath/p:command-line argument.
-
JVM_OPTS_REGEX
protected static final java.util.regex.Pattern JVM_OPTS_REGEX
Matches all-Jarguments.
-
CHECKER_BASE_DIR_NAME
protected static final java.lang.String CHECKER_BASE_DIR_NAME
Processor shorthand is enabled for processors in this directory in checker.jar.- See Also:
- Constant Field Values
-
COMMON_BASE_DIR_NAME
protected static final java.lang.String COMMON_BASE_DIR_NAME
Processor shorthand is enabled for processors in this directory in checker.jar.- See Also:
- Constant Field Values
-
-
Method Detail
-
main
public static void main(java.lang.String[] args)
Any exception thrown by the Checker Framework escapes to the command line.- Parameters:
args- command-line arguments
-
assertValidState
protected void assertValidState()
Assert that required jars exist.
-
addToClasspath
public void addToClasspath(java.util.List<java.lang.String> cpOpts)
-
addToProcessorpath
public void addToProcessorpath(java.util.List<java.lang.String> ppOpts)
-
addToRuntimeClasspath
public void addToRuntimeClasspath(java.util.List<java.lang.String> runtimeClasspathOpts)
-
createRuntimeClasspath
protected java.util.List<java.lang.String> createRuntimeClasspath(java.util.List<java.lang.String> argsList)
-
createCompilationBootclasspath
protected java.util.List<java.lang.String> createCompilationBootclasspath(java.util.List<java.lang.String> argsList)
Returns the compilation bootclasspath fromargsList.- Parameters:
argsList- args to add- Returns:
- the compilation bootclasspath from
argsList
-
createCpOpts
protected java.util.List<java.lang.String> createCpOpts(java.util.List<java.lang.String> argsList)
-
createPpOpts
protected java.util.List<java.lang.String> createPpOpts(java.util.List<java.lang.String> argsList)
Returns processor path options.This method assumes that createCpOpts has already been run.
- Parameters:
argsList- arguments- Returns:
- processor path options
-
collectArgFiles
protected java.util.List<java.io.File> collectArgFiles(java.util.List<java.lang.String> args)
Return the arguments that start with @ and therefore are files that contain javac arguments.- Parameters:
args- a list of command-line arguments; is not modified- Returns:
- a List of files representing all arguments that started with @
-
extractArg
protected static @PolyNull java.lang.String extractArg(java.lang.String argumentName, @PolyNull java.lang.String alternative, java.util.List<java.lang.String> args)
Remove the argument given by argumentName and the subsequent value from the list args if present. Return the subsequent value.- Parameters:
argumentName- a command-line option name whose argument to extractalternative- default value to return if argumentName does not appear in argsargs- the current list of arguments- Returns:
- the string that follows argumentName if argumentName is in args, or alternative if argumentName is not present in args
-
extractFileArg
protected static java.io.File extractFileArg(java.lang.String argumentName, java.io.File alternative, java.util.List<java.lang.String> args)Remove the argument given by argumentName and the subsequent value from the list args if present. Return the subsequent value wrapped as a File.- Parameters:
argumentName- argument to extractalternative- file to return if argumentName is not found in argsargs- the current list of arguments- Returns:
- the string that follows argumentName wrapped as a File if argumentName is in args or alternative if argumentName is not present in args
-
extractOptWithPattern
protected static java.util.List<java.lang.String> extractOptWithPattern(@Regex(1) java.util.regex.Pattern pattern, boolean allowEmpties, java.util.List<java.lang.String> args)
Find all args that match the given pattern and extract their index 1 group. Add all the index 1 groups to the returned list. Remove all matching args from the input args list.- Parameters:
pattern- a pattern with at least one matching groupallowEmpties- whether or not to add empty group(1) matches to the returned listargs- the arguments to extract from- Returns:
- a list of arguments from the first group that matched the pattern for each input args or the empty list if there were none
-
extractBootClassPath
protected static java.util.List<java.lang.String> extractBootClassPath(java.util.List<java.lang.String> args)
Remove all-Xbootclasspath/p:or-J-Xbootclasspath/p:arguments from args and add them to the returned list.- Parameters:
args- the arguments to extract from- Returns:
- all non-empty arguments matching BOOT_CLASS_PATH_REGEX or an empty list if there were none
-
extractJvmOpts
protected static java.util.List<java.lang.String> extractJvmOpts(java.util.List<java.lang.String> args)
Remove all-Jarguments fromargsand add them to the returned list (without the-Jprefix).- Parameters:
args- the arguments to extract from- Returns:
- all
-Jarguments (without the-Jprefix) or an empty list if there were none
-
extractCpOpts
protected static java.util.List<java.lang.String> extractCpOpts(java.util.List<java.lang.String> args)
Return the last-cpor-classpathoption. If no-cpor-classpatharguments were present, then return the CLASSPATH environment variable (if set) followed by the current directory.Also removes all
-cpand-classpathoptions from args.- Parameters:
args- a list of arguments to extract from; is side-effected by this- Returns:
- collection of classpaths to concatenate to use when calling javac.jar
-
extractPpOpts
protected static java.util.List<java.lang.String> extractPpOpts(java.util.List<java.lang.String> args)
Remove the-processorpathoptions and their arguments from args. Return the last argument.- Parameters:
args- a list of arguments to extract from- Returns:
- the arguments that should be put on the processorpath when calling javac.jar
-
addMainToArgs
protected void addMainToArgs(java.util.List<java.lang.String> args)
-
getExecArguments
public java.util.List<java.lang.String> getExecArguments()
Invoke the compiler with all relevant jars on its classpath and/or bootclasspath.
-
invokeCompiler
public int invokeCompiler()
Invoke the compiler with all relevant jars on its classpath and/or bootclasspath.
-
expandArgFiles
protected static java.util.List<java.lang.String> expandArgFiles(java.util.List<java.io.File> files)
Return all the lines in all the files.- Parameters:
files- a list of files- Returns:
- a list of all the lines in all the files
-
findPathTo
public static java.lang.String findPathTo(@Nullable java.lang.Class<?> cls, boolean errIfFromDirectory) throws java.lang.IllegalStateException
Find the jar file or directory containing the .class file from which cls was loaded.- Parameters:
cls- the class whose .class file we wish to locate; if null, CheckerMain.classerrIfFromDirectory- if false, throw an exception if the file was loaded from a directory- Throws:
java.lang.IllegalStateException
-
matchesCheckerOrSubcheckerFromList
public static boolean matchesCheckerOrSubcheckerFromList(java.lang.String processorString, java.util.List<@FullyQualifiedName java.lang.String> fullyQualifiedCheckerNames)Returns true if processorString, once transformed into fully-qualified form, is present in fullyQualifiedCheckerNames. Used by SourceChecker to determine whether a class is annotated for any processor that is being run.- Parameters:
processorString- the name of a single processor, not a comma-separated list of processorsfullyQualifiedCheckerNames- a list of fully-qualified checker names- Returns:
- true if the fully-qualified version of
processorStringis infullyQualifiedCheckerNames
-
replaceShorthandProcessor
protected void replaceShorthandProcessor(java.util.List<java.lang.String> args)
For every "-processor" argument in args, replace its immediate successor argument using unabbreviateProcessorNames.
-
unshorthandProcessorNames
protected static java.lang.String unshorthandProcessorNames(java.lang.String processorsString, java.util.List<@FullyQualifiedName java.lang.String> fullyQualifiedCheckerNames, boolean allowSubcheckers)Takes a string of comma-separated processor names, and expands any shorthands to fully-qualified names from the fullyQualifiedCheckerNames list. For example:NullnessChecker → org.checkerframework.checker.nullness.NullnessChecker nullness → org.checkerframework.checker.nullness.NullnessChecker NullnessChecker,RegexChecker → org.checkerframework.checker.nullness.NullnessChecker,org.checkerframework.checker.regex.RegexChecker
Note, a processor entry only gets replaced if it contains NO "." (i.e., it is not qualified by a package name) and can be found under the package org.checkerframework.checker in checker.jar.- Parameters:
processorsString- a comma-separated string identifying processors; often just one processorfullyQualifiedCheckerNames- a list of fully-qualified checker names to match processorsString againstallowSubcheckers- whether to match against fully qualified checker names ending with "Subchecker"- Returns:
- processorsString where all shorthand references to Checker Framework built-in checkers are replaced with fully-qualified references
-
matchesFullyQualifiedProcessor
public static boolean matchesFullyQualifiedProcessor(java.lang.String processorName, java.util.List<@FullyQualifiedName java.lang.String> fullyQualifiedCheckerNames, boolean allowSubcheckers)Given a shorthand processor name, returns true if it can be expanded to a checker in the fullyQualifiedCheckerNames list.- Parameters:
processorName- a string identifying one processorfullyQualifiedCheckerNames- a list of fully-qualified checker names to match processorName againstallowSubcheckers- whether to match against fully qualified checker names ending with "Subchecker"- Returns:
- true if the shorthand processor name can be expanded to a checker in
fullyQualifiedCheckerNames
-
-