Class OptionalVisitor
- All Implemented Interfaces:
TreeVisitor<Void,Void>
- See the Checker Framework Manual:
- Optional Checker
-
Nested Class Summary
Nested classes/interfaces inherited from class org.checkerframework.common.basetype.BaseTypeVisitor
BaseTypeVisitor.OverrideChecker -
Field Summary
Fields inherited from class org.checkerframework.common.basetype.BaseTypeVisitor
assumePureGetters, atypeFactory, checker, DETERMINISTIC, IMPURE, methodTree, positions, PURE, qualHierarchy, showchecks, SIDE_EFFECT_FREE, TARGET, targetValueElement, typeHierarchy, typeValidator, unusedWhenElementFields inherited from class org.checkerframework.framework.source.SourceVisitor
elements, root, trees, treesWithSuppressWarnings, types -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected booleancommonAssignmentCheck(AnnotatedTypeMirror varType, ExpressionTree valueExpTree, @CompilerMessageKey String errorKey, Object... extraArgs) Checks the validity of an assignment (or pseudo-assignment) from a value to a variable and emits an error message (through the compiler's messaging interface) if it is not valid.protected BaseTypeValidatorvoidPart of rule #3.voidRule #4.voidPartial support for Rule #5 and Rule #7.voidPart of rule #3.static StatementTreeskipBlocks(StatementTree tree) If the given tree is a block tree with a single element, return the enclosed non-block statement.visitBinary(BinaryTree tree, Void p) If the computation of the type of the ConditionalExpressionTree in org.checkerframework.framework.type.TypeFromTree.TypeFromExpression.visitConditionalExpression(ConditionalExpressionTree, AnnotatedTypeFactory) is correct, the following checks are redundant.visitMemberReference(MemberReferenceTree tree, Void p) Performs a method invocation check.visitVariable(VariableTree tree, Void p) Rule #6 (partial).Methods inherited from class org.checkerframework.common.basetype.BaseTypeVisitor
checkAccess, checkAccessAllowed, checkArguments, checkArrayInitialization, checkConditionalPostcondition, checkConstructorInvocation, checkConstructorResult, checkContract, checkDefaultConstructor, checkExceptionParameter, checkExplicitAnnotationsOnIntersectionBounds, checkExtendsAndImplements, checkExtendsOrImplements, checkFieldInvariantDeclarations, checkForPolymorphicQualifiers, checkForPolymorphicQualifiers, checkMethodInvocability, checkMethodReferenceAsOverride, checkOverride, checkOverride, checkPostcondition, checkPreconditions, checkPurity, checkQualifierParameter, checkSuperConstructorCall, checkThisConstructorCall, checkThisOrSuperConstructorCall, checkThrownExpression, checkTypeArguments, checkTypecastRedundancy, checkTypecastSafety, checkVarargs, commonAssignmentCheck, commonAssignmentCheck, commonAssignmentCheckEndDiagnostic, commonAssignmentCheckEndDiagnostic, commonAssignmentCheckStartDiagnostic, contractExpressionAndType, createOverrideChecker, createTypeFactory, createTypeFactoryPublic, enclosingMemberSelect, enclosingStatement, getExceptionParameterLowerBoundAnnotations, getThrowUpperBoundAnnotations, getTypeFactory, isTypeCastSafe, isValidUse, isValidUse, isValidUse, processClassTree, reportMethodInvocabilityError, reportPurityErrors, scan, setRoot, shouldPerformContractInference, shouldSkipUses, shouldWarnAboutIrrelevantJavaTypes, skipReceiverSubtypeCheck, testAnnotationInsertion, testJointJavacJavaParserVisitor, testTypevarContainment, typeCheckVectorCopyIntoArgument, validateType, validateTypeOf, visitAnnotatedType, visitAnnotatedType, visitAnnotation, visitAssignment, visitCatch, visitClass, visitCompilationUnit, visitCompoundAssignment, visitEnhancedForLoop, visitIdentifier, visitInstanceOf, visitLambdaExpression, visitMethod, visitNewArray, visitNewClass, visitReturn, visitSwitchExpression17, visitThrow, visitTypeCast, visitTypeParameter, visitUnary, warnAboutIrrelevantJavaTypes, warnRedundantAnnotationsMethods inherited from class org.checkerframework.framework.source.SourceVisitor
visitMethods inherited from class com.sun.source.util.TreePathScanner
getCurrentPath, scanMethods inherited from class com.sun.source.util.TreeScanner
reduce, scan, visitArrayAccess, visitArrayType, visitAssert, visitBindingPattern, visitBlock, visitBreak, visitCase, visitContinue, visitDefaultCaseLabel, visitDoWhileLoop, visitEmptyStatement, visitErroneous, visitExports, visitExpressionStatement, visitForLoop, visitGuardedPattern, visitImport, visitIntersectionType, visitLabeledStatement, visitLiteral, visitMemberSelect, visitModifiers, visitModule, visitOpens, visitOther, visitPackage, visitParameterizedType, visitParenthesized, visitParenthesizedPattern, visitPrimitiveType, visitProvides, visitRequires, visitSwitch, visitSwitchExpression, visitSynchronized, visitTry, visitUnionType, visitUses, visitWhileLoop, visitWildcard, visitYield
-
Constructor Details
-
OptionalVisitor
Create an OptionalVisitor.- Parameters:
checker- the associated OptionalChecker
-
-
Method Details
-
createTypeValidator
- Overrides:
createTypeValidatorin classBaseTypeVisitor<BaseAnnotatedTypeFactory>
-
visitConditionalExpression
Description copied from class:BaseTypeVisitorIf the computation of the type of the ConditionalExpressionTree in org.checkerframework.framework.type.TypeFromTree.TypeFromExpression.visitConditionalExpression(ConditionalExpressionTree, AnnotatedTypeFactory) is correct, the following checks are redundant. However, let's add another failsafe guard and do the checks.- Specified by:
visitConditionalExpressionin interfaceTreeVisitor<Void,Void> - Overrides:
visitConditionalExpressionin classBaseTypeVisitor<BaseAnnotatedTypeFactory>
-
handleTernaryIsPresentGet
Part of rule #3.Pattern match for:
VAR.isPresent() ? VAR.get().METHOD() : VALUEPrefer:
VAR.map(METHOD).orElse(VALUE);- Parameters:
tree- a conditional expression that can perhaps be simplified
-
visitIf
- Specified by:
visitIfin interfaceTreeVisitor<Void,Void> - Overrides:
visitIfin classTreeScanner<Void,Void>
-
handleConditionalStatementIsPresentGet
Part of rule #3.Pattern match for:
if (VAR.isPresent()) { METHOD(VAR.get()); }Prefer:
VAR.ifPresent(METHOD);- Parameters:
tree- an if statement that can perhaps be simplified
-
visitMethodInvocation
Description copied from class:BaseTypeVisitorPerforms a method invocation check.An invocation of a method, m, on the receiver, r is valid only if:
- passed arguments are subtypes of corresponding m parameters
- r is a subtype of m receiver type
- if m is generic, passed type arguments are subtypes of m type variables
- Specified by:
visitMethodInvocationin interfaceTreeVisitor<Void,Void> - Overrides:
visitMethodInvocationin classBaseTypeVisitor<BaseAnnotatedTypeFactory>
-
visitBinary
- Specified by:
visitBinaryin interfaceTreeVisitor<Void,Void> - Overrides:
visitBinaryin classTreeScanner<Void,Void>
-
commonAssignmentCheck
protected boolean commonAssignmentCheck(AnnotatedTypeMirror varType, ExpressionTree valueExpTree, @CompilerMessageKey String errorKey, Object... extraArgs) Description copied from class:BaseTypeVisitorChecks the validity of an assignment (or pseudo-assignment) from a value to a variable and emits an error message (through the compiler's messaging interface) if it is not valid.- Overrides:
commonAssignmentCheckin classBaseTypeVisitor<BaseAnnotatedTypeFactory>- Parameters:
varType- the annotated type for the lvalue (usually a variable)valueExpTree- the AST node for the rvalue (the new value)errorKey- the error message key to use if the check failsextraArgs- arguments to the error message key, before "found" and "expected" types- Returns:
- true if the check succeeds, false if an error message was issued
-
handleCreationElimination
Rule #4.Pattern match for:
CREATION().PROPAGATION()*.ELIMINATION()Prefer:
VAR.ifPresent(METHOD);- Parameters:
tree- a method invocation that can perhaps be simplified
-
handleNestedOptionalCreation
Partial support for Rule #5 and Rule #7.Rule #5: Avoid nested Optional chains, or operations that have an intermediate Optional value.
Rule #7: Don't use Optional to wrap any collection type.
Certain types are illegal, such as
Optional<Optional>. The type validator may see a supertype of the most precise run-time type; for example, it may see the type asOptional<? extends Object>, and it would not flag any problem with such a type. This method checks atOptionalcreation sites.TODO: This finds only some
Optional<Optional>: those that consist ofOptional.of(optionalExpr)orOptional.ofNullable(optionalExpr), whereoptionalExprhas typeOptional. There are other ways thatOptional<Optional>can be created, such asoptionalExpr.map(Optional::of).TODO: Also check at collection creation sites, but there are so many of them, and there often are not values of the element type at the collection creation site.
- Parameters:
tree- a method invocation that might create an Optional of an illegal type
-
visitVariable
Rule #6 (partial).Don't use Optional in fields and method parameters.
- Specified by:
visitVariablein interfaceTreeVisitor<Void,Void> - Overrides:
visitVariablein classBaseTypeVisitor<BaseAnnotatedTypeFactory>
-
skipBlocks
If the given tree is a block tree with a single element, return the enclosed non-block statement. Otherwise, return the same tree.- Parameters:
tree- a statement tree- Returns:
- the single enclosed statement, if it exists; otherwise, the same tree
-
visitMemberReference
- Specified by:
visitMemberReferencein interfaceTreeVisitor<Void,Void> - Overrides:
visitMemberReferencein classBaseTypeVisitor<BaseAnnotatedTypeFactory>
-