public class KeyForPropagationTreeAnnotator extends TreeAnnotator
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.atypeFactory
Constructor and Description |
---|
KeyForPropagationTreeAnnotator(AnnotatedTypeFactory atypeFactory,
KeyForPropagator propagationTreeAnnotator) |
Modifier and Type | Method and Description |
---|---|
boolean |
isCallToKeyset(com.sun.source.tree.ExpressionTree expression) |
java.lang.Void |
visitNewClass(com.sun.source.tree.NewClassTree node,
AnnotatedTypeMirror type)
Transfers annotations to type if the left hand side is a variable declaration.
|
java.lang.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.
|
visitBinary, visitMethod
defaultAction, visit, visit, visitAnnotatedType, visitAnnotation, visitArrayAccess, visitArrayType, visitAssert, visitAssignment, visitBlock, visitBreak, visitCase, visitCatch, visitClass, visitCompilationUnit, visitCompoundAssignment, visitConditionalExpression, visitContinue, visitDoWhileLoop, visitEmptyStatement, visitEnhancedForLoop, visitErroneous, visitExports, visitExpressionStatement, visitForLoop, visitIdentifier, visitIf, visitImport, visitInstanceOf, visitIntersectionType, visitLabeledStatement, visitLambdaExpression, visitLiteral, visitMemberReference, visitMemberSelect, visitMethodInvocation, visitModifiers, visitModule, visitNewArray, visitOpens, visitOther, visitPackage, visitParameterizedType, visitParenthesized, visitPrimitiveType, visitProvides, visitRequires, visitReturn, visitSwitch, visitSynchronized, visitThrow, visitTry, visitTypeCast, visitTypeParameter, visitUnary, visitUnionType, visitUses, visitWhileLoop, visitWildcard
public KeyForPropagationTreeAnnotator(AnnotatedTypeFactory atypeFactory, KeyForPropagator propagationTreeAnnotator)
public boolean isCallToKeyset(com.sun.source.tree.ExpressionTree expression)
public java.lang.Void visitVariable(com.sun.source.tree.VariableTree variableTree, AnnotatedTypeMirror type)
visitVariable
in interface com.sun.source.tree.TreeVisitor<java.lang.Void,AnnotatedTypeMirror>
visitVariable
in class com.sun.source.util.SimpleTreeVisitor<java.lang.Void,AnnotatedTypeMirror>
public java.lang.Void visitNewClass(com.sun.source.tree.NewClassTree node, AnnotatedTypeMirror type)
visitNewClass
in interface com.sun.source.tree.TreeVisitor<java.lang.Void,AnnotatedTypeMirror>
visitNewClass
in class com.sun.source.util.SimpleTreeVisitor<java.lang.Void,AnnotatedTypeMirror>