Class CheckerMain
java.lang.Object
org.checkerframework.framework.util.CheckerMain
This 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=FILENAME command-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 -processor command-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.
- 
Field SummaryFieldsModifier and TypeFieldDescriptionprotected static final PatternA pattern to match bootclasspath prepend entries, used to construct one-Xbootclasspath/p:command-line argument.protected static final StringProcessor shorthand is enabled for processors in this directory in checker.jar.static final StringOption name for specifying an alternative checker-qual.jar location.static final StringOption name for specifying an alternative checker-util.jar location.protected final FileThe path to the jar containing CheckerMain.class (i.e.protected final FileThe path to checker-qual.jar.protected final FileThe path to checker-util.jar.protected static final StringProcessor shorthand is enabled for processors in this directory in checker.jar.static final StringOption name for specifying an alternative javac.jar location.protected final FileThe path to the javacJar to use.static final StringOption name for specifying an alternative jdk.jar location.protected static final PatternMatches all-Jarguments.
- 
Constructor SummaryConstructorsConstructorDescriptionCheckerMain(File checkerJar, List<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 SummaryModifier and TypeMethodDescriptionprotected voidaddMainToArgs(List<String> args) voidaddToClasspath(List<String> cpOpts) voidaddToProcessorpath(List<String> ppOpts) voidaddToRuntimeClasspath(List<String> runtimeClasspathOpts) protected voidAssert that required jars exist.collectArgFiles(List<String> args) Return the arguments that start with @ and therefore are files that contain javac arguments.createCompilationBootclasspath(List<String> argsList) Returns the compilation bootclasspath fromargsList.createCpOpts(List<String> argsList) createPpOpts(List<String> argsList) Returns processor path options.createRuntimeClasspath(List<String> argsList) expandArgFiles(List<File> files) Return all the lines in all the files.Remove the argument given by argumentName and the subsequent value from the list args if present.extractBootClassPath(List<String> args) Remove all-Xbootclasspath/p:or-J-Xbootclasspath/p:arguments from args and add them to the returned list.extractCpOpts(List<String> args) Return the last-cpor-classpathoption.protected static FileextractFileArg(String argumentName, File alternative, List<String> args) Remove the argument given by argumentName and the subsequent value from the list args if present.extractJvmOpts(List<String> args) Remove all-Jarguments fromargsand add them to the returned list (without the-Jprefix).extractOptWithPattern(@Regex(1) Pattern pattern, boolean allowEmpties, List<String> args) Find all args that match the given pattern and extract their index 1 group.extractPpOpts(List<String> args) Remove the-processorpathoptions and their arguments from args.static StringfindPathTo(@Nullable Class<?> cls, boolean errIfFromDirectory) Find the jar file or directory containing the .class file from which cls was loaded.Invoke the compiler with all relevant jars on its classpath and/or bootclasspath.intInvoke the compiler with all relevant jars on its classpath and/or bootclasspath.static voidAny exception thrown by the Checker Framework escapes to the command line.static booleanmatchesCheckerOrSubcheckerFromList(String processorString, List<@FullyQualifiedName String> fullyQualifiedCheckerNames) Returns true if processorString, once transformed into fully-qualified form, is present in fullyQualifiedCheckerNames.static booleanmatchesFullyQualifiedProcessor(String processorName, List<@FullyQualifiedName 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(List<String> args) For every "-processor" argument in args, replace its immediate successor argument using unabbreviateProcessorNames.protected static StringunshorthandProcessorNames(String processorsString, List<@FullyQualifiedName 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 Details- 
javacJarThe path to the javacJar to use.
- 
checkerJarThe path to the jar containing CheckerMain.class (i.e. checker.jar).
- 
checkerQualJarThe path to checker-qual.jar.
- 
checkerUtilJarThe path to checker-util.jar.
- 
CHECKER_QUAL_PATH_OPTOption 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:
 
- 
CHECKER_UTIL_PATH_OPTOption 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:
 
- 
JAVAC_PATH_OPTOption 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:
 
- 
JDK_PATH_OPTOption 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:
 
- 
BOOT_CLASS_PATH_REGEXA pattern to match bootclasspath prepend entries, used to construct one-Xbootclasspath/p:command-line argument.
- 
JVM_OPTS_REGEXMatches all-Jarguments.
- 
CHECKER_BASE_DIR_NAMEProcessor shorthand is enabled for processors in this directory in checker.jar.- See Also:
 
- 
COMMON_BASE_DIR_NAMEProcessor shorthand is enabled for processors in this directory in checker.jar.- See Also:
 
 
- 
- 
Constructor Details- 
CheckerMainConstruct 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 Details- 
mainAny exception thrown by the Checker Framework escapes to the command line.- Parameters:
- args- command-line arguments
 
- 
assertValidStateprotected void assertValidState()Assert that required jars exist.
- 
addToClasspath
- 
addToProcessorpath
- 
addToRuntimeClasspath
- 
createRuntimeClasspath
- 
createCompilationBootclasspathReturns the compilation bootclasspath fromargsList.- Parameters:
- argsList- args to add
- Returns:
- the compilation bootclasspath from argsList
 
- 
createCpOpts
- 
createPpOptsReturns processor path options.This method assumes that createCpOpts has already been run. - Parameters:
- argsList- arguments
- Returns:
- processor path options
 
- 
collectArgFilesReturn 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 @
 
- 
extractArgprotected static @PolyNull String extractArg(String argumentName, @PolyNull String alternative, List<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 extract
- alternative- default value to return if argumentName does not appear in args
- args- 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
 
- 
extractFileArgRemove 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 extract
- alternative- file to return if argumentName is not found in args
- args- 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
 
- 
extractOptWithPatternprotected static List<String> extractOptWithPattern(@Regex(1) Pattern pattern, boolean allowEmpties, List<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 group
- allowEmpties- whether or not to add empty group(1) matches to the returned list
- args- 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
 
- 
extractBootClassPathRemove 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
 
- 
extractJvmOptsRemove 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
 
- 
extractCpOptsReturn 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
 
- 
extractPpOptsRemove 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
- 
getExecArgumentsInvoke the compiler with all relevant jars on its classpath and/or bootclasspath.
- 
invokeCompilerpublic int invokeCompiler()Invoke the compiler with all relevant jars on its classpath and/or bootclasspath.
- 
expandArgFilesReturn all the lines in all the files.- Parameters:
- files- a list of files
- Returns:
- a list of all the lines in all the files
 
- 
findPathTopublic static String findPathTo(@Nullable Class<?> cls, boolean errIfFromDirectory) throws 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.class
- errIfFromDirectory- if false, throw an exception if the file was loaded from a directory
- Throws:
- IllegalStateException
 
- 
matchesCheckerOrSubcheckerFromListpublic static boolean matchesCheckerOrSubcheckerFromList(String processorString, List<@FullyQualifiedName 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 processors
- fullyQualifiedCheckerNames- a list of fully-qualified checker names
- Returns:
- true if the fully-qualified version of processorStringis infullyQualifiedCheckerNames
 
- 
replaceShorthandProcessorFor every "-processor" argument in args, replace its immediate successor argument using unabbreviateProcessorNames.
- 
unshorthandProcessorNamesprotected static String unshorthandProcessorNames(String processorsString, List<@FullyQualifiedName 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
- fullyQualifiedCheckerNames- a list of fully-qualified checker names to match processorsString against
- allowSubcheckers- 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
 
- 
matchesFullyQualifiedProcessorpublic static boolean matchesFullyQualifiedProcessor(String processorName, List<@FullyQualifiedName 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 processor
- fullyQualifiedCheckerNames- a list of fully-qualified checker names to match processorName against
- allowSubcheckers- 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
 
 
-