Class KeyForPropagationTreeAnnotator

java.lang.Object
com.sun.source.util.SimpleTreeVisitor<Void,AnnotatedTypeMirror>
org.checkerframework.framework.type.treeannotator.TreeAnnotator
org.checkerframework.checker.nullness.KeyForPropagationTreeAnnotator
All Implemented Interfaces:
com.sun.source.tree.TreeVisitor<Void,AnnotatedTypeMirror>

public class KeyForPropagationTreeAnnotator extends TreeAnnotator
For the following initializations we wish to propagate the annotations from the left-hand side to the right-hand side or vice versa:

1. If a keySet is being saved to a newly declared set, we transfer the annotations from the keySet to the lhs. e.g.,


 // The user is not required to explicitly annotate the LHS's type argument with @KeyFor("m")
 Set<String> keySet = m.keySet();
 
2. If a variable declaration contains type arguments with an @KeyFor annotation and its initializer is a new class tree with corresponding type arguments that have an @UknownKeyFor primary annotation, we transfer from the LHS to RHS. e.g.,

 // The user does not have to write @KeyFor("m") on both sides
 List<@KeyFor("m") String> keys = new ArrayList<String>();
 
3. IMPORTANT NOTE: The following case must be (and is) handled in KeyForAnnotatedTypeFactory. In BaseTypeVisitor we check to make sure that the constructor called in a NewClassTree is actually compatible with the annotations placed on the NewClassTree. This requires that, prior to this check we also propagate the annotations to this constructor in constructorFromUse so that the constructor call matches the type given to the NewClassTree.
See Also:
  • Field Summary

    Fields inherited from class org.checkerframework.framework.type.treeannotator.TreeAnnotator

    atypeFactory

    Fields inherited from class com.sun.source.util.SimpleTreeVisitor

    DEFAULT_VALUE
  • Constructor Summary

    Constructors
    Constructor
    Description
    KeyForPropagationTreeAnnotator(AnnotatedTypeFactory atypeFactory, KeyForPropagator propagationTreeAnnotator)
     
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    isCallToKeyset(com.sun.source.tree.ExpressionTree expression)
    Returns true iff expression is a call to java.util.Map.KeySet.
    visitNewClass(com.sun.source.tree.NewClassTree node, AnnotatedTypeMirror type)
    Transfers annotations to type if the left hand side is a variable declaration.
    visitVariable(com.sun.source.tree.VariableTree variableTree, AnnotatedTypeMirror type)
    Transfers annotations on type arguments from the initializer to the variableTree, if the initializer is a call to java.util.Map.keySet.

    Methods inherited from class org.checkerframework.framework.type.treeannotator.TreeAnnotator

    visitBinary, visitMethod

    Methods inherited from class com.sun.source.util.SimpleTreeVisitor

    defaultAction, visit, visit, visitAnnotatedType, visitAnnotation, visitArrayAccess, visitArrayType, visitAssert, visitAssignment, visitBindingPattern, visitBlock, visitBreak, visitCase, visitCatch, visitClass, visitCompilationUnit, visitCompoundAssignment, visitConditionalExpression, visitContinue, visitDefaultCaseLabel, visitDoWhileLoop, visitEmptyStatement, visitEnhancedForLoop, visitErroneous, visitExports, visitExpressionStatement, visitForLoop, visitGuardedPattern, visitIdentifier, visitIf, visitImport, visitInstanceOf, visitIntersectionType, visitLabeledStatement, visitLambdaExpression, visitLiteral, visitMemberReference, visitMemberSelect, visitMethodInvocation, visitModifiers, visitModule, visitNewArray, visitOpens, visitOther, visitPackage, visitParameterizedType, visitParenthesized, visitParenthesizedPattern, visitPrimitiveType, visitProvides, visitRequires, visitReturn, visitSwitch, visitSwitchExpression, visitSynchronized, visitThrow, visitTry, visitTypeCast, visitTypeParameter, visitUnary, visitUnionType, visitUses, visitWhileLoop, visitWildcard, visitYield

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

  • Method Details

    • isCallToKeyset

      public boolean isCallToKeyset(com.sun.source.tree.ExpressionTree expression)
      Returns true iff expression is a call to java.util.Map.KeySet.
      Returns:
      true iff expression is a call to java.util.Map.KeySet
    • visitVariable

      public Void visitVariable(com.sun.source.tree.VariableTree variableTree, AnnotatedTypeMirror type)
      Transfers annotations on type arguments from the initializer to the variableTree, if the initializer is a call to java.util.Map.keySet.
      Specified by:
      visitVariable in interface com.sun.source.tree.TreeVisitor<Void,AnnotatedTypeMirror>
      Overrides:
      visitVariable in class com.sun.source.util.SimpleTreeVisitor<Void,AnnotatedTypeMirror>
    • visitNewClass

      public Void visitNewClass(com.sun.source.tree.NewClassTree node, AnnotatedTypeMirror type)
      Transfers annotations to type if the left hand side is a variable declaration.
      Specified by:
      visitNewClass in interface com.sun.source.tree.TreeVisitor<Void,AnnotatedTypeMirror>
      Overrides:
      visitNewClass in class com.sun.source.util.SimpleTreeVisitor<Void,AnnotatedTypeMirror>