Class PurityChecker.PurityCheckerHelper
- All Implemented Interfaces:
TreeVisitor<Void,Void>
- Enclosing class:
PurityChecker
PurityChecker's interface clean.
The scanner is run on statements and on the class members that contain code that runs during construction (a field declaration or an initializer block). It is not run on a class or method declaration.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final AnnotationProviderThe annotation provider (typically an AnnotatedTypeFactory). -
Constructor Summary
ConstructorsConstructorDescriptionPurityCheckerHelper(AnnotationProvider annoProvider, boolean assumeSideEffectFree, boolean assumeDeterministic, boolean assumePureGetters) Create a PurityCheckerHelper. -
Method Summary
Modifier and TypeMethodDescriptionprotected voidassignmentCheck(ExpressionTree variable) Returns true ifvariableis permitted on the left-hand-side of an assignment.protected booleanisLocalVariable(ExpressionTree variable) Checks if the argument is a local variable.visitAssignment(AssignmentTree tree, Void ignore) visitCatch(CatchTree tree, Void ignore) visitClass(ClassTree tree, Void ignore) Declaring a local or anonymous class has no side effect.visitCompoundAssignment(CompoundAssignmentTree tree, Void ignore) visitLambdaExpression(LambdaExpressionTree tree, Void ignore) Evaluating a lambda expression creates an object; it does not run the lambda's body.visitMemberReference(MemberReferenceTree tree, Void ignore) Evaluating a method reference creates an object; it does not run the referenced method.visitMethodInvocation(MethodInvocationTree tree, Void ignore) visitNewClass(NewClassTree tree, Void ignore) visitUnary(UnaryTree tree, Void ignore) Methods inherited from class com.sun.source.util.TreePathScanner
getCurrentPath, scan, scanMethods inherited from class com.sun.source.util.TreeScanner
reduce, scan, visitAnnotatedType, visitAnnotation, visitAnyPattern, visitArrayAccess, visitArrayType, visitAssert, visitBinary, visitBindingPattern, visitBlock, visitBreak, visitCase, visitCompilationUnit, visitConditionalExpression, visitConstantCaseLabel, visitContinue, visitDeconstructionPattern, visitDefaultCaseLabel, visitDoWhileLoop, visitEmptyStatement, visitEnhancedForLoop, visitErroneous, visitExports, visitExpressionStatement, visitForLoop, visitIdentifier, visitIf, visitImport, visitInstanceOf, visitIntersectionType, visitLabeledStatement, visitLiteral, visitMemberSelect, visitMethod, visitModifiers, visitModule, visitNewArray, visitOpens, visitOther, visitPackage, visitParameterizedType, visitParenthesized, visitPatternCaseLabel, visitPrimitiveType, visitProvides, visitRequires, visitReturn, visitStringTemplate, visitSwitch, visitSwitchExpression, visitSynchronized, visitThrow, visitTry, visitTypeCast, visitTypeParameter, visitUnionType, visitUses, visitVariable, visitWhileLoop, visitWildcard, visitYield
-
Field Details
-
annoProvider
The annotation provider (typically an AnnotatedTypeFactory).
-
-
Constructor Details
-
PurityCheckerHelper
public PurityCheckerHelper(AnnotationProvider annoProvider, boolean assumeSideEffectFree, boolean assumeDeterministic, boolean assumePureGetters) Create a PurityCheckerHelper.- Parameters:
annoProvider- the annotation providerassumeSideEffectFree- true if all methods should be assumed to be @SideEffectFreeassumeDeterministic- true if all methods should be assumed to be @DeterministicassumePureGetters- true if getter methods should be assumed to be @Pure
-
-
Method Details
-
visitCatch
- Specified by:
visitCatchin interfaceTreeVisitor<Void,Void> - Overrides:
visitCatchin classTreeScanner<Void,Void>
-
visitLambdaExpression
Evaluating a lambda expression creates an object; it does not run the lambda's body.Creating an object is not deterministic, just as a
newexpression is not; seevisitNewClass(com.sun.source.tree.NewClassTree, java.lang.Void).The body's effects occur where the lambda's functional method is invoked, and that invocation is checked like any other method call. Therefore, do not scan the body. The body is checked elsewhere, against the purity annotations on the functional method that the lambda implements; see
BaseTypeVisitor#checkLambdaPurity.- Specified by:
visitLambdaExpressionin interfaceTreeVisitor<Void,Void> - Overrides:
visitLambdaExpressionin classTreeScanner<Void,Void> - Parameters:
tree- a lambda expressionignore- an unused parameter- Returns:
- null
-
visitMemberReference
Evaluating a method reference creates an object; it does not run the referenced method.Creating an object is not deterministic, just as a
newexpression is not; seevisitNewClass(com.sun.source.tree.NewClassTree, java.lang.Void). JLS 15.13.3 leaves it unspecified whether two evaluations of the same method reference produce the same object.The referenced method's effects occur where the functional method is invoked, and that invocation is checked like any other method call.
Do scan the children. The qualifier expression of
EXPR::mis evaluated where the method reference appears, unlike the body of a lambda.- Specified by:
visitMemberReferencein interfaceTreeVisitor<Void,Void> - Overrides:
visitMemberReferencein classTreeScanner<Void,Void> - Parameters:
tree- a method referenceignore- an unused parameter- Returns:
- null
-
visitClass
Declaring a local or anonymous class has no side effect. The class's methods are checked against their own purity annotations, like the methods of any other class.Do scan the class's non-method members. Attributing a field initializer or an initializer block to the method that contains the class declaration is conservative: the effect is reported even if the class is never instantiated.
- Specified by:
visitClassin interfaceTreeVisitor<Void,Void> - Overrides:
visitClassin classTreeScanner<Void,Void> - Parameters:
tree- a class declarationignore- an unused parameter- Returns:
- null
-
visitMethodInvocation
- Specified by:
visitMethodInvocationin interfaceTreeVisitor<Void,Void> - Overrides:
visitMethodInvocationin classTreeScanner<Void,Void>
-
visitNewClass
- Specified by:
visitNewClassin interfaceTreeVisitor<Void,Void> - Overrides:
visitNewClassin classTreeScanner<Void,Void>
-
visitAssignment
- Specified by:
visitAssignmentin interfaceTreeVisitor<Void,Void> - Overrides:
visitAssignmentin classTreeScanner<Void,Void>
-
visitUnary
- Specified by:
visitUnaryin interfaceTreeVisitor<Void,Void> - Overrides:
visitUnaryin classTreeScanner<Void,Void>
-
assignmentCheck
Returns true ifvariableis permitted on the left-hand-side of an assignment.- Parameters:
variable- the lhs to check
-
isLocalVariable
Checks if the argument is a local variable.- Parameters:
variable- the tree to check- Returns:
- true if the argument is a local variable
-
visitCompoundAssignment
- Specified by:
visitCompoundAssignmentin interfaceTreeVisitor<Void,Void> - Overrides:
visitCompoundAssignmentin classTreeScanner<Void,Void>
-