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. if the receiver of a member dereference is not NonNull 2. if the receiver of an implicit ".iterator()" dereference in an enhanced for loop is not NonNull 3. if an accessed array is not NonNull Self-accesses (via this or super) can always be dereferenced.

See Also:
NullnessChecker

Field Summary
 
Fields inherited from class checkers.basetype.BaseTypeVisitor
annoFactory, annoTypes, checker, visitorState
 
Fields inherited from class checkers.source.SourceVisitor
atypeFactory, elements, root, trees, types
 
Constructor Summary
NullnessVisitor(NullnessChecker checker, CompilationUnitTree root)
          Creates a new visitor for type-checking NonNull.
 
Method Summary
protected  boolean checkMethodInvocability(AnnotatedTypeMirror.AnnotatedExecutableType method, MethodInvocationTree node)
          Tests whether the method can be invoked using the receiver of the 'node' method invocation, and issues a "method.invocation.invalid" if the invocation is invalid.
 Void visitArrayAccess(ArrayAccessTree node, Void p)
           
 Void visitEnhancedForLoop(EnhancedForLoopTree node, Void p)
          Performs a subtype check, to test whether the node expression iterable type is a subtype of the variable type in the enhanced for loop.
 Void visitMemberSelect(MemberSelectTree node, Void p)
           
 Void visitThrow(ThrowTree node, Void p)
           
 
Methods inherited from class checkers.basetype.BaseTypeVisitor
checkArguments, checkAssignability, checkOverride, checkTypeArguments, commonAssignmentCheck, commonAssignmentCheck, commonAssignmentCheck, scan, shouldSkip, shouldSkip, validateTypeOf, visitAnnotation, visitAssignment, visitClass, visitCompilationUnit, visitCompoundAssignment, visitInstanceOf, visitMethod, visitMethodInvocation, visitNewArray, visitNewClass, visitParameterizedType, visitReturn, visitTypeCast, visitUnary, 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, visitAssert, visitBinary, visitBlock, visitBreak, visitCase, visitCatch, visitConditionalExpression, visitContinue, visitDoWhileLoop, visitEmptyStatement, visitErroneous, visitExpressionStatement, visitForLoop, visitIdentifier, visitIf, visitImport, visitLabeledStatement, visitLiteral, visitModifiers, visitOther, visitParenthesized, visitPrimitiveType, visitSwitch, visitSynchronized, 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(NullnessChecker 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)
Specified by:
visitMemberSelect in interface TreeVisitor<Void,Void>
Overrides:
visitMemberSelect in class TreeScanner<Void,Void>

visitEnhancedForLoop

public Void visitEnhancedForLoop(EnhancedForLoopTree node,
                                 Void p)
Description copied from class: BaseTypeVisitor
Performs a subtype check, to test whether the node expression iterable type is a subtype of the variable type in the enhanced for loop. If the subtype check fails, it issues a "type.incompatible" error.

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

visitArrayAccess

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

visitThrow

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

checkMethodInvocability

protected boolean checkMethodInvocability(AnnotatedTypeMirror.AnnotatedExecutableType method,
                                          MethodInvocationTree node)
Description copied from class: BaseTypeVisitor
Tests whether the method can be invoked using the receiver of the 'node' method invocation, and issues a "method.invocation.invalid" if the invocation is invalid. This implementation tests whether the receiver in the method invocation is a subtype of the method receiver type.

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