Class AnnotatedTypeFactory
- All Implemented Interfaces:
AnnotationProvider
- Direct Known Subclasses:
GenericAnnotatedTypeFactory,TypeOutputtingChecker.GeneralAnnotatedTypeFactory
AnnotatedTypeMirror. The methods are:
getAnnotatedType(ClassTree)getAnnotatedType(MethodTree)getAnnotatedType(Tree)getAnnotatedTypeFromTypeTree(Tree)getAnnotatedType(TypeElement)getAnnotatedType(ExecutableElement)getAnnotatedType(Element)
addComputedTypeAnnotations(com.sun.source.tree.Tree, org.checkerframework.framework.type.AnnotatedTypeMirror) to add defaults, flow-sensitive refinement, and
type-system-specific rules.
Unless otherwise indicated, each public method in this class returns a "fully annotated" type, which is one that has an annotation in all positions.
Type system checker writers may need to subclass this class, to add default qualifiers
according to the type system semantics. Subclasses should especially override addComputedTypeAnnotations(Element, AnnotatedTypeMirror) and addComputedTypeAnnotations(Tree, AnnotatedTypeMirror) to handle default annotations. (Also,
addDefaultAnnotations(AnnotatedTypeMirror) adds annotations, but that method is a
workaround for Issue
979.)
- See the Checker Framework Manual:
- How to write a checker plug-in
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classSubstitutes references to captured types intypeusingcapturedTypeVarToAnnotatedTypeVar.static classThe type for an instantiated generic method or constructor. -
Field Summary
FieldsModifier and TypeFieldDescriptionParses ajava files and stores annotations on public elements from ajava files.protected final ExecutableElementThe AnnotatedFor.value argument/element.Mapping from CFG-generated trees to their enclosing elements.Substitutes references to captured type variables.protected final BaseTypeCheckerThe checker to use for option handling and resource management.protected @Nullable AnnotationFileElementTypesIf type checking a Java file, stores annotations read from an ajava file for that class if one exists.protected final ElementsUtility class for working withElements.protected final ExecutableElementThe EnsuresQualifier.expression field/element.protected final ExecutableElementThe EnsuresQualifierIf.expression field/element.protected final TypeMirrorThe EnsuresQualifierIf.List type.protected final ExecutableElementThe EnsuresQualifierIf.List.value field/element.protected final ExecutableElementThe EnsuresQualifierIf.result argument/element.protected final TypeMirrorThe EnsuresQualifierIf type.protected final TypeMirrorThe EnsuresQualifier.List type.protected final ExecutableElementThe EnsuresQualifier.List.value field/element.protected final TypeMirrorThe EnsuresQualifier type.protected final ExecutableElementThe FieldInvariant.field argument/element.protected final ExecutableElementThe FieldInvariant.qualifier argument/element.protected final Map<Tree, AnnotatedTypeMirror> Mapping from an expression tree to its annotated type; before defaults are applied, just what the programmer wrote.protected final Map<Tree, AnnotatedTypeMirror> Mapping from a member tree to its annotated type; before defaults are applied, just what the programmer wrote.protected final Map<Tree, AnnotatedTypeMirror> Mapping from a type tree to its annotated type; before defaults are applied, just what the programmer wrote.protected final ExecutableElementThe HasQualifierParameter.value field/element.final booleanIf true, ignore type arguments from raw types.protected AnnotationClassLoaderThis loads type annotation classes via reflective lookup.final ExecutableElementThe MethodVal.className argument/element.final ExecutableElementThe MethodVal.methodName argument/element.final ExecutableElementThe MethodVal.params argument/element.protected final ExecutableElementThe NoQualifierParameter.value field/element.protected final ExecutableElementThe Object.getClass method.protected final ProcessingEnvironmentThe processing environment to use for accessing compiler internals.protected QualifierHierarchyRepresent the annotation relations.protected QualifierUpperBoundsHolds the qualifier upper bounds for type uses.protected ReflectionResolverObject that is used to resolve reflective method calls, if reflection resolution is turned on.protected final ExecutableElementThe RequiresQualifier.expression field/element.protected final TypeMirrorThe RequiresQualifier.List type.protected final ExecutableElementThe RequiresQualifier.List.value field/element.protected final TypeMirrorThe RequiresQualifier type.protected @Nullable CompilationUnitTreeOptional! The AST of the source file being operated on.booleanShould results be cached? This means that ATM.deepCopy() will be called.Parses stub files and stores annotations on public elements from stub files.protected final TreesTheTreesinstance to use for tree node path finding.protected TypeArgumentInferenceProvides utility method to infer type arguments.protected final AnnotatedTypeFormatterThis formatter is used for converting AnnotatedTypeMirrors to Strings.protected TypeHierarchyRepresent the type relations.protected final TypeInformationPresenterIf the option "lspTypeInfo" is defined, this presenter will report the type information of every type-checked class.final TypesUtility class for working withTypeMirrors.protected TypeVariableSubstitutorProvides utility method to substitute arguments for their type variables.final intUnique ID of the current object; for debugging purposes.Which whole-program inference output format to use, if doing whole-program inference. -
Constructor Summary
ConstructorsConstructorDescriptionAnnotatedTypeFactory(BaseTypeChecker checker) Constructs a factory from the given checker. -
Method Summary
Modifier and TypeMethodDescriptionprotected voidadaptGetClassReturnTypeToReceiver(AnnotatedTypeMirror.AnnotatedExecutableType getClassType, AnnotatedTypeMirror receiverType, ExpressionTree tree) Java special-cases the return type ofgetClass().protected voidaddAliasedDeclAnnotation(Class<? extends Annotation> alias, Class<? extends Annotation> annotationClass, AnnotationMirror annotationToUse) Add the annotationaliasas an alias for the declaration annotationannotation, where the annotation mirrorannotationToUsewill be used instead.protected voidaddAliasedTypeAnnotation(@FullyQualifiedName String aliasName, Class<?> canonicalAnno, boolean copyElements, String... ignorableElements) Adds the annotation, whose fully-qualified name is given byaliasName, as an alias for the canonical annotationcanonicalAnnothat will be used by the Checker Framework in the alias's place.protected voidaddAliasedTypeAnnotation(@FullyQualifiedName String aliasName, AnnotationMirror canonicalAnno) Adds the annotation, whose fully-qualified name is given byaliasName, as an alias for the canonical annotationcanonicalAnnothat will be used by the Checker Framework in the alias's place.protected voidaddAliasedTypeAnnotation(Class<?> aliasClass, Class<?> canonicalClass, boolean copyElements, String... ignorableElements) Adds the annotationaliasClassas an alias for the canonical annotationcanonicalClassthat will be used by the Checker Framework in the alias's place.protected voidaddAliasedTypeAnnotation(Class<?> aliasClass, AnnotationMirror canonicalAnno) Adds the annotationaliasClassas an alias for the canonical annotationcanonicalAnnothat will be used by the Checker Framework in the alias's place.protected voidaddAnnotationFromFieldInvariant(AnnotatedTypeMirror type, AnnotatedTypeMirror accessedVia, VariableElement field) Adds the qualifier specified by a field invariant forfieldtotype.protected voidaddComputedTypeAnnotations(Tree tree, AnnotatedTypeMirror type) Changes annotations on a type obtained from aTree.protected voidaddComputedTypeAnnotations(Element elt, AnnotatedTypeMirror type) Changes annotations on a type obtained from anElement.voidAdds default annotations totype.protected voidaddInheritedAnnotation(AnnotationMirror annotation) Adds the annotationannotationin the set of declaration annotations that should be inherited.applyCaptureConversion(AnnotatedTypeMirror typeToCapture) Apply capture conversion totypeToCapture.applyCaptureConversion(AnnotatedTypeMirror type, TypeMirror typeMirror) Apply capture conversion totype.Returns a primitive type: either the argument, or the result of unboxing it (which might affect its annotations).booleanareSameByClass(AnnotationMirror am, Class<? extends Annotation> annoClass) Checks that the annotationamhas the name ofannoClass.org.plumelib.util.IPair<AnnotatedTypeMirror, AnnotatedTypeMirror> binaryTreeArgTypes(BinaryTree tree) Returns the types of the two arguments to the BinaryTree, accounting for widening and unboxing if applicable.org.plumelib.util.IPair<AnnotatedTypeMirror, AnnotatedTypeMirror> binaryTreeArgTypes(AnnotatedTypeMirror left, AnnotatedTypeMirror right) Returns the types of the two arguments to a binary operation, accounting for widening and unboxing if applicable.Returns the canonical annotation for the passed annotation.protected voidThis method is called only when-Ainferis passed as an option.org.plumelib.util.IPair<AnnotatedTypeMirror, AnnotatedTypeMirror> Returns the types of the two arguments to the CompoundAssignmentTree, accounting for widening and unboxing if applicable.Determines the type of the invoked constructor based on the passed new class tree.constructorFromUse(NewClassTree tree, boolean inferTypeArgs) The implementation ofconstructorFromUse(NewClassTree)andconstructorFromUseWithoutTypeArgInference(NewClassTree).protected voidconstructorFromUsePreSubstitution(NewClassTree tree, AnnotatedTypeMirror.AnnotatedExecutableType type, boolean resolvePolyQuals) A callback method for the AnnotatedTypeFactory subtypes to customize the handling of the declared constructor type before type variable substitution.The same asconstructorFromUse(NewClassTree), but no type arguments are inferred.booleanReturns true iftypecontains any captured type variables.booleancontainsSameByClass(Collection<? extends AnnotationMirror> c, Class<? extends Annotation> annoClass) Checks that the collection contains the annotation.protected AnnotatedTypeFormatterCreates theAnnotatedTypeFormatterused by this type factory and allAnnotatedTypeMirrors it creates.protected AnnotationClassLoaderFactory method to easily change whatAnnotationClassLoaderis created to load type annotation classes.protected AnnotationFormatterCreates theAnnotationFormatterused by this type factory.protected QualifierHierarchyReturns theQualifierHierarchyto be used by this checker.protected QualifierUpperBoundsCreatesQualifierUpperBoundsfor this type factory.protected Set<Class<? extends Annotation>> Returns a mutable set of annotation classes that are supported by a checker.protected TypeArgumentInferenceCreates the object that infers type arguments.protected TypeHierarchyCreates the type hierarchy to be used by this factory.protected @Nullable TypeInformationPresenterCreates theTypeInformationPresenterused inpostProcessClassTree(ClassTree)to output type information about the current class.protected TypeVariableSubstitutorTypeVariableSubstitutor provides a method to replace type parameters with their arguments.Gets the declaration tree for the element, if the source is available.booleandoesAnnotatedForApplyToThisChecker(AnnotationMirror annotatedForAnno) DoesannotatedForAnno, which is anAnnotatedForannotation, apply to this checker?fromElement(Element elt) Creates an AnnotatedTypeMirror foreltthat includes: annotations explicitly written on the element and annotations from stub files.SeefromElement(Element).fromElement(TypeElement elt) SeefromElement(Element).getAnnotatedNullType(Set<? extends AnnotationMirror> annotations) Creates and returns an AnnotatedNullType qualified withannotations.getAnnotatedType(ClassTree tree) getAnnotatedType(MethodTree tree) getAnnotatedType(NewArrayTree tree) getAnnotatedType(NewClassTree tree) getAnnotatedType(Tree tree) Returns an AnnotatedTypeMirror representing the annotated type oftree.getAnnotatedType(Class<?> clazz) Returns an AnnotatedTypeMirror representing the annotated type ofclazz.getAnnotatedType(Element elt) Returns an AnnotatedTypeMirror representing the annotated type ofelt.Returns the currentAnnotatedTypeFormatter.Determines the annotated type from a type in tree form.getAnnotationByClass(Collection<? extends AnnotationMirror> c, Class<? extends Annotation> annoClass) Returns the AnnotationMirror incthat has classannoClass.Returns the currentAnnotationFormatter.getAnnotationMirror(Tree tree, Class<? extends Annotation> target) Returns the annotation ontreethat is in the hierarchy that contains the qualifiertarget.List<org.plumelib.util.IPair<AnnotationMirror, AnnotationMirror>> getAnnotationWithMetaAnnotation(Element element, Class<? extends Annotation> metaAnnotationClass) Returns a list of all annotations used to annotate this element, which have a meta-annotation (i.e., an annotation on that annotation) with classmetaAnnotationClass.Returns the annotated boxed type of the given primitive type.protected final Set<Class<? extends Annotation>> getBundledTypeQualifiers(Class<? extends Annotation>... explicitlyListedAnnotations) Loads all annotations contained in the qual directory of a checker via reflection; if a polymorphic type qualifier exists, and an explicit array of annotations to the set of annotation classes.protected intReturns the size for LRU caches.Returns the checker associated with this factory.Returns the names of the annotation processors that are being run.getContractExpressions(AnnotationMirror contractAnno) Returns theexpressionfield/element of the given contract annotation.getContractListValues(AnnotationMirror contractListAnno) Returns thevaluefield/element of the given contract list annotation.final AnnotationMirrorgetDeclAnnotation(Element elt, Class<? extends Annotation> annoClass) Returns all of the declaration annotations whose name equals the passed annotation class (or is an alias for it) including annotations: on the element written in stubfiles inherited from overridden methods, (seeInheritedAnnotation) inherited from superclasses or super interfaces (seeInherited)final @Nullable AnnotationMirrorgetDeclAnnotationNoAliases(Element elt, Class<? extends Annotation> annoClass) Returns the annotation mirror used to annotate this element, whose name equals the passed annotation class.Returns all of the declaration annotations on this element including annotations: on the element written in stubfiles inherited from overridden methods, (seeInheritedAnnotation) inherited from superclasses or super interfaces (seeInherited)List<org.plumelib.util.IPair<AnnotationMirror, AnnotationMirror>> getDeclAnnotationWithMetaAnnotation(Element element, Class<? extends Annotation> metaAnnotationClass) Returns a list of all declaration annotations used to annotate the element, which have a meta-annotation (i.e., an annotation on that annotation) with classmetaAnnotationClass.protected AnnotationMirrorSetReturns the set of qualifiers that are the upper bound for a type use if no other bound is specified for the type.getDummyAssignedTo(ExpressionTree expressionTree) Returnsnullor an annotated type mirror that type argument inference should assumeexpressionTreeis assigned to.final ElementsReturns the utility class for working withElements.Returns the innermost enclosing method or class tree oftree.Gets theElementrepresenting the declaration of the method enclosing a tree AST node.getEnclosingSubType(TypeElement typeElement, Tree tree) Returns theAnnotatedTypeMirrorof the enclosing type at the location oftreethat is a subtype oftypeElement.getEnclosingType(TypeElement typeElement, Tree tree) Returns theAnnotatedTypeMirrorof the enclosing type at the location oftreethat is the same type astypeElement.protected Set<AnnotationMirror> Returns the annotations that should be applied to enum constructors.getExplicitNewClassAnnos(NewClassTree newClassTree) Returns the annotations explicitly written on a NewClassTree.protected List<AnnotatedTypeMirror> getExplicitNewClassClassTypeArgs(NewClassTree newClass) Returns the partially-annotated explicit class type arguments of the new class tree.getExpressionAndOffset(String expression) Given an expression, split it into a subexpression and a constant offset.getFieldInvariantAnnotationTree(@Nullable List<? extends AnnotationTree> annoTrees) Returns the element ofannoTreesthat is a use of one of the field invariant annotations (as specified viagetFieldInvariantDeclarationAnnotations().protected Set<Class<? extends Annotation>> Returns the set of classes of field invariant annotations.getFieldInvariants(TypeElement element) Returns the field invariants for the given class, as expressed by the user in@FieldInvariantmethod annotations.org.plumelib.util.IPair<AnnotatedTypeMirror, AnnotatedTypeMirror.AnnotatedExecutableType> getFnInterfaceFromTree(Tree tree) Returns the functional interface and the function type that this lambda or member references targets.Returns the function type that this lambda targets.Returns the function type that this member reference targets.Returns the implicit receiver type of an expression tree.getIterableElementType(ExpressionTree expression) Returns the element type ofexpression.protected AnnotatedTypeMirrorgetIterableElementType(ExpressionTree expression, AnnotatedTypeMirror iterableType) Returns the element type ofiterableType.Returns the return type of the methodm.Returns the return type of the methodmat the return statementr.getNarrowedAnnotations(AnnotationMirrorSet annos, TypeKind typeKind, TypeKind narrowedTypeKind) Returns annotations applicable to typenarrowedTypeKind, that are copied or adapted fromannos.getNarrowedPrimitive(AnnotatedTypeMirror.AnnotatedPrimitiveType type, TypeMirror narrowedTypeMirror) Returns AnnotatedPrimitiveType with underlying typenarrowedTypeMirrorand with annotations copied or adapted fromtype.Gets the path for the givenTreeunder the current root by checking from the visitor's current path, and usingTrees.getPath(CompilationUnitTree, Tree)(which is much slower) only iftreeis not found on the current path.Accessor for the processing environment.final QualifierHierarchyReturns the type qualifier hierarchy graph to be used by this processor.getQualifierParameterHierarchies(Element element) Returns the set of top annotations representing all the hierarchies for which this element has a qualifier parameter.getQualifierParameterHierarchies(AnnotatedTypeMirror annotatedType) Returns the set of top annotations representing all the hierarchies for which this type has a qualifier parameter.ReturnsQualifierUpperBoundsfor this type factory.final @Nullable AnnotatedTypeMirrorgetReceiverType(ExpressionTree expression) Returns the receiver type of the expression tree, which might be the type of an implicitthis.getResultingTypeOfConstructorMemberReference(MemberReferenceTree memberReferenceTree, AnnotatedTypeMirror.AnnotatedExecutableType constructorType) Gets the type of the resulting constructor call of a MemberReferenceTree.getSelfType(Tree tree) Returns the type ofthisat the location oftree.Returns AnnotatedDeclaredType with underlying type String and annotations copied from type.final Set<@CanonicalName String> Returns an immutable set of the fully qualified names of the type qualifiers supported by this checker.final Set<Class<? extends Annotation>> Returns an immutable set of the classes corresponding to the type qualifiers supported by this checker.Accessor for the tree utilities.Returns the set of qualifiers that are the upper bounds for a use of the type.final TypeHierarchygetTypeOfExtendsImplements(Tree clause) Returns the type of the extends or implements clause.Returns the annotated primitive type of the given declared type if it is a boxed declared type.Returns the path to the tree that an external "visitor" is visiting.Returns the WholeProgramInference instance (may be null).getWidenedAnnotations(AnnotationMirrorSet annos, TypeKind typeKind, TypeKind widenedTypeKind) Returns annotations applicable to typewidenedTypeKind, that are copied or adapted fromannos.final AnnotatedTypeMirrorgetWidenedType(AnnotatedTypeMirror exprType, AnnotatedTypeMirror widenedType) Returns a widened type if applicable, otherwise returns its first argument.final AnnotatedTypeMirrorgetWidenedType(AnnotationMirrorSet exprAnnos, TypeMirror exprTypeMirror, AnnotatedTypeMirror widenedType) Applies widening if applicable, otherwise returns its first argument.booleanReturns true if theNoQualifierParameterannotation was explicitly written onelementfor the hierarchy given bytop.booleanhasExplicitQualifierParameterInHierarchy(Element element, AnnotationMirror top) Returns true if theHasQualifierParameterannotation was explicitly written onelementfor the hierarchy given bytop.booleanhasQualifierParameterInHierarchy(@Nullable Element element, AnnotationMirror top) Returns true if theelementhas a qualifier parameter.booleanhasQualifierParameterInHierarchy(AnnotatedTypeMirror annotatedTypeMirror, AnnotationMirror top) Returns true if theannotatedTypeMirrorhas a qualifier parameter.voidInitializes all fields oftype.protected voidInitialize reflection resolution.booleanisDeterministic(ExecutableElement methodElement) Returns true if the given method is deterministic according to this AnnotationProvider — that is, if multiple calls to the given method (with the same arguments) return the same value.booleanisFromByteCode(Element element) Returns true if the element is from bytecode and the if the element did not appear in a stub file.booleanisFromStubFile(Element element) Returns true if the element appears in a stub file (Currently only works for methods, constructors, and fields).booleanisImmutable(TypeMirror type) Returns true if the type is immutable.booleanisSideEffectFree(ExecutableElement methodElement) Returns true if the given method is side-effect-free according to this AnnotationProvider — that is, if a call to the given method does not undo flow-sensitive type refinement.booleanisSupportedQualifier(Class<? extends Annotation> clazz) Returns true if the given class is a part of the type system under which this type factory operates.booleanisSupportedQualifier(String className) Returns true if the given class name is a part of the type system under which this type factory operates.booleanReturns true if the given annotation is a part of the type system under which this type factory operates.final booleanisTop(AnnotationMirror qualifier) Returns true if the given qualifer is one of the top annotations for the qualifer hierarchy.protected final booleanisWithinConstructor(Tree tree) Returns true iftreeis within a constructor.voidOutput a message aboutgetAnnotatedType(javax.lang.model.element.Element), if logging is on.protected voidmakeConditionConsistentWithOtherMethod(String methodName, String otherMethodName, String className, String otherClassName, Map<String, WholeProgramInferenceJavaParserStorage.InferredDeclared> conditionMap, WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos otherDeclAnnos, boolean isPrecondition, boolean otherIsSupertype) Performs side effects to makeconditionMapobey behavioral subtyping constraints withotherDeclAnnos, that is, postconditions must be at least as strong as the postcondition on the superclass, and preconditions must be at most as strong as the condition on the superclass.protected AnnotatedTypeMirrormergeAnnotationFileAnnosIntoType(@Nullable AnnotatedTypeMirror type, Element elt, AnnotationFileElementTypes source) Merges types from annotation files foreltintotypeby taking the greatest lower bound of the annotations in both.methodFromUse(ExpressionTree tree, ExecutableElement methodElt, AnnotatedTypeMirror receiverType) Determines the type of the invoked method based on the passed expression tree, executable element, and receiver type.methodFromUse(ExpressionTree tree, ExecutableElement methodElt, AnnotatedTypeMirror receiverType, boolean inferTypeArgs) Determines the type of the invoked method based on the passed method invocation tree.methodFromUse(MethodInvocationTree tree, boolean inferTypeArgs) The implementation ofmethodFromUse(MethodInvocationTree)andmethodFromUseWithoutTypeArgInference(MethodInvocationTree).protected voidmethodFromUsePreSubstitution(ExpressionTree tree, AnnotatedTypeMirror.AnnotatedExecutableType type, boolean resolvePolyQuals) A callback method for the AnnotatedTypeFactory subtypes to customize the handling of the declared method type before type variable substitution.methodFromUseWithoutTypeArgInference(ExpressionTree tree, ExecutableElement methodElt, AnnotatedTypeMirror receiverType) Returns the same asmethodFromUse(ExpressionTree, ExecutableElement, AnnotatedTypeMirror), but without inferred type arguments.Returns the same asmethodFromUse(MethodInvocationTree), but without inferred type arguments.static StringnegateConstant(String constantExpression) Given an expression string, returns its negation.order(Collection<AnnotatedTypeMirror.AnnotatedTypeVariable> collection) Returns the list of type variables such that a type variable in the list only references type variables at a lower index than itself.protected voidParses all annotation files in the following order: jdk.astub in the same directory as the checker, if it exists and ignorejdkastub option is not supplied jdkN.astub (where N is the Java version or any higher value) in the same directory as the checker, if it exists and ignorejdkastub option is not supplied Stub files listed in @StubFiles annotation on the checker; must be in same directory as the checker Stub files provided via-Astubscompiler option Ajava files provided via-Aajavacompiler optionvoidpostAsMemberOf(AnnotatedTypeMirror type, AnnotatedTypeMirror owner, Element element) A callback method for the AnnotatedTypeFactory subtypes to customize AnnotatedTypes.asMemberOf().protected voidpostDirectSuperTypes(AnnotatedTypeMirror type, List<? extends AnnotatedTypeMirror> supertypes) A callback method for the AnnotatedTypeFactory subtypes to customize directSupertypes().protected voidpostInit()Actions that logically belong in the constructor, but need to run after the subclass constructor has completed.voidCalled byBaseTypeVisitor.visitClass(ClassTree, Void)after the ClassTree has been type checked.voidpreProcessClassTree(ClassTree classTree) Called byBaseTypeVisitor.visitClass(ClassTree, Void)before the classTree is type checked.voidReplaces or adds all annotations fromfromtoto.voidreplaceAnnotations(AnnotatedTypeMirror from, AnnotatedTypeMirror to, AnnotationMirror top) Replaces or adds annotations intop's hierarchy fromfromtoto.final voidsetEnclosingElementForArtificialTree(Tree tree, Element enclosing) Adds the given mapping from a synthetic (generated) tree to its enclosing element.voidsetRoot(@Nullable CompilationUnitTree newRoot) Set the CompilationUnitTree that should be used.voidsetVisitorTreePath(@Nullable TreePath visitorTreePath) Sets the path to the tree that an external "visitor" is visiting.booleanReturns true if redundancy between a stub file and bytecode should be reported.protected final AnnotatedTypeMirrortoAnnotatedType(TypeMirror t, boolean declaration) A convenience method that converts aTypeMirrorto an emptyAnnotatedTypeMirrorusingAnnotatedTypeMirror.createType(javax.lang.model.type.TypeMirror, org.checkerframework.framework.type.AnnotatedTypeFactory, boolean).toString()protected final AnnotatedTypeMirrorDetermines an empty annotated type of the given tree.Adapt the upper bounds of the type variables of a class relative to the type instantiation.voidwpiAdjustForUpdateField(Tree lhsTree, Element element, String fieldName, AnnotatedTypeMirror rhsATM) Changes the type ofrhsATMwhen being assigned to a field, for use by whole-program inference.voidChanges the type ofrhsATMwhen being assigned to anything other than a field, for use by whole-program inference.voidwpiPrepareMethodForWriting(String className, AMethod methodAnnos) Side-effects the method or constructor annotations to make any desired changes before writing to an annotation file.voidwpiPrepareMethodForWriting(WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos methodAnnos, Collection<WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos> inSupertypes, Collection<WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos> inSubtypes) Side-effects the method or constructor annotations to make any desired changes before writing to an ajava file.booleanReturns true if whole-program inference should infer types for receiver expressions.
-
Field Details
-
trees
TheTreesinstance to use for tree node path finding. -
root
Optional! The AST of the source file being operated on. -
processingEnv
The processing environment to use for accessing compiler internals. -
elements
Utility class for working withElements. -
types
Utility class for working withTypeMirrors. -
annotatedForValueElement
The AnnotatedFor.value argument/element. -
ensuresQualifierExpressionElement
The EnsuresQualifier.expression field/element. -
ensuresQualifierListValueElement
The EnsuresQualifier.List.value field/element. -
ensuresQualifierIfExpressionElement
The EnsuresQualifierIf.expression field/element. -
ensuresQualifierIfResultElement
The EnsuresQualifierIf.result argument/element. -
ensuresQualifierIfListValueElement
The EnsuresQualifierIf.List.value field/element. -
fieldInvariantFieldElement
The FieldInvariant.field argument/element. -
fieldInvariantQualifierElement
The FieldInvariant.qualifier argument/element. -
hasQualifierParameterValueElement
The HasQualifierParameter.value field/element. -
methodValClassNameElement
The MethodVal.className argument/element. -
methodValMethodNameElement
The MethodVal.methodName argument/element. -
methodValParamsElement
The MethodVal.params argument/element. -
noQualifierParameterValueElement
The NoQualifierParameter.value field/element. -
requiresQualifierExpressionElement
The RequiresQualifier.expression field/element. -
requiresQualifierListValueElement
The RequiresQualifier.List.value field/element. -
requiresQualifierTM
The RequiresQualifier type. -
requiresQualifierListTM
The RequiresQualifier.List type. -
ensuresQualifierTM
The EnsuresQualifier type. -
ensuresQualifierListTM
The EnsuresQualifier.List type. -
ensuresQualifierIfTM
The EnsuresQualifierIf type. -
ensuresQualifierIfListTM
The EnsuresQualifierIf.List type. -
qualHierarchy
Represent the annotation relations. -
typeHierarchy
Represent the type relations. -
typeFormatter
This formatter is used for converting AnnotatedTypeMirrors to Strings. This formatter will be used by all AnnotatedTypeMirrors created by this factory in their toString methods. -
qualifierUpperBounds
Holds the qualifier upper bounds for type uses. -
typeVarSubstitutor
Provides utility method to substitute arguments for their type variables. Field should be final, but can only be set in postInit, because subtypes might need other state to be initialized first. -
typeArgumentInference
Provides utility method to infer type arguments. -
stubTypes
Parses stub files and stores annotations on public elements from stub files. -
ajavaTypes
Parses ajava files and stores annotations on public elements from ajava files. -
currentFileAjavaTypes
If type checking a Java file, stores annotations read from an ajava file for that class if one exists. UnlikeajavaTypes, which only stores annotations on public elements, this stores annotations on all element locations such as in anonymous class bodies. -
checker
The checker to use for option handling and resource management. -
uid
public final int uidUnique ID of the current object; for debugging purposes. -
reflectionResolver
Object that is used to resolve reflective method calls, if reflection resolution is turned on. -
loader
This loads type annotation classes via reflective lookup. -
wpiOutputFormat
Which whole-program inference output format to use, if doing whole-program inference. This variable would be final, but it is not set unless WPI is enabled. -
shouldCache
public boolean shouldCacheShould results be cached? This means that ATM.deepCopy() will be called. ATM.deepCopy() used to (and perhaps still does) side effect the ATM being copied. So setting this to false is not equivalent to setting shouldReadCache to false. -
fromExpressionTreeCache
Mapping from an expression tree to its annotated type; before defaults are applied, just what the programmer wrote. -
fromMemberTreeCache
Mapping from a member tree to its annotated type; before defaults are applied, just what the programmer wrote. -
fromTypeTreeCache
Mapping from a type tree to its annotated type; before defaults are applied, just what the programmer wrote. -
artificialTreeToEnclosingElementMap
Mapping from CFG-generated trees to their enclosing elements. -
ignoreRawTypeArguments
public final boolean ignoreRawTypeArgumentsIf true, ignore type arguments from raw types. -
objectGetClass
The Object.getClass method. -
typeInformationPresenter
If the option "lspTypeInfo" is defined, this presenter will report the type information of every type-checked class. This information can be visualized by an editor/IDE that supports LSP. -
capturedTypeVarSubstitutor
Substitutes references to captured type variables.Unlike
typeVarSubstitutor, this class does not copy the type. Callsubstituteto use.
-
-
Constructor Details
-
AnnotatedTypeFactory
Constructs a factory from the given checker.A subclass must call postInit at the end of its constructor. postInit must be the last call in the constructor or else types from stub files may not be created as expected.
- Parameters:
checker- theSourceCheckerto which this factory belongs
-
-
Method Details
-
initializeAtm
Initializes all fields oftype.- Parameters:
type- annotated type mirror
-
checkInvalidOptionsInferSignatures
protected void checkInvalidOptionsInferSignatures()This method is called only when-Ainferis passed as an option. It checks if another option that should not occur simultaneously with the whole-program inference is also passed as argument, and aborts the process if that is the case. For example, the whole-program inference process was not designed to work with conservative defaults.Subclasses may override this method to add more options.
-
postInit
Actions that logically belong in the constructor, but need to run after the subclass constructor has completed. In particular,AnnotationFileElementTypes.parseStubFiles()may try to do type resolution with this AnnotatedTypeFactory. -
getChecker
Returns the checker associated with this factory.- Returns:
- the checker associated with this factory
-
getCheckerNames
Returns the names of the annotation processors that are being run.- Returns:
- the names of the annotation processors that are being run
-
createQualifierUpperBounds
CreatesQualifierUpperBoundsfor this type factory.- Returns:
- a new
QualifierUpperBoundsfor this type factory
-
getQualifierUpperBounds
ReturnsQualifierUpperBoundsfor this type factory.- Returns:
QualifierUpperBoundsfor this type factory
-
getWholeProgramInference
Returns the WholeProgramInference instance (may be null).- Returns:
- the WholeProgramInference instance, or null
-
initializeReflectionResolution
protected void initializeReflectionResolution()Initialize reflection resolution. -
setRoot
Set the CompilationUnitTree that should be used.- Parameters:
newRoot- the new compilation unit to use
-
toString
-
createQualifierHierarchy
Returns theQualifierHierarchyto be used by this checker.The implementation builds the type qualifier hierarchy for the
getSupportedTypeQualifiers()using the meta-annotations found in them. The current implementation returns an instance ofNoElementQualifierHierarchy.Subclasses must override this method if their qualifiers have elements; the method must return an implementation of
QualifierHierarchy, such asElementQualifierHierarchy.- Returns:
- a QualifierHierarchy for this type system
-
getQualifierHierarchy
Returns the type qualifier hierarchy graph to be used by this processor.- Returns:
- the
QualifierHierarchyfor this checker - See Also:
-
isTop
Returns true if the given qualifer is one of the top annotations for the qualifer hierarchy.- Parameters:
qualifier- a type qualifier- Returns:
- true if the given qualifer is one of the top annotations for the qualifer hierarchy
-
createTypeHierarchy
Creates the type hierarchy to be used by this factory.Subclasses may override this method to specify new type-checking rules beyond the typical Java subtyping rules.
- Returns:
- the type relations class to check type subtyping
-
getTypeHierarchy
-
createTypeVariableSubstitutor
TypeVariableSubstitutor provides a method to replace type parameters with their arguments. -
getTypeVarSubstitutor
-
createTypeArgumentInference
Creates the object that infers type arguments.- Returns:
- the object that infers type arguments
-
getTypeArgumentInference
-
createAnnotationClassLoader
Factory method to easily change whatAnnotationClassLoaderis created to load type annotation classes. Subclasses can override this method and return a custom AnnotationClassLoader subclass to customize loading logic. -
createSupportedTypeQualifiers
Returns a mutable set of annotation classes that are supported by a checker.Subclasses may override this method to return a mutable set of their supported type qualifiers through one of the 5 approaches shown below.
Subclasses should not call this method; they should call
getSupportedTypeQualifiers()instead.By default, a checker supports all annotations located in a subdirectory called qual that's located in the same directory as the checker. Note that only annotations defined with the
@Target({ElementType.TYPE_USE})meta-annotation (and optionally with the additional value ofElementType.TYPE_PARAMETER, but no otherElementTypevalues) are automatically considered as supported annotations.To support a different set of annotations than those in the qual subdirectory, or that have other
ElementTypevalues, see examples below.In total, there are 5 ways to indicate annotations that are supported by a checker:
- Only support annotations located in a checker's qual directory:
This is the default behavior. Simply place those annotations within the qual directory.
- Support annotations located in a checker's qual directory and a list of other
annotations:
Place those annotations within the qual directory, and override
createSupportedTypeQualifiers()by callinggetBundledTypeQualifiers(Class...)with a varargs parameter list of the other annotations. Code example:@Override protected Set<Class<? extends Annotation>> createSupportedTypeQualifiers() { return getBundledTypeQualifiers(Regex.class, PartialRegex.class, RegexBottom.class, UnknownRegex.class); } - Supporting only annotations that are explicitly listed: Override
createSupportedTypeQualifiers()and return a mutable set of the supported annotations. Code example:
The set of qualifiers returned by@Override protected Set<Class<? extends Annotation>> createSupportedTypeQualifiers() { return new HashSet<Class<? extends Annotation>>( Arrays.asList(A.class, B.class)); }createSupportedTypeQualifiers()must be a fresh, mutable set. The methodsgetBundledTypeQualifiers(Class...)must return a fresh, mutable set
- Returns:
- the type qualifiers supported this processor, or an empty set if none
- Only support annotations located in a checker's qual directory:
-
getBundledTypeQualifiers
@SafeVarargs protected final Set<Class<? extends Annotation>> getBundledTypeQualifiers(Class<? extends Annotation>... explicitlyListedAnnotations) Loads all annotations contained in the qual directory of a checker via reflection; if a polymorphic type qualifier exists, and an explicit array of annotations to the set of annotation classes.This method can be called in the overridden versions of
createSupportedTypeQualifiers()in each checker.- Parameters:
explicitlyListedAnnotations- a varargs array of explicitly listed annotation classes to be added to the returned set. For example, it is used frequently to add Bottom qualifiers.- Returns:
- a mutable set of the loaded and listed annotation classes
-
createAnnotatedTypeFormatter
Creates theAnnotatedTypeFormatterused by this type factory and allAnnotatedTypeMirrors it creates. TheAnnotatedTypeFormatteris used inAnnotatedTypeMirror.toString()and will affect the error messages printed for checkers that use this type factory.- Returns:
- the
AnnotatedTypeFormatterto pass to allAnnotatedTypeMirrors
-
getAnnotatedTypeFormatter
Returns the currentAnnotatedTypeFormatter.- Returns:
- the current
AnnotatedTypeFormatter
-
createAnnotationFormatter
Creates theAnnotationFormatterused by this type factory.- Returns:
- the
AnnotationFormatterused by this type factory
-
getAnnotationFormatter
Returns the currentAnnotationFormatter.- Returns:
- the current
AnnotationFormatter
-
createTypeInformationPresenter
Creates theTypeInformationPresenterused inpostProcessClassTree(ClassTree)to output type information about the current class.- Returns:
- the
TypeInformationPresenterused by this type factory, or null
-
getSupportedTypeQualifiers
Returns an immutable set of the classes corresponding to the type qualifiers supported by this checker.Subclasses cannot override this method; they should override
createSupportedTypeQualifiersinstead.- Returns:
- an immutable set of the supported type qualifiers, or an empty set if no qualifiers are supported
- See Also:
-
getSupportedTypeQualifierNames
Returns an immutable set of the fully qualified names of the type qualifiers supported by this checker.Subclasses cannot override this method; they should override
createSupportedTypeQualifiersinstead.- Returns:
- an immutable set of the supported type qualifiers, or an empty set if no qualifiers are supported
- See Also:
-
getCacheSize
protected int getCacheSize()Returns the size for LRU caches. It is either the value supplied via the-AatfCacheSizeoption or the default cache size.- Returns:
- cache size passed as argument to checker or DEFAULT_CACHE_SIZE
-
getAnnotatedType
Returns an AnnotatedTypeMirror representing the annotated type ofelt.- Parameters:
elt- the element- Returns:
- the annotated type of
elt
-
getAnnotatedType
Returns an AnnotatedTypeMirror representing the annotated type ofclazz.- Parameters:
clazz- a class- Returns:
- the annotated type of
clazz
-
getAnnotationMirror
public @Nullable AnnotationMirror getAnnotationMirror(Tree tree, Class<? extends Annotation> target) Description copied from interface:AnnotationProviderReturns the annotation ontreethat is in the hierarchy that contains the qualifiertarget. Returns null if none exists.- Specified by:
getAnnotationMirrorin interfaceAnnotationProvider- Parameters:
tree- the tree of which the annotation is returnedtarget- the class of the annotation- Returns:
- the annotation on
treethat has the classtarget, or null
-
getAnnotatedType
Returns an AnnotatedTypeMirror representing the annotated type oftree.- Parameters:
tree- the AST node- Returns:
- the annotated type of
tree
-
preProcessClassTree
Called byBaseTypeVisitor.visitClass(ClassTree, Void)before the classTree is type checked.- Parameters:
classTree- the class on which to perform preprocessing
-
postProcessClassTree
Called byBaseTypeVisitor.visitClass(ClassTree, Void)after the ClassTree has been type checked.The default implementation uses this to store the defaulted AnnotatedTypeMirrors and inherited declaration annotations back into the corresponding Elements. Subclasses might want to override this method if storing defaulted types is not desirable.
-
getAnnotatedTypeFromTypeTree
Determines the annotated type from a type in tree form.Note that we cannot decide from a Tree whether it is a type use or an expression. TreeUtils.isTypeTree is only an under-approximation. For example, an identifier can be either a type or an expression.
- Parameters:
tree- the type tree- Returns:
- the annotated type of the type in the AST
-
getTypeDeclarationBounds
Returns the set of qualifiers that are the upper bounds for a use of the type.- Parameters:
type- a type whose upper bounds to obtain- Returns:
- the set of qualifiers that are the upper bounds for a use of the type
-
getDefaultTypeDeclarationBounds
Returns the set of qualifiers that are the upper bound for a type use if no other bound is specified for the type.This implementation returns the top qualifiers by default. Subclass may override to return different qualifiers.
- Returns:
- the set of qualifiers that are the upper bound for a type use if no other bound is specified for the type
-
getTypeOfExtendsImplements
Returns the type of the extends or implements clause.The primary qualifier is either an explicit annotation on
clause, or it is the qualifier upper bounds for uses of the type of the clause.- Parameters:
clause- tree that represents an extends or implements clause- Returns:
- the type of the extends or implements clause
-
fromElement
Creates an AnnotatedTypeMirror foreltthat includes: annotations explicitly written on the element and annotations from stub files.Does not include default qualifiers. To obtain them, use
getAnnotatedType(Element).Does not include fake overrides from the stub file.
- Parameters:
elt- the element- Returns:
- AnnotatedTypeMirror of the element with explicitly-written and stub file annotations
-
mergeAnnotationFileAnnosIntoType
protected AnnotatedTypeMirror mergeAnnotationFileAnnosIntoType(@Nullable AnnotatedTypeMirror type, Element elt, AnnotationFileElementTypes source) Merges types from annotation files foreltintotypeby taking the greatest lower bound of the annotations in both.- Parameters:
type- the type to apply annotation file types toelt- the element from which to read annotation file typessource- storage for current annotation file annotations- Returns:
- the type, side-effected to add the annotation file types
-
addComputedTypeAnnotations
Changes annotations on a type obtained from aTree. By default, this method does nothing. GenericAnnotatedTypeFactory uses this method to implement defaulting and inference (flow-sensitive type refinement). Its subclasses usually override it only to customize default annotations.Subclasses that override this method should also override
addComputedTypeAnnotations(Element, AnnotatedTypeMirror).In classes that extend
GenericAnnotatedTypeFactory, overrideGenericAnnotatedTypeFactory.addComputedTypeAnnotations(Tree, AnnotatedTypeMirror, boolean)instead of this method.- Parameters:
tree- an AST nodetype- the type obtained fromtree
-
addComputedTypeAnnotations
Changes annotations on a type obtained from anElement. By default, this method does nothing. GenericAnnotatedTypeFactory uses this method to implement defaulting.Subclasses that override this method should also override
addComputedTypeAnnotations(Tree, AnnotatedTypeMirror).- Parameters:
elt- an elementtype- the type obtained fromelt
-
addDefaultAnnotations
Adds default annotations totype. This method should only be used in places where the correct annotations cannot be computed because of type argument of raw types. (SeeAnnotatedTypeMirror.AnnotatedWildcardType.isTypeArgOfRawType().)- Parameters:
type- annotated type to which default annotations are added
-
postDirectSuperTypes
protected void postDirectSuperTypes(AnnotatedTypeMirror type, List<? extends AnnotatedTypeMirror> supertypes) A callback method for the AnnotatedTypeFactory subtypes to customize directSupertypes(). Overriding methods should merely change the annotations on the supertypes, without adding or removing new types.The default provided implementation adds
typeannotations tosupertypes. This allows thetypeand its supertypes to have the qualifiers.- Parameters:
type- the type whose supertypes are desiredsupertypes- the supertypes as specified by the base AnnotatedTypeFactory
-
postAsMemberOf
A callback method for the AnnotatedTypeFactory subtypes to customize AnnotatedTypes.asMemberOf(). Overriding methods should merely change the annotations on the subtypes, without changing the types.- Parameters:
type- the annotated type of the elementowner- the annotated type of the receiver of the accessing treeelement- the element of the field or method
-
addAnnotationFromFieldInvariant
protected void addAnnotationFromFieldInvariant(AnnotatedTypeMirror type, AnnotatedTypeMirror accessedVia, VariableElement field) Adds the qualifier specified by a field invariant forfieldtotype.- Parameters:
type- annotated type to which the annotation is addedaccessedVia- the annotated type of the receiver of the accessing tree. (Only used to get the type element of the underling type.)field- element representing the field
-
getFieldInvariants
Returns the field invariants for the given class, as expressed by the user in@FieldInvariantmethod annotations.Subclasses may implement their own field invariant annotations if
@FieldInvariantis not expressive enough. They must override this method to properly create AnnotationMirror and also overridegetFieldInvariantDeclarationAnnotations()to return their field invariants.- Parameters:
element- class for which to get invariants- Returns:
- field invariants for
element
-
getFieldInvariantAnnotationTree
public @Nullable AnnotationTree getFieldInvariantAnnotationTree(@Nullable List<? extends AnnotationTree> annoTrees) Returns the element ofannoTreesthat is a use of one of the field invariant annotations (as specified viagetFieldInvariantDeclarationAnnotations(). If one isn't found, null is returned.- Parameters:
annoTrees- list of trees to search; the result is one of the list elements, or null- Returns:
- the AnnotationTree that is a use of one of the field invariant annotations, or null if one isn't found
-
getFieldInvariantDeclarationAnnotations
Returns the set of classes of field invariant annotations.- Returns:
- the set of classes of field invariant annotations
-
typeVariablesFromUse
public List<AnnotatedTypeParameterBounds> typeVariablesFromUse(AnnotatedTypeMirror.AnnotatedDeclaredType type, TypeElement element) Adapt the upper bounds of the type variables of a class relative to the type instantiation. In some type systems, the upper bounds depend on the instantiation of the class. For example, in the Generic Universe Type system, consider a class declaration
then the instantiationclass C<X extends @Peer Object>
is legal. The upper bounds of class C have to be adapted by the main modifier.@Rep C<@Rep Object>An example of an adaptation follows. Suppose, I have a declaration:
And an instantiation:class MyClass<E extends List<E>>new MyClass<@NonNull String>()The upper bound of E adapted to the argument String, would be
List<@NonNull String>and the lower bound would be an AnnotatedNullType.TODO: ensure that this method is consistently used instead of directly querying the type variables.
- Parameters:
type- the use of the typeelement- the corresponding element- Returns:
- the adapted bounds of the type parameters
-
getAnnotatedNullType
public AnnotatedTypeMirror.AnnotatedNullType getAnnotatedNullType(Set<? extends AnnotationMirror> annotations) Creates and returns an AnnotatedNullType qualified withannotations.- Parameters:
annotations- the set of AnnotationMirrors to qualify the returned type with- Returns:
- AnnotatedNullType qualified with
annotations
-
getImplicitReceiverType
protected @Nullable AnnotatedTypeMirror.AnnotatedDeclaredType getImplicitReceiverType(ExpressionTree tree) Returns the implicit receiver type of an expression tree.The result is null for expressions that don't have a receiver, e.g. for a local variable or method parameter access. The result is also null for expressions that have an explicit receiver.
Clients should generally call
getReceiverType(com.sun.source.tree.ExpressionTree).- Parameters:
tree- the expression that might have an implicit receiver- Returns:
- the type of the implicit receiver. Returns null if the expression has an explicit receiver or doesn't have a receiver.
-
getSelfType
Returns the type ofthisat the location oftree. Returnsnulliftreeis in a location wherethishas no meaning, such as the body of a static method.The parameter is an arbitrary tree and does not have to mention "this", neither explicitly nor implicitly. This method can be overridden for type-system specific behavior.
- Parameters:
tree- location used to decide the type ofthis- Returns:
- the type of
thisat the location oftree
-
getEnclosingClassOrMethod
Returns the innermost enclosing method or class tree oftree. Iftreeis artificial (that is, created by dataflow), thenartificialTreeToEnclosingElementMapis used to find the enclosing tree.If the tree is inside an annotation, then
nullis returned.- Parameters:
tree- tree to whose innermost enclosing method or class to return- Returns:
- the innermost enclosing method or class tree of
tree, ornulliftreeis inside an annotation
-
getEnclosingType
public AnnotatedTypeMirror.AnnotatedDeclaredType getEnclosingType(TypeElement typeElement, Tree tree) Returns theAnnotatedTypeMirrorof the enclosing type at the location oftreethat is the same type astypeElement.- Parameters:
typeElement- type of the enclosing type to returntree- location to use- Returns:
- the enclosing type at the location of
treethat is the same type astypeElement
-
getEnclosingSubType
public AnnotatedTypeMirror.AnnotatedDeclaredType getEnclosingSubType(TypeElement typeElement, Tree tree) Returns theAnnotatedTypeMirrorof the enclosing type at the location oftreethat is a subtype oftypeElement.- Parameters:
typeElement- super type of the enclosing type to returntree- location to use- Returns:
- the enclosing type at the location of
treethat is a subtype oftypeElement
-
getReceiverType
Returns the receiver type of the expression tree, which might be the type of an implicitthis. Returns null if the expression has no explicit or implicit receiver.- Parameters:
expression- the expression for which to determine the receiver type- Returns:
- the type of the receiver of expression
-
methodFromUse
public final AnnotatedTypeFactory.ParameterizedExecutableType methodFromUse(MethodInvocationTree tree) Determines the type of the invoked method based on the passed method invocation tree.The returned method type has all type variables resolved, whether based on receiver type, passed type parameters if any, and method invocation parameter.
Subclasses may override this method to customize inference of types or qualifiers based on method invocation parameters.
As an implementation detail, this method depends on
AnnotatedTypes.asMemberOf(Types, AnnotatedTypeFactory, AnnotatedTypeMirror, Element), and customization based on receiver type should be in accordance to its specification.The return type is a pair of the type of the invoked method and the (inferred) type arguments. Note that neither the explicitly passed nor the inferred type arguments are guaranteed to be subtypes of the corresponding upper bounds. See method
BaseTypeVisitor.checkTypeArguments(com.sun.source.tree.Tree, java.util.List<? extends org.checkerframework.framework.type.AnnotatedTypeParameterBounds>, java.util.List<? extends org.checkerframework.framework.type.AnnotatedTypeMirror>, java.util.List<? extends com.sun.source.tree.Tree>, java.lang.CharSequence, java.util.List<?>)for the checks of type argument well-formedness.Note that "this" and "super" constructor invocations are also handled by this method (explicit or implicit ones, at the beginning of a constructor). Method
constructorFromUse(NewClassTree)is only used for a constructor invocation in a "new" expression.- Parameters:
tree- the method invocation tree- Returns:
- the type of the invoked method and any (explict or inferred) type arguments
-
methodFromUseWithoutTypeArgInference
public AnnotatedTypeFactory.ParameterizedExecutableType methodFromUseWithoutTypeArgInference(MethodInvocationTree tree) Returns the same asmethodFromUse(MethodInvocationTree), but without inferred type arguments.- Parameters:
tree- a method invocation tree- Returns:
- the type of the invoked method and any explicit type arguments
-
methodFromUse
protected AnnotatedTypeFactory.ParameterizedExecutableType methodFromUse(MethodInvocationTree tree, boolean inferTypeArgs) The implementation ofmethodFromUse(MethodInvocationTree)andmethodFromUseWithoutTypeArgInference(MethodInvocationTree).- Parameters:
tree- a method invocation treeinferTypeArgs- true if type arguments should be inferred- Returns:
- the type of the invoked method, any explicit type arguments, and if
inferTypeArgsis true, any inferred type arguments
-
methodFromUse
public final AnnotatedTypeFactory.ParameterizedExecutableType methodFromUse(ExpressionTree tree, ExecutableElement methodElt, AnnotatedTypeMirror receiverType) Determines the type of the invoked method based on the passed expression tree, executable element, and receiver type.- Parameters:
tree- either a MethodInvocationTree or a MemberReferenceTreemethodElt- the element of the referenced methodreceiverType- the type of the receiver- Returns:
- the type of the method being invoked with tree and the (inferred) type arguments
- See Also:
-
methodFromUseWithoutTypeArgInference
public final AnnotatedTypeFactory.ParameterizedExecutableType methodFromUseWithoutTypeArgInference(ExpressionTree tree, ExecutableElement methodElt, AnnotatedTypeMirror receiverType) Returns the same asmethodFromUse(ExpressionTree, ExecutableElement, AnnotatedTypeMirror), but without inferred type arguments.- Parameters:
tree- either a MethodInvocationTree or a MemberReferenceTreemethodElt- the element of the referenced methodreceiverType- the type of the receiver- Returns:
- the type of the method being invoked with tree without inferring type arguments
-
methodFromUse
protected AnnotatedTypeFactory.ParameterizedExecutableType methodFromUse(ExpressionTree tree, ExecutableElement methodElt, AnnotatedTypeMirror receiverType, boolean inferTypeArgs) The implementation ofmethodFromUse(ExpressionTree, ExecutableElement, AnnotatedTypeMirror)andmethodFromUseWithoutTypeArgInference(ExpressionTree, ExecutableElement, AnnotatedTypeMirror).- Parameters:
tree- either a MethodInvocationTree or a MemberReferenceTreemethodElt- the element of the referenced methodreceiverType- the type of the receiverinferTypeArgs- true if type arguments should be inferred- Returns:
- the type of the invoked method
-
methodFromUsePreSubstitution
protected void methodFromUsePreSubstitution(ExpressionTree tree, AnnotatedTypeMirror.AnnotatedExecutableType type, boolean resolvePolyQuals) A callback method for the AnnotatedTypeFactory subtypes to customize the handling of the declared method type before type variable substitution.- Parameters:
tree- either a method invocation or a member reference treetype- declared method type before type variable substitutionresolvePolyQuals- if true, resolve polymorphic qualifiers
-
adaptGetClassReturnTypeToReceiver
protected void adaptGetClassReturnTypeToReceiver(AnnotatedTypeMirror.AnnotatedExecutableType getClassType, AnnotatedTypeMirror receiverType, ExpressionTree tree) Java special-cases the return type ofgetClass(). Though the method has a return type ofClass<?>, the compiler special cases this return-type and changes the bound of the type argument to the erasure of the receiver type. For example:x.getClass()has the typeClass< ? extends erasure_of_x >someInteger.getClass()has the typeClass< ? extends Integer >
- Parameters:
getClassType- this must be a type representing a call to Object.getClass otherwise a runtime exception will be thrown. It is modified by side effect.receiverType- the receiver type of the method invocation (not the declared receiver type)tree- getClass method invocation tree
-
getIterableElementType
Returns the element type ofexpression. This is usually the type ofexpression.itertor().next(). Ifexpressionis an array, it is the component type of the array.- Parameters:
expression- an expression whose type is an array or implementsIterable- Returns:
- the type of
expression.itertor().next()or ifexpressionis an array, the component type of the array
-
getIterableElementType
protected AnnotatedTypeMirror getIterableElementType(ExpressionTree expression, AnnotatedTypeMirror iterableType) Returns the element type ofiterableType. This is usually the type ofexpression.itertor().next(). Ifexpressionis an array, it is the component type of the array.- Parameters:
expression- an expression whose type is an array or implementsIterableiterableType- the type of the expression- Returns:
- the type of
expression.itertor().next()or ifexpressionis an array, the component type of the array
-
constructorFromUse
Determines the type of the invoked constructor based on the passed new class tree.The returned method type has all type variables resolved, whether based on receiver type, passed type parameters if any, and constructor invocation parameter.
Subclasses may override this method to customize inference of types or qualifiers based on constructor invocation parameters.
As an implementation detail, this method depends on
AnnotatedTypes.asMemberOf(Types, AnnotatedTypeFactory, AnnotatedTypeMirror, Element), and customization based on receiver type should be in accordance with its specification.The return type is a pair of the type of the invoked constructor and the (inferred) type arguments. Note that neither the explicitly passed nor the inferred type arguments are guaranteed to be subtypes of the corresponding upper bounds. See method
BaseTypeVisitor.checkTypeArguments(com.sun.source.tree.Tree, java.util.List<? extends org.checkerframework.framework.type.AnnotatedTypeParameterBounds>, java.util.List<? extends org.checkerframework.framework.type.AnnotatedTypeMirror>, java.util.List<? extends com.sun.source.tree.Tree>, java.lang.CharSequence, java.util.List<?>)for the checks of type argument well-formedness.Note that "this" and "super" constructor invocations are handled by method
methodFromUse(com.sun.source.tree.MethodInvocationTree). This method only handles constructor invocations in a "new" expression.- Parameters:
tree- the constructor invocation tree- Returns:
- the annotated type of the invoked constructor (as an executable type) and the (inferred) type arguments
-
constructorFromUseWithoutTypeArgInference
public AnnotatedTypeFactory.ParameterizedExecutableType constructorFromUseWithoutTypeArgInference(NewClassTree tree) The same asconstructorFromUse(NewClassTree), but no type arguments are inferred.- Parameters:
tree- the constructor invocation tree- Returns:
- the annotated type of the invoked constructor (as an executable type) and the explicit type arguments
-
getResultingTypeOfConstructorMemberReference
public AnnotatedTypeMirror getResultingTypeOfConstructorMemberReference(MemberReferenceTree memberReferenceTree, AnnotatedTypeMirror.AnnotatedExecutableType constructorType) Gets the type of the resulting constructor call of a MemberReferenceTree.- Parameters:
memberReferenceTree- MemberReferenceTree where the member is a constructorconstructorType- AnnotatedExecutableType of the declaration of the constructor- Returns:
- AnnotatedTypeMirror of the resulting type of the constructor
-
constructorFromUse
protected AnnotatedTypeFactory.ParameterizedExecutableType constructorFromUse(NewClassTree tree, boolean inferTypeArgs) The implementation ofconstructorFromUse(NewClassTree)andconstructorFromUseWithoutTypeArgInference(NewClassTree).- Parameters:
tree- the constructor invocation treeinferTypeArgs- true if the type arguments should be inferred- Returns:
- the annotated type of the invoked constructor (as an executable type) and the type arguments
-
getEnumConstructorQualifiers
Returns the annotations that should be applied to enum constructors. This implementation returns an empty set. Subclasses can override to return a different set.- Returns:
- the annotations that should be applied to enum constructors
-
getExplicitNewClassAnnos
Returns the annotations explicitly written on a NewClassTree.new @HERE Class()- Parameters:
newClassTree- a constructor invocation- Returns:
- the annotations explicitly written on a NewClassTree
-
getExplicitNewClassClassTypeArgs
Returns the partially-annotated explicit class type arguments of the new class tree. TheAnnotatedTypeMirroronly include the annotations explicitly written on the explict type arguments. (IfnewClassuse a diamond operator, this method returns the empty list.) For example, when called withnew MyClass<@HERE String>()this method would return a list containing@HERE String.- Parameters:
newClass- a new class tree- Returns:
- the partially annotated
AnnotatedTypeMirrors for the (explicit) class type arguments of the new class tree
-
constructorFromUsePreSubstitution
protected void constructorFromUsePreSubstitution(NewClassTree tree, AnnotatedTypeMirror.AnnotatedExecutableType type, boolean resolvePolyQuals) A callback method for the AnnotatedTypeFactory subtypes to customize the handling of the declared constructor type before type variable substitution.- Parameters:
tree- a NewClassTree from constructorFromUse()type- declared method type before type variable substitutionresolvePolyQuals- if true, resolve polymorphic qualifiers
-
getMethodReturnType
Returns the return type of the methodm.- Parameters:
m- tree of a method declaration- Returns:
- the return type of the method
-
getMethodReturnType
Returns the return type of the methodmat the return statementr. This implementation just callsgetMethodReturnType(MethodTree), but subclasses may override this method to change the type based on the return statement.- Parameters:
m- tree of a method declarationr- a return statement within methodm- Returns:
- the return type of the method
mat the return statementr
-
getBoxedType
public AnnotatedTypeMirror.AnnotatedDeclaredType getBoxedType(AnnotatedTypeMirror.AnnotatedPrimitiveType type) Returns the annotated boxed type of the given primitive type. The returned type would only have the annotations on the given type.Subclasses may override this method safely to override this behavior.
- Parameters:
type- the primitive type- Returns:
- the boxed declared type of the passed primitive type
-
applyUnboxing
Returns a primitive type: either the argument, or the result of unboxing it (which might affect its annotations).Subclasses should override
getUnboxedType(org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedDeclaredType)rather than this method.- Parameters:
type- a type: a primitive or boxed primitive- Returns:
- the unboxed variant of the type
-
getUnboxedType
public AnnotatedTypeMirror.AnnotatedPrimitiveType getUnboxedType(AnnotatedTypeMirror.AnnotatedDeclaredType type) throws IllegalArgumentException Returns the annotated primitive type of the given declared type if it is a boxed declared type. Otherwise, it throws IllegalArgumentException exception.In the
AnnotatedTypeFactoryimplementation, the returned type has the same primary annotations as the given type. Subclasses may override this behavior.- Parameters:
type- the declared type- Returns:
- the unboxed primitive type
- Throws:
IllegalArgumentException- if the type given has no unbox conversion
-
getStringType
Returns AnnotatedDeclaredType with underlying type String and annotations copied from type. Subclasses may change the annotations.- Parameters:
type- type to convert to String- Returns:
- AnnotatedTypeMirror that results from converting type to a String type
-
getWidenedType
public final AnnotatedTypeMirror getWidenedType(AnnotatedTypeMirror exprType, AnnotatedTypeMirror widenedType) Returns a widened type if applicable, otherwise returns its first argument.Subclasses should override
getWidenedAnnotations(org.checkerframework.javacutil.AnnotationMirrorSet, javax.lang.model.type.TypeKind, javax.lang.model.type.TypeKind)rather than this method.- Parameters:
exprType- type to possibly widenwidenedType- type to possibly widen to; its annotations are ignored- Returns:
- if widening is applicable, the result of converting
typeto the underlying type ofwidenedType; otherwisetype
-
getWidenedType
public final AnnotatedTypeMirror getWidenedType(AnnotationMirrorSet exprAnnos, TypeMirror exprTypeMirror, AnnotatedTypeMirror widenedType) Applies widening if applicable, otherwise returns its first argument.Subclasses should override
getWidenedAnnotations(org.checkerframework.javacutil.AnnotationMirrorSet, javax.lang.model.type.TypeKind, javax.lang.model.type.TypeKind)rather than this method.- Parameters:
exprAnnos- annotations to possibly widenexprTypeMirror- type to possibly widenwidenedType- type to possibly widen to; its annotations are ignored- Returns:
- if widening is applicable, the result of converting
typeto the underlying type ofwidenedType; otherwisetype
-
getNarrowedAnnotations
public AnnotationMirrorSet getNarrowedAnnotations(AnnotationMirrorSet annos, TypeKind typeKind, TypeKind narrowedTypeKind) Returns annotations applicable to typenarrowedTypeKind, that are copied or adapted fromannos.- Parameters:
annos- annotations to narrow, from a primitive or boxed primitivetypeKind- primitive type to narrownarrowedTypeKind- target for the returned annotations; a primitive type that is narrower thantypeKind(in the sense of JLS 5.1.3)- Returns:
- result of converting
annosfromtypeKindtonarrowedTypeKind
-
getWidenedAnnotations
public AnnotationMirrorSet getWidenedAnnotations(AnnotationMirrorSet annos, TypeKind typeKind, TypeKind widenedTypeKind) Returns annotations applicable to typewidenedTypeKind, that are copied or adapted fromannos.- Parameters:
annos- annotations to widen, from a primitive or boxed primitivetypeKind- primitive type to widenwidenedTypeKind- target for the returned annotations; a primitive type that is wider thantypeKind(in the sense of JLS 5.1.2)- Returns:
- result of converting
annosfromtypeKindtowidenedTypeKind
-
binaryTreeArgTypes
public org.plumelib.util.IPair<AnnotatedTypeMirror,AnnotatedTypeMirror> binaryTreeArgTypes(BinaryTree tree) Returns the types of the two arguments to the BinaryTree, accounting for widening and unboxing if applicable.- Parameters:
tree- a binary tree- Returns:
- the types of the two arguments
-
compoundAssignmentTreeArgTypes
public org.plumelib.util.IPair<AnnotatedTypeMirror,AnnotatedTypeMirror> compoundAssignmentTreeArgTypes(CompoundAssignmentTree tree) Returns the types of the two arguments to the CompoundAssignmentTree, accounting for widening and unboxing if applicable.- Parameters:
tree- a compound assignment tree- Returns:
- the types of the two arguments
-
binaryTreeArgTypes
public org.plumelib.util.IPair<AnnotatedTypeMirror,AnnotatedTypeMirror> binaryTreeArgTypes(AnnotatedTypeMirror left, AnnotatedTypeMirror right) Returns the types of the two arguments to a binary operation, accounting for widening and unboxing if applicable.- Parameters:
left- the type of the left argument of a binary operationright- the type of the right argument of a binary operation- Returns:
- the types of the two arguments
-
getNarrowedPrimitive
public AnnotatedTypeMirror.AnnotatedPrimitiveType getNarrowedPrimitive(AnnotatedTypeMirror.AnnotatedPrimitiveType type, TypeMirror narrowedTypeMirror) Returns AnnotatedPrimitiveType with underlying typenarrowedTypeMirrorand with annotations copied or adapted fromtype.Currently this method is called only for primitives that are narrowed at assignments from literal ints, for example,
byte b = 1;. All other narrowing conversions happen at typecasts.- Parameters:
type- type to narrownarrowedTypeMirror- underlying type for the returned type mirror- Returns:
- result of converting
typetonarrowedTypeMirror
-
getAnnotatedType
- See Also:
-
getAnnotatedType
- See Also:
-
getAnnotatedType
- See Also:
-
getAnnotatedType
- See Also:
-
getAnnotatedType
- See Also:
-
getAnnotatedType
- See Also:
-
fromElement
SeefromElement(Element).- See Also:
-
fromElement
SeefromElement(Element).- See Also:
-
isSupportedQualifier
@EnsuresNonNullIf(expression="#1", result=true) public boolean isSupportedQualifier(@Nullable AnnotationMirror a) Returns true if the given annotation is a part of the type system under which this type factory operates. Null is never a supported qualifier; the parameter is nullable to allow the result of canonicalAnnotation to be passed in directly.- Parameters:
a- any annotation- Returns:
- true if that annotation is part of the type system under which this type factory operates, false otherwise
-
isSupportedQualifier
Returns true if the given class is a part of the type system under which this type factory operates.- Parameters:
clazz- annotation class- Returns:
- true if that class is a type qualifier in the type system under which this type factory operates, false otherwise
-
isSupportedQualifier
Returns true if the given class name is a part of the type system under which this type factory operates.- Parameters:
className- fully-qualified annotation class name- Returns:
- true if that class name is a type qualifier in the type system under which this type factory operates, false otherwise
-
addAliasedTypeAnnotation
Adds the annotationaliasClassas an alias for the canonical annotationcanonicalAnnothat will be used by the Checker Framework in the alias's place.By specifying the alias/canonical relationship using this method, the elements of the alias are not preserved when the canonical annotation to use is constructed from the alias. If you want the elements to be copied over as well, use
addAliasedTypeAnnotation(Class, Class, boolean, String...).- Parameters:
aliasClass- the class of the aliased annotationcanonicalAnno- the canonical annotation
-
addAliasedTypeAnnotation
protected void addAliasedTypeAnnotation(@FullyQualifiedName String aliasName, AnnotationMirror canonicalAnno) Adds the annotation, whose fully-qualified name is given byaliasName, as an alias for the canonical annotationcanonicalAnnothat will be used by the Checker Framework in the alias's place.Use this method if the alias class is not necessarily on the classpath at Checker Framework compile and run time. Otherwise, use
addAliasedTypeAnnotation(Class, AnnotationMirror)which prevents the possibility of a typo in the class name.- Parameters:
aliasName- the canonical name of the aliased annotationcanonicalAnno- the canonical annotation
-
addAliasedTypeAnnotation
protected void addAliasedTypeAnnotation(Class<?> aliasClass, Class<?> canonicalClass, boolean copyElements, String... ignorableElements) Adds the annotationaliasClassas an alias for the canonical annotationcanonicalClassthat will be used by the Checker Framework in the alias's place.You may specify the copyElements flag to indicate whether you want the elements of the alias to be copied over when the canonical annotation is constructed as a copy of
canonicalClass. Be careful that the framework will try to copy the elements by name matching, so make sure that names and types of the elements to be copied over are exactly the same as the ones in the canonical annotation. Otherwise, an 'Couldn't find element in annotation' error is raised.To facilitate the cases where some of the elements are ignored on purpose when constructing the canonical annotation, this method also provides a varargs
ignorableElementsfor you to explicitly specify the ignoring rules. For example,org.checkerframework.checker.index.qual.IndexForis an alias oforg.checkerframework.checker.index.qual.NonNegative, but the element "value" of@IndexForshould be ignored when constructing@NonNegative. In the cases where all elements are ignored, we can simply useaddAliasedTypeAnnotation(Class, AnnotationMirror)instead.- Parameters:
aliasClass- the class of the aliased annotationcanonicalClass- the class of the canonical annotationcopyElements- a flag that indicates whether you want to copy the elements over when getting the alias from the canonical annotationignorableElements- a list of elements that can be safely dropped when the elements are being copied over
-
addAliasedTypeAnnotation
protected void addAliasedTypeAnnotation(@FullyQualifiedName String aliasName, Class<?> canonicalAnno, boolean copyElements, String... ignorableElements) Adds the annotation, whose fully-qualified name is given byaliasName, as an alias for the canonical annotationcanonicalAnnothat will be used by the Checker Framework in the alias's place.Use this method if the alias class is not necessarily on the classpath at Checker Framework compile and run time. Otherwise, use
addAliasedTypeAnnotation(Class, Class, boolean, String[])which prevents the possibility of a typo in the class name.- Parameters:
aliasName- the canonical name of the aliased classcanonicalAnno- the canonical annotationcopyElements- a flag that indicates whether we want to copy the elements over when getting the alias from the canonical annotationignorableElements- a list of elements that can be safely dropped when the elements are being copied over
-
canonicalAnnotation
Returns the canonical annotation for the passed annotation. Returns null if the passed annotation is not an alias of a canonical one in the framework.A canonical annotation is the internal annotation that will be used by the Checker Framework in the aliased annotation's place.
- Parameters:
a- the qualifier to check for an alias- Returns:
- the canonical annotation, or null if none exists
-
addAliasedDeclAnnotation
protected void addAliasedDeclAnnotation(Class<? extends Annotation> alias, Class<? extends Annotation> annotationClass, AnnotationMirror annotationToUse) Add the annotationaliasas an alias for the declaration annotationannotation, where the annotation mirrorannotationToUsewill be used instead. If multiple calls are made with the sameannotation, then theannotationToUsemust be the same.The point of
annotationToUseis that it may include elements/fields.- Parameters:
alias- the class of the alias annotationannotationClass- the class of the canonical annotationannotationToUse- the annotation mirror to use
-
addInheritedAnnotation
Adds the annotationannotationin the set of declaration annotations that should be inherited. A declaration annotation will be inherited if it is in this list, or if it has the meta-annotation @InheritedAnnotation. The meta-annotation @InheritedAnnotation should be used instead of this method, if possible. -
toAnnotatedType
A convenience method that converts aTypeMirrorto an emptyAnnotatedTypeMirrorusingAnnotatedTypeMirror.createType(javax.lang.model.type.TypeMirror, org.checkerframework.framework.type.AnnotatedTypeFactory, boolean).- Parameters:
t- theTypeMirrordeclaration- true if the result should be marked as a type declaration- Returns:
- an
AnnotatedTypeMirrorthat hastas its underlying type
-
type
Determines an empty annotated type of the given tree. In other words, finds theTypeMirrorfor the tree and converts that into anAnnotatedTypeMirror, but does not add any annotations to the result.Most users will want to use
getAnnotatedType(Tree)instead; this method is mostly for internal use.- Parameters:
tree- the tree to analyze- Returns:
- the type of
tree, without any annotations
-
declarationFromElement
Gets the declaration tree for the element, if the source is available.TODO: would be nice to move this to InternalUtils/TreeUtils.
- Parameters:
elt- an element- Returns:
- the tree declaration of the element if found
-
isWithinConstructor
Returns true iftreeis within a constructor.- Parameters:
tree- the tree that might be within a constructor- Returns:
- true if
treeis within a constructor
-
setVisitorTreePath
Sets the path to the tree that an external "visitor" is visiting. The visitor is either a subclass ofBaseTypeVisitororCFAbstractTransfer.- Parameters:
visitorTreePath- path to the current tree that an external "visitor" is visiting
-
getVisitorTreePath
Returns the path to the tree that an external "visitor" is visiting. The type factory does not update this value as it computes the types of any tree or element needed compute the type of the tree being visited. Therefore this path may not be the path to the tree whose type is being computed. This method should not be used directly. UsegetPath(Tree)instead.This method is used to save the previous tree path and to give a hint to
getPath(Tree)on where to look for a tree rather than searching starting at the root.- Returns:
- the path to the tree that an external "visitor" is visiting
-
getPath
Gets the path for the givenTreeunder the current root by checking from the visitor's current path, and usingTrees.getPath(CompilationUnitTree, Tree)(which is much slower) only iftreeis not found on the current path.Note that the given Tree has to be within the current compilation unit, otherwise null will be returned.
Within a subclass of BaseTypeVisitor, use
getCurrentPath()rather than this method.- Parameters:
tree- theTreeto get the path for- Returns:
- the path for
treeunder the current root. Returns null iftreeis not within the current compilation unit.
-
getEnclosingElementForArtificialTree
-
setEnclosingElementForArtificialTree
Adds the given mapping from a synthetic (generated) tree to its enclosing element.See
org.checkerframework.framework.flow.CFCFGBuilder.CFCFGTranslationPhaseOne.handleArtificialTree(Tree).- Parameters:
tree- artifical treeenclosing- element that enclosestree
-
parseAnnotationFiles
protected void parseAnnotationFiles()Parses all annotation files in the following order:- jdk.astub in the same directory as the checker, if it exists and ignorejdkastub option is not supplied
- jdkN.astub (where N is the Java version or any higher value) in the same directory as the checker, if it exists and ignorejdkastub option is not supplied
- Stub files listed in @StubFiles annotation on the checker; must be in same directory as the checker
- Stub files provided via
-Astubscompiler option - Ajava files provided via
-Aajavacompiler option
If a type is annotated with a qualifier from the same hierarchy in more than one stub file, the qualifier in the last stub file is applied.
The annotations are stored by side-effecting
stubTypesandajavaTypes. -
getDeclAnnotation
Returns all of the declaration annotations whose name equals the passed annotation class (or is an alias for it) including annotations:- on the element
- written in stubfiles
- inherited from overridden methods, (see
InheritedAnnotation) - inherited from superclasses or super interfaces (see
Inherited)
- Specified by:
getDeclAnnotationin interfaceAnnotationProvider- Parameters:
elt- the element to retrieve the declaration annotation fromannoClass- annotation class- Returns:
- the annotation mirror for annoClass
- See Also:
-
getDeclAnnotationNoAliases
public final @Nullable AnnotationMirror getDeclAnnotationNoAliases(Element elt, Class<? extends Annotation> annoClass) Returns the annotation mirror used to annotate this element, whose name equals the passed annotation class. Looks in the same places specified bygetDeclAnnotation(Element, Class). Returns null if none exists. Does not check for aliases of the annotation class.Call this method from a checker that needs to alias annotations for one purpose and not for another. For example, in the Lock Checker,
@LockingFreeand@ReleasesNoLocksare both aliases of@SideEffectFreesince they are all considered side-effect-free with regard to the set of locks held before and after the method call. However, asynchronizedblock is permitted inside a@ReleasesNoLocksmethod but not inside a@LockingFreeor@SideEffectFreemethod.- Parameters:
elt- the element to retrieve the declaration annotation fromannoClass- annotation class- Returns:
- the annotation mirror for annoClass
- See Also:
-
isFromStubFile
Returns true if the element appears in a stub file (Currently only works for methods, constructors, and fields). -
isFromByteCode
Returns true if the element is from bytecode and the if the element did not appear in a stub file. Currently only works for methods, constructors, and fields. -
shouldWarnIfStubRedundantWithBytecode
public boolean shouldWarnIfStubRedundantWithBytecode()Returns true if redundancy between a stub file and bytecode should be reported.For most type systems the default behavior of returning true is correct. For subcheckers, redundancy in one of the type hierarchies can be ok. Such implementations should return false.
- Returns:
- true if to warn about redundancy between a stub file and bytecode
-
getDeclAnnotations
Returns all of the declaration annotations on this element including annotations:- on the element
- written in stubfiles
- inherited from overridden methods, (see
InheritedAnnotation) - inherited from superclasses or super interfaces (see
Inherited)
This method returns the actual annotations not their aliases.
getDeclAnnotation(Element, Class)returns aliases.- Parameters:
elt- the element for which to determine annotations- Returns:
- all of the declaration annotations on this element, written in stub files, or inherited
-
getDeclAnnotationWithMetaAnnotation
public List<org.plumelib.util.IPair<AnnotationMirror,AnnotationMirror>> getDeclAnnotationWithMetaAnnotation(Element element, Class<? extends Annotation> metaAnnotationClass) Returns a list of all declaration annotations used to annotate the element, which have a meta-annotation (i.e., an annotation on that annotation) with classmetaAnnotationClass.- Parameters:
element- the element for which to determine annotationsmetaAnnotationClass- the class of the meta-annotation that needs to be present- Returns:
- a list of pairs
(anno, metaAnno)whereannois the annotation mirror atelement, andmetaAnnois the annotation mirror (of typemetaAnnotationClass) used to meta-annotate the declaration ofanno
-
getAnnotationWithMetaAnnotation
public List<org.plumelib.util.IPair<AnnotationMirror,AnnotationMirror>> getAnnotationWithMetaAnnotation(Element element, Class<? extends Annotation> metaAnnotationClass) Returns a list of all annotations used to annotate this element, which have a meta-annotation (i.e., an annotation on that annotation) with classmetaAnnotationClass.- Parameters:
element- the element at which to look for annotationsmetaAnnotationClass- the class of the meta-annotation that needs to be present- Returns:
- a list of pairs
(anno, metaAnno)whereannois the annotation mirror atelement, andmetaAnnois the annotation mirror used to annotateanno.
-
hasQualifierParameterInHierarchy
public boolean hasQualifierParameterInHierarchy(AnnotatedTypeMirror annotatedTypeMirror, AnnotationMirror top) Returns true if theannotatedTypeMirrorhas a qualifier parameter.- Parameters:
annotatedTypeMirror- the type to checktop- the top of the hierarchy to check- Returns:
- true if the type has a qualifier parameter
-
hasQualifierParameterInHierarchy
Returns true if theelementhas a qualifier parameter.- Parameters:
element- element to checktop- the top of the hierarchy to check- Returns:
- true if the type has a qualifier parameter
-
hasExplicitQualifierParameterInHierarchy
Returns true if theHasQualifierParameterannotation was explicitly written onelementfor the hierarchy given bytop.- Parameters:
element- the Element to checktop- the top qualifier for the hierarchy to check- Returns:
- true if the class given by
elementhas been explicitly annotated withHasQualifierParameterfor the given hierarchy
-
hasExplicitNoQualifierParameterInHierarchy
Returns true if theNoQualifierParameterannotation was explicitly written onelementfor the hierarchy given bytop.- Parameters:
element- the Element to checktop- the top qualifier for the hierarchy to check- Returns:
- true if the class given by
elementhas been explicitly annotated withNoQualifierParameterfor the given hierarchy
-
getQualifierParameterHierarchies
Returns the set of top annotations representing all the hierarchies for which this type has a qualifier parameter.- Parameters:
annotatedType- the type to check- Returns:
- the set of top annotations representing all the hierarchies for which this type has a qualifier parameter
-
getQualifierParameterHierarchies
Returns the set of top annotations representing all the hierarchies for which this element has a qualifier parameter.- Parameters:
element- the Element to check- Returns:
- the set of top annotations representing all the hierarchies for which this element has a qualifier parameter
-
replaceAnnotations
Replaces or adds all annotations fromfromtoto. Annotations fromfromwill be used everywhere they exist, but annotations intowill be kept anywhere thatfromis unannotated.- Parameters:
from- the annotated type mirror from which to take new annotationsto- the annotated type mirror to which the annotations will be added
-
replaceAnnotations
public void replaceAnnotations(AnnotatedTypeMirror from, AnnotatedTypeMirror to, AnnotationMirror top) Replaces or adds annotations intop's hierarchy fromfromtoto. Annotations fromfromwill be used everywhere they exist, but annotations intowill be kept anywhere thatfromis unannotated.- Parameters:
from- the annotated type mirror from which to take new annotationsto- the annotated type mirror to which the annotations will be addedtop- the top type of the hierarchy whose annotations will be added
-
containsCapturedTypes
Returns true iftypecontains any captured type variables.- Parameters:
type- type to check- Returns:
- true if
typecontains any captured type variables
-
getFunctionTypeFromTree
public AnnotatedTypeMirror.AnnotatedExecutableType getFunctionTypeFromTree(MemberReferenceTree tree) Returns the function type that this member reference targets.The function type is the type of the single method declared in the functional interface adapted as if it were invoked using the functional interface as the receiver expression.
The target type of a member reference is the type to which it is assigned or casted.
- Parameters:
tree- member reference tree- Returns:
- the function type that this method reference targets
-
getFunctionTypeFromTree
public AnnotatedTypeMirror.AnnotatedExecutableType getFunctionTypeFromTree(LambdaExpressionTree tree) Returns the function type that this lambda targets.The function type is the type of the single method declared in the functional interface adapted as if it were invoked using the functional interface as the receiver expression.
The target type of a lambda is the type to which it is assigned or casted.
- Parameters:
tree- lambda expression tree- Returns:
- the function type that this lambda targets
-
getFnInterfaceFromTree
public org.plumelib.util.IPair<AnnotatedTypeMirror,AnnotatedTypeMirror.AnnotatedExecutableType> getFnInterfaceFromTree(Tree tree) Returns the functional interface and the function type that this lambda or member references targets.The function type is the type of the single method declared in the functional interface adapted as if it were invoked using the functional interface as the receiver expression.
The target type of a lambda or a method reference is the type to which it is assigned or casted.
- Parameters:
tree- lambda expression tree or member reference tree- Returns:
- the functional interface and the function type that this method reference or lambda targets
-
applyCaptureConversion
Apply capture conversion totypeToCapture.Capture conversion is the process of converting wildcards in a parameterized type to fresh type variables. See JLS 5.1.10 for details.
If
typeis not a declared type or if it does not have any wildcard type arguments, this method returnstype.- Parameters:
typeToCapture- type to capture- Returns:
- the result of applying capture conversion to
typeToCapture
-
applyCaptureConversion
Apply capture conversion totype.Capture conversion is the process of converting wildcards in a parameterized type to fresh type variables. See JLS 5.1.10 for details.
If
typeis not a declared type or if it does not have any wildcard type arguments, this method returnstype.- Parameters:
type- type to capturetypeMirror- the result of applying capture conversion to the underlying type oftype; it is used as the underlying type of the returned type- Returns:
- the result of applying capture conversion to
type
-
order
public List<AnnotatedTypeMirror.AnnotatedTypeVariable> order(Collection<AnnotatedTypeMirror.AnnotatedTypeVariable> collection) Returns the list of type variables such that a type variable in the list only references type variables at a lower index than itself.- Parameters:
collection- a collection of type variables- Returns:
- the type variables ordered so that each type variable only references earlier type variables
-
getElementUtils
Returns the utility class for working withElements.- Returns:
- the utility class for working with
Elements
-
getTreeUtils
Accessor for the tree utilities. -
getProcessingEnv
Accessor for the processing environment.- Returns:
- the processing environment
-
getExpressionAndOffset
Given an expression, split it into a subexpression and a constant offset. For example:
There are methods that can only take as input an expression that represents a JavaExpression. The purpose of this is to pre-process expressions to make those methods more likely to succeed."a" => <"a", "0"> "a + 5" => <"a", "5"> "a + -5" => <"a", "-5"> "a - 5" => <"a", "-5">- Parameters:
expression- an expression to remove a constant offset from- Returns:
- a sub-expression and a constant offset. The offset is "0" if this routine is unable to splite the given expression
-
negateConstant
Given an expression string, returns its negation.- Parameters:
constantExpression- a string representing an integer constant- Returns:
- the negation of constantExpression
-
getDummyAssignedTo
Returnsnullor an annotated type mirror that type argument inference should assumeexpressionTreeis assigned to.If
nullis returned, inference proceeds normally.If a type is returned, then inference assumes that
expressionTreewas asigned to it. This biases the inference algorithm toward the annotations in the returned type. In particular, if the annotations on type variables in invariant positions are a super type of the annotations inferred, the super type annotations are chosen.This implementation returns null, but subclasses may override this method to return a type.
- Parameters:
expressionTree- an expression which has no assignment context and for which type arguments need to be inferred- Returns:
nullor an annotated type mirror that inferrence should pretendexpressionTreeis assigned to
-
areSameByClass
Checks that the annotationamhas the name ofannoClass. Values are ignored.In the end, all annotation comparisons are by name. This method is faster than
AnnotationUtils.areSameByClass(AnnotationMirror, Class)because it caches the name ofannoClassrather than computing it on each invocation of this method.- Parameters:
am- the AnnotationMirror whose class to compareannoClass- the class to compare- Returns:
- true if annoclass is the class of am
-
containsSameByClass
public boolean containsSameByClass(Collection<? extends AnnotationMirror> c, Class<? extends Annotation> annoClass) Checks that the collection contains the annotation. UsingCollection.containsdoes not always work, because it does not useAnnotationUtils.areSame(javax.lang.model.element.AnnotationMirror, javax.lang.model.element.AnnotationMirror)for comparison.In the end, all annotation comparisons are by name. This method is faster than
AnnotationUtils.containsSameByClass(Collection, Class)because it (actually, its callee) caches the name ofannoClassrather than computing it each time.- Parameters:
c- a collection of AnnotationMirrorsannoClass- the annotation class to search for in c- Returns:
- true iff c contains an annotation of class annoClass, according to
areSameByClass(javax.lang.model.element.AnnotationMirror, java.lang.Class<? extends java.lang.annotation.Annotation>)
-
getAnnotationByClass
public @Nullable AnnotationMirror getAnnotationByClass(Collection<? extends AnnotationMirror> c, Class<? extends Annotation> annoClass) Returns the AnnotationMirror incthat has classannoClass.This method is faster than
AnnotationUtils.getAnnotationByClass(Collection, Class)because it (actually, its callee) caches the name of the class rather than computing it each time.- Parameters:
c- a collection of AnnotationMirrorsannoClass- the class to search for in c- Returns:
- an AnnotationMirror with class
annoClassiff c contains one, according to areSameByClass; otherwise,null
-
wpiAdjustForUpdateField
public void wpiAdjustForUpdateField(Tree lhsTree, Element element, String fieldName, AnnotatedTypeMirror rhsATM) Changes the type ofrhsATMwhen being assigned to a field, for use by whole-program inference. The default implementation does nothing.- Parameters:
lhsTree- the tree for the field whose type will be changedelement- the element for the field whose type will be changedfieldName- the name of the field whose type will be changedrhsATM- the type of the expression being assigned to the field, which is side-effected by this method
-
wpiAdjustForUpdateNonField
Changes the type ofrhsATMwhen being assigned to anything other than a field, for use by whole-program inference. The default implementation does nothing.- Parameters:
rhsATM- the type of the rhs of the pseudo-assignment, which is side-effected by this method
-
wpiShouldInferTypesForReceivers
public boolean wpiShouldInferTypesForReceivers()Returns true if whole-program inference should infer types for receiver expressions. For some type systems, such as nullness, it doesn't make sense for WPI to do inference on receivers.- Returns:
- true if WPI should infer types for method receiver parameters, false otherwise
-
wpiPrepareMethodForWriting
Side-effects the method or constructor annotations to make any desired changes before writing to an annotation file.- Parameters:
className- the class that contains the method, for diagnostics onlymethodAnnos- the method or constructor annotations to modify
-
wpiPrepareMethodForWriting
public void wpiPrepareMethodForWriting(WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos methodAnnos, Collection<WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos> inSupertypes, Collection<WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos> inSubtypes) Side-effects the method or constructor annotations to make any desired changes before writing to an ajava file.Overriding implementations should call
super.wpiPrepareMethodForWriting().- Parameters:
methodAnnos- the method or constructor annotations to modifyinSupertypes- the method or constructor annotations for all overridden methods; not side-effectedinSubtypes- the method or constructor annotations for all overriding methods; not side-effected
-
makeConditionConsistentWithOtherMethod
protected void makeConditionConsistentWithOtherMethod(String methodName, String otherMethodName, String className, String otherClassName, Map<String, WholeProgramInferenceJavaParserStorage.InferredDeclared> conditionMap, WholeProgramInferenceJavaParserStorage.CallableDeclarationAnnos otherDeclAnnos, boolean isPrecondition, boolean otherIsSupertype) Performs side effects to makeconditionMapobey behavioral subtyping constraints withotherDeclAnnos, that is, postconditions must be at least as strong as the postcondition on the superclass, and preconditions must be at most as strong as the condition on the superclass.Overriding implementations should call
super.makeConditionConsistentWithOtherMethod().- Parameters:
methodName- the method name, for diagnostics onlyotherMethodName- the other method name, for diagnostics onlyclassName- the class containing the methodotherClassName- the class containing the other method, for diagnostics onlyconditionMap- pre- or post-condition annotations on a method M; may be side-effectedotherDeclAnnos- annotations on a method that M overrides or that overrides M; that is, on a method in the same "method family" as M; may be side-effectedisPrecondition- true if the annotations are pre-condition annotations, false if they are post-condition annotationsotherIsSupertype- true ifotherDeclAnnosare on a supertype; false if they are on a subtype
-
doesAnnotatedForApplyToThisChecker
DoesannotatedForAnno, which is anAnnotatedForannotation, apply to this checker?- Parameters:
annotatedForAnno- anAnnotatedForannotation- Returns:
- true if
annotatedForAnnoapplies to this checker
-
getContractExpressions
Returns theexpressionfield/element of the given contract annotation.- Parameters:
contractAnno- aRequiresQualifier,EnsuresQualifier, orEnsuresQualifier- Returns:
- the
expressionfield/element of the given annotation
-
getContractListValues
Returns thevaluefield/element of the given contract list annotation.- Parameters:
contractListAnno- aRequiresQualifier.List,EnsuresQualifier.List, orEnsuresQualifierIf.List- Returns:
- the
valuefield/element of the given annotation
-
isImmutable
Returns true if the type is immutable. Subclasses can override this method to add types that are mutable, but the annotated type of an object is immutable.- Parameters:
type- type to test- Returns:
- true if the type is immutable
-
isSideEffectFree
Description copied from interface:AnnotationProviderReturns true if the given method is side-effect-free according to this AnnotationProvider — that is, if a call to the given method does not undo flow-sensitive type refinement.Note that this method takes account of this AnnotationProvider's semantics, whereas
org.checkerframework.dataflow.util.PurityUtils#isSideEffectFreedoes not.- Specified by:
isSideEffectFreein interfaceAnnotationProvider- Parameters:
methodElement- a method- Returns:
- true if a call to the method does not undo flow-sensitive type refinement
-
isDeterministic
Description copied from interface:AnnotationProviderReturns true if the given method is deterministic according to this AnnotationProvider — that is, if multiple calls to the given method (with the same arguments) return the same value.Note that this method takes account of this AnnotationProvider's semantics, whereas
org.checkerframework.dataflow.util.PurityUtils#isDeterministicdoes not.- Specified by:
isDeterministicin interfaceAnnotationProvider- Parameters:
methodElement- a method- Returns:
- true if multiple calls to the method (with the same arguments) return the same value
-
logGat
Output a message aboutgetAnnotatedType(javax.lang.model.element.Element), if logging is on.Set the value of
debugGatto true to enable logging.Any
Treearguments will be formatted usingTreeUtils.toStringTruncated(Tree, int)at a maximum length of 60.- Parameters:
format- a format stringargs- arguments to the format string
-