Class BaseTypeValidator
- All Implemented Interfaces:
TypeValidator
,AnnotatedTypeVisitor<Void,
Tree>
- Direct Known Subclasses:
ReportVisitor.ReportTypeValidator
The validator is called on the type of every expression, such as on the right-hand side of
x = Optional.of(Optional.of("baz"));
. However, note that the type of the right-hand side
is Optional<? extends Object>
, not Optional<Optional<String>>
.
Note: A TypeValidator (this class and its subclasses) cannot tell whether an annotation was
written by a programmer or defaulted/inferred/computed by the Checker Framework, because the
AnnotatedTypeMirror does not make distinctions about which annotations in an AnnotatedTypeMirror
were explicitly written and which were added by a checker. To issue a warning/error only when a
programmer writes an annotation, override BaseTypeVisitor.visitAnnotatedType(com.sun.source.tree.AnnotatedTypeTree, java.lang.Void)
and BaseTypeVisitor.visitVariable(com.sun.source.tree.VariableTree, java.lang.Void)
.
-
Nested Class Summary
Nested classes/interfaces inherited from class org.checkerframework.framework.type.visitor.AnnotatedTypeScanner
AnnotatedTypeScanner.Reduce<R>
-
Field Summary
Modifier and TypeFieldDescriptionprotected final AnnotatedTypeFactory
AnnotatedTypeFactory.protected final BaseTypeChecker
BaseTypeChecker.protected boolean
Should the primary annotation on the top level type be checked?protected boolean
Is the type valid? This is side-effected by the visitor, and read at the end of visiting.protected final QualifierHierarchy
The qualifer hierarchy.protected final BaseTypeVisitor<?>
BaseTypeVisitor.Fields inherited from class org.checkerframework.framework.type.visitor.AnnotatedTypeScanner
defaultResult, reduceFunction, visitedNodes
-
Constructor Summary
ConstructorDescriptionBaseTypeValidator
(BaseTypeChecker checker, BaseTypeVisitor<?> visitor, AnnotatedTypeFactory atypeFactory) -
Method Summary
Modifier and TypeMethodDescriptionboolean
areBoundsValid
(AnnotatedTypeMirror upperBound, AnnotatedTypeMirror lowerBound) Returns true if the effective annotations on the upperBound are above (or equal to) those on the lowerBound.protected List<DiagMessage>
isTopLevelValidType
(QualifierHierarchy qualHierarchy, AnnotatedTypeMirror type) Checks every property listed inisValidStructurally(org.checkerframework.framework.type.QualifierHierarchy, org.checkerframework.framework.type.AnnotatedTypeMirror)
, but only for the top level type.boolean
isValid
(AnnotatedTypeMirror type, Tree tree) Validate the type against the given tree.protected List<DiagMessage>
isValidStructurally
(QualifierHierarchy qualHierarchy, AnnotatedTypeMirror type) Performs some well-formedness checks on the givenAnnotatedTypeMirror
.protected void
Report an "annotations.on.use" error for the given type and tree.protected void
reportInvalidBounds
(AnnotatedTypeMirror type, Tree tree) Most errors reported by this class are of the form type.invalid.protected void
reportInvalidType
(AnnotatedTypeMirror type, Tree p) protected void
reportValidityResult
(@CompilerMessageKey String errorType, AnnotatedTypeMirror type, Tree p) protected void
reportValidityResultOnUnannotatedType
(@CompilerMessageKey String errorType, AnnotatedTypeMirror type, Tree p) LikereportValidityResult(java.lang.String, org.checkerframework.framework.type.AnnotatedTypeMirror, com.sun.source.tree.Tree)
, but the type is printed in the error message without annotations.protected boolean
Should the top-level declared or primitive type be checked?visitArray
(AnnotatedTypeMirror.AnnotatedArrayType type, Tree tree) Visits an array type.protected void
Visits the type parameters of a class tree.Visits a declared type.protected Void
Checks that the annotations on the type arguments supplied to a type or a method invocation are within the bounds of the type variables as declared, and issues the "type.argument" error if they are not.Visits a primitive type.protected void
visitTypeParameterBounds
(AnnotatedTypeMirror.AnnotatedTypeVariable typeParameter, TypeParameterTree typeParameterTree) Visits type parameter bounds.Visits a type variable.Visits a wildcard type.Methods inherited from class org.checkerframework.framework.type.visitor.AnnotatedTypeScanner
reduce, reset, scan, scan, scanAndReduce, scanAndReduce, visit, visit, visitExecutable, visitIntersection, visitNoType, visitNull, visitUnion
-
Field Details
-
isValid
protected boolean isValidIs the type valid? This is side-effected by the visitor, and read at the end of visiting. -
checkTopLevelDeclaredOrPrimitiveType
protected boolean checkTopLevelDeclaredOrPrimitiveTypeShould the primary annotation on the top level type be checked? -
checker
BaseTypeChecker. -
visitor
BaseTypeVisitor. -
atypeFactory
AnnotatedTypeFactory. -
qualHierarchy
The qualifer hierarchy.
-
-
Constructor Details
-
BaseTypeValidator
public BaseTypeValidator(BaseTypeChecker checker, BaseTypeVisitor<?> visitor, AnnotatedTypeFactory atypeFactory)
-
-
Method Details
-
isValid
Validate the type against the given tree. This method both issues error messages and also returns a boolean value.This is the entry point to the type validator. Neither this method nor visit should be called directly by a visitor, only use
BaseTypeVisitor.validateTypeOf(Tree)
.This method is only called on top-level types, but it validates the entire type including components of a compound type. Subclasses should override this only if there is special-case behavior that should be performed only on top-level types.
- Specified by:
isValid
in interfaceTypeValidator
- Parameters:
type
- the type to validatetree
- the tree from which the type originated. If the tree is a method tree,type
is its return type. If the tree is a variable tree,type
is the variable's type.- Returns:
- true if the type is valid
-
shouldCheckTopLevelDeclaredOrPrimitiveType
Should the top-level declared or primitive type be checked?If
type
is not a declared or primitive type, then this method returns true.Top-level type is not checked if tree is a local variable or an expression tree.
- Parameters:
type
- the AnnotatedTypeMirror being validatedtree
- a Tree whose type istype
- Returns:
- whether or not the top-level type should be checked, if
type
is a declared or primitive type.
-
isValidStructurally
protected List<DiagMessage> isValidStructurally(QualifierHierarchy qualHierarchy, AnnotatedTypeMirror type) Performs some well-formedness checks on the givenAnnotatedTypeMirror
. Returns a list of failures. If successful, returns an empty list. The method will never return failures for a valid type, but might not catch all invalid types.This method ensures that the type is structurally or lexically well-formed, but it does not check whether the annotations are semantically sensible. Subclasses should generally override visit methods such as
visitDeclared(org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedDeclaredType, com.sun.source.tree.Tree)
rather than this method.Currently, this implementation checks the following (subclasses can extend this behavior):
- There should not be multiple annotations from the same qualifier hierarchy.
- There should not be more annotations than the width of the QualifierHierarchy.
- If the type is not a type variable, then the number of annotations should be the same as the width of the QualifierHierarchy.
- These properties should also hold recursively for component types of arrays and for bounds of type variables and wildcards.
- Parameters:
qualHierarchy
- the QualifierHierarchytype
- the type to test- Returns:
- list of reasons the type is invalid, or empty list if the type is valid
-
isTopLevelValidType
protected List<DiagMessage> isTopLevelValidType(QualifierHierarchy qualHierarchy, AnnotatedTypeMirror type) Checks every property listed inisValidStructurally(org.checkerframework.framework.type.QualifierHierarchy, org.checkerframework.framework.type.AnnotatedTypeMirror)
, but only for the top level type. If successful, returns an empty list. If not successful, returns diagnostics.- Parameters:
qualHierarchy
- the QualifierHierarchytype
- the type to be checked- Returns:
- the diagnostics indicating failure, or an empty list if successful
-
reportValidityResult
protected void reportValidityResult(@CompilerMessageKey String errorType, AnnotatedTypeMirror type, Tree p) -
reportValidityResultOnUnannotatedType
protected void reportValidityResultOnUnannotatedType(@CompilerMessageKey String errorType, AnnotatedTypeMirror type, Tree p) LikereportValidityResult(java.lang.String, org.checkerframework.framework.type.AnnotatedTypeMirror, com.sun.source.tree.Tree)
, but the type is printed in the error message without annotations. This method would print "annotation @NonNull is not permitted on type int", whereasreportValidityResult(java.lang.String, org.checkerframework.framework.type.AnnotatedTypeMirror, com.sun.source.tree.Tree)
would print "annotation @NonNull is not permitted on type @NonNull int". In addition, when the underlying type is a compound type such as@Bad List<String>
, the erased type will be used, i.e., "List
" will print instead of "@Bad List<String>
". -
reportInvalidBounds
Most errors reported by this class are of the form type.invalid. This method reports when the bounds of a wildcard or type variable don't make sense. Bounds make sense when the effective annotations on the upper bound are supertypes of those on the lower bounds for all hierarchies. To ensure that this subtlety is not lost on users, we report "bound" and print the bounds along with the invalid type rather than a "type.invalid".- Parameters:
type
- the type with invalid boundstree
- where to report the error
-
reportInvalidType
-
reportInvalidAnnotationsOnUse
Report an "annotations.on.use" error for the given type and tree.- Parameters:
type
- the type with invalid annotationsp
- the tree where to report the error
-
visitDeclared
Description copied from interface:AnnotatedTypeVisitor
Visits a declared type.- Specified by:
visitDeclared
in interfaceAnnotatedTypeVisitor<Void,
Tree> - Overrides:
visitDeclared
in classAnnotatedTypeScanner<Void,
Tree> - Parameters:
type
- the type to visittree
- a visitor-specified parameter- Returns:
- a visitor-specified result
-
visitClassTypeParameters
protected void visitClassTypeParameters(AnnotatedTypeMirror.AnnotatedDeclaredType type, ClassTree tree) Visits the type parameters of a class tree.- Parameters:
type
- type oftree
tree
- a class tree
-
visitTypeParameterBounds
protected void visitTypeParameterBounds(AnnotatedTypeMirror.AnnotatedTypeVariable typeParameter, TypeParameterTree typeParameterTree) Visits type parameter bounds.- Parameters:
typeParameter
- type oftypeParameterTree
typeParameterTree
- a type parameter tree
-
visitPrimitive
Description copied from interface:AnnotatedTypeVisitor
Visits a primitive type.- Specified by:
visitPrimitive
in interfaceAnnotatedTypeVisitor<Void,
Tree> - Overrides:
visitPrimitive
in classAnnotatedTypeScanner<Void,
Tree> - Parameters:
type
- the type to visittree
- a visitor-specified parameter- Returns:
- a visitor-specified result
-
visitArray
Description copied from interface:AnnotatedTypeVisitor
Visits an array type.- Specified by:
visitArray
in interfaceAnnotatedTypeVisitor<Void,
Tree> - Overrides:
visitArray
in classAnnotatedTypeScanner<Void,
Tree> - Parameters:
type
- the type to visittree
- a visitor-specified parameter- Returns:
- a visitor-specified result
-
visitParameterizedType
protected Void visitParameterizedType(AnnotatedTypeMirror.AnnotatedDeclaredType type, ParameterizedTypeTree tree) Checks that the annotations on the type arguments supplied to a type or a method invocation are within the bounds of the type variables as declared, and issues the "type.argument" error if they are not.- Parameters:
type
- the type to checktree
- the type's tree
-
visitTypeVariable
Description copied from interface:AnnotatedTypeVisitor
Visits a type variable.- Specified by:
visitTypeVariable
in interfaceAnnotatedTypeVisitor<Void,
Tree> - Overrides:
visitTypeVariable
in classAnnotatedTypeScanner<Void,
Tree> - Parameters:
type
- the type to visittree
- a visitor-specified parameter- Returns:
- a visitor-specified result
-
visitWildcard
Description copied from interface:AnnotatedTypeVisitor
Visits a wildcard type.- Specified by:
visitWildcard
in interfaceAnnotatedTypeVisitor<Void,
Tree> - Overrides:
visitWildcard
in classAnnotatedTypeScanner<Void,
Tree> - Parameters:
type
- the type to visittree
- a visitor-specified parameter- Returns:
- a visitor-specified result
-
areBoundsValid
Returns true if the effective annotations on the upperBound are above (or equal to) those on the lowerBound.- Parameters:
upperBound
- the upper bound to checklowerBound
- the lower bound to check- Returns:
- true if the effective annotations on the upperBound are above (or equal to) those on the lowerBound
-