checkers.nullness
Class NullnessVisitor

java.lang.Object
  extended by com.sun.source.util.TreeScanner<R,P>
      extended by com.sun.source.util.TreePathScanner<R,P>
          extended by checkers.source.SourceVisitor<R,P>
              extended by checkers.basetype.BaseTypeVisitor<Void,Void>
                  extended by checkers.nullness.NullnessVisitor
All Implemented Interfaces:
TreeVisitor<Void,Void>

public class NullnessVisitor
extends BaseTypeVisitor<Void,Void>

A type-checking visitor for the Nullness type system. This visitor reports errors ("dereference.of.nullable") or warnings for violations for the following cases:

  1. the receiver of a member dereference is not NonNull
  2. the receiver of an implicit ".iterator()" dereference in an enhanced for loop is not NonNull
  3. an accessed array is not NonNull
  4. a thrown exception is not NonNull
  5. the lock in a synchronized block is not NonNull
  6. a NonNull reference is checked for nullness
  7. a value in implicit unboxed operation is not NonNull
Self-accesses (via this or super) can always be dereferenced.

See Also:
NullnessSubchecker

Field Summary
Modifier and Type Field and Description
 
Fields inherited from class checkers.basetype.BaseTypeVisitor
annoFactory, annoTypes, checker, plainFactory, visitorState
 
Fields inherited from class checkers.source.SourceVisitor
atypeFactory, elements, root, trees, types
 
Constructor Summary
Constructor and Description
NullnessVisitor(NullnessSubchecker checker, CompilationUnitTree root)
          Creates a new visitor for type-checking NonNull.
 
Method Summary
Modifier and Type Method and Description
protected  void checkForRedundantTests(BinaryTree node)
           
protected  boolean checkMethodInvocability(AnnotatedTypeMirror.AnnotatedExecutableType method, MethodInvocationTree node)
          Special casing NonNull and Raw method calls
protected  void commonAssignmentCheck(Tree varTree, ExpressionTree valueExp, String errorKey, Void p)
          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 does.
 Void visitArrayAccess(ArrayAccessTree node, Void p)
          Case 3: Check for array dereferencing
 Void visitAssert(AssertTree node, Void p)
           
 Void visitAssignment(AssignmentTree node, Void p)
          Performs two checks: subtyping and assignability checks, using BaseTypeVisitor.commonAssignmentCheck(Tree, ExpressionTree, String, Object).
 Void visitBinary(BinaryTree node, Void p)
          Case 6: Check for redundant nullness tests Case 7: unboxing case: primitive operations
 Void visitCompoundAssignment(CompoundAssignmentTree node, Void p)
          Case 7: unboxing case: primitive operation
 Void visitEnhancedForLoop(EnhancedForLoopTree node, Void p)
          Case 2: Check for implicit .iterator call
 Void visitIf(IfTree node, Void p)
           
 Void visitMemberSelect(MemberSelectTree node, Void p)
          Case 1: Check for null dereferecing
 Void visitMethod(MethodTree node, Void p)
          Performs pseudo-assignment check: checks that the method obeys override and subtype rules to all overridden methods.
 Void visitSynchronized(SynchronizedTree node, Void p)
          Case 5: Check for synchronizing locks
 Void visitThrow(ThrowTree node, Void p)
          Case 4: Check for thrown exception nullness
 Void visitTypeCast(TypeCastTree node, Void p)
          Case 7: unboxing case: casting to a primitive
 Void visitUnary(UnaryTree node, Void p)
          Case 7: unboxing case: primitive operation
 
Methods inherited from class checkers.basetype.BaseTypeVisitor
checkAccess, checkArguments, checkArrayInitialization, checkAssignability, checkConstructorInvocation, checkOverride, checkTypeArguments, checkTypecastRedundancy, checkTypecastSafety, commonAssignmentCheck, commonAssignmentCheck, enclosingMemberSelect, isAccessAllowed, scan, shouldSkip, shouldSkip, validateTypeOf, visitAnnotation, visitClass, visitCompilationUnit, visitIdentifier, visitInstanceOf, visitMethodInvocation, visitNewArray, visitNewClass, visitParameterizedType, visitReturn, visitVariable
 
Methods inherited from class com.sun.source.util.TreePathScanner
getCurrentPath, scan
 
Methods inherited from class com.sun.source.util.TreeScanner
reduce, scan, visitAnnotatedType, visitArrayType, visitBlock, visitBreak, visitCase, visitCatch, visitConditionalExpression, visitContinue, visitDoWhileLoop, visitEmptyStatement, visitErroneous, visitExpressionStatement, visitForLoop, visitImport, visitLabeledStatement, visitLiteral, visitModifiers, visitOther, visitParenthesized, visitPrimitiveType, visitSwitch, visitTry, visitTypeParameter, visitWhileLoop, visitWildcard
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

NullnessVisitor

public NullnessVisitor(NullnessSubchecker checker,
                       CompilationUnitTree root)
Creates a new visitor for type-checking NonNull.

Parameters:
checker - the checker to use
root - the root of the input program's AST to check
Method Detail

visitMemberSelect

public Void visitMemberSelect(MemberSelectTree node,
                              Void p)
Case 1: Check for null dereferecing

Specified by:
visitMemberSelect in interface TreeVisitor<Void,Void>
Overrides:
visitMemberSelect in class TreeScanner<Void,Void>

visitEnhancedForLoop

public Void visitEnhancedForLoop(EnhancedForLoopTree node,
                                 Void p)
Case 2: Check for implicit .iterator call

Specified by:
visitEnhancedForLoop in interface TreeVisitor<Void,Void>
Overrides:
visitEnhancedForLoop in class BaseTypeVisitor<Void,Void>

visitArrayAccess

public Void visitArrayAccess(ArrayAccessTree node,
                             Void p)
Case 3: Check for array dereferencing

Specified by:
visitArrayAccess in interface TreeVisitor<Void,Void>
Overrides:
visitArrayAccess in class TreeScanner<Void,Void>

visitThrow

public Void visitThrow(ThrowTree node,
                       Void p)
Case 4: Check for thrown exception nullness

Specified by:
visitThrow in interface TreeVisitor<Void,Void>
Overrides:
visitThrow in class TreeScanner<Void,Void>

visitSynchronized

public Void visitSynchronized(SynchronizedTree node,
                              Void p)
Case 5: Check for synchronizing locks

Specified by:
visitSynchronized in interface TreeVisitor<Void,Void>
Overrides:
visitSynchronized in class TreeScanner<Void,Void>

visitAssert

public Void visitAssert(AssertTree node,
                        Void p)
Specified by:
visitAssert in interface TreeVisitor<Void,Void>
Overrides:
visitAssert in class TreeScanner<Void,Void>

visitIf

public Void visitIf(IfTree node,
                    Void p)
Specified by:
visitIf in interface TreeVisitor<Void,Void>
Overrides:
visitIf in class TreeScanner<Void,Void>

checkForRedundantTests

protected void checkForRedundantTests(BinaryTree node)

visitBinary

public Void visitBinary(BinaryTree node,
                        Void p)
Case 6: Check for redundant nullness tests Case 7: unboxing case: primitive operations

Specified by:
visitBinary in interface TreeVisitor<Void,Void>
Overrides:
visitBinary in class TreeScanner<Void,Void>

visitUnary

public Void visitUnary(UnaryTree node,
                       Void p)
Case 7: unboxing case: primitive operation

Specified by:
visitUnary in interface TreeVisitor<Void,Void>
Overrides:
visitUnary in class BaseTypeVisitor<Void,Void>

visitCompoundAssignment

public Void visitCompoundAssignment(CompoundAssignmentTree node,
                                    Void p)
Case 7: unboxing case: primitive operation

Specified by:
visitCompoundAssignment in interface TreeVisitor<Void,Void>
Overrides:
visitCompoundAssignment in class BaseTypeVisitor<Void,Void>

visitTypeCast

public Void visitTypeCast(TypeCastTree node,
                          Void p)
Case 7: unboxing case: casting to a primitive

Specified by:
visitTypeCast in interface TreeVisitor<Void,Void>
Overrides:
visitTypeCast in class BaseTypeVisitor<Void,Void>

commonAssignmentCheck

protected void commonAssignmentCheck(Tree varTree,
                                     ExpressionTree valueExp,
                                     String errorKey,
                                     Void p)
Description copied from class: BaseTypeVisitor
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 does.

Overrides:
commonAssignmentCheck in class BaseTypeVisitor<Void,Void>
Parameters:
varTree - the AST node for the variable
valueExp - the AST node for the value
errorKey - the error message to use if the check fails
p - a checker-specified parameter

visitMethod

public Void visitMethod(MethodTree node,
                        Void p)
Description copied from class: BaseTypeVisitor
Performs pseudo-assignment check: checks that the method obeys override and subtype rules to all overridden methods. The override rule specifies that a method, m1, may override a method m2 only if: Also, it issues a "missing.this" error for static method annotated receivers.

Specified by:
visitMethod in interface TreeVisitor<Void,Void>
Overrides:
visitMethod in class BaseTypeVisitor<Void,Void>

visitAssignment

public Void visitAssignment(AssignmentTree node,
                            Void p)
Description copied from class: BaseTypeVisitor
Performs two checks: subtyping and assignability checks, using BaseTypeVisitor.commonAssignmentCheck(Tree, ExpressionTree, String, Object). If the subtype check fails, it issues a "assignment.invalid" error.

Specified by:
visitAssignment in interface TreeVisitor<Void,Void>
Overrides:
visitAssignment in class BaseTypeVisitor<Void,Void>

checkMethodInvocability

protected boolean checkMethodInvocability(AnnotatedTypeMirror.AnnotatedExecutableType method,
                                          MethodInvocationTree node)
Special casing NonNull and Raw method calls

Overrides:
checkMethodInvocability in class BaseTypeVisitor<Void,Void>
Parameters:
method - the type of the invoked method
node - the method invocation node
Returns:
true iff the call of 'node' is a valid call