package org.checkerframework.framework.util.dependenttypes; import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.NewArrayTree; import com.sun.source.tree.NewClassTree; import com.sun.source.tree.TypeCastTree; import com.sun.source.tree.VariableTree; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import org.checkerframework.framework.type.AnnotatedTypeFactory; import org.checkerframework.framework.type.AnnotatedTypeMirror; import org.checkerframework.framework.type.treeannotator.TreeAnnotator; import org.checkerframework.javacutil.TreeUtils; /** * Standardizes Java expressions in annotations and also view points adapts field accesses. (Other * viewpoint adaption is handled in {@link DependentTypesHelper} */ public class DependentTypesTreeAnnotator extends TreeAnnotator { private final DependentTypesHelper helper; public DependentTypesTreeAnnotator( AnnotatedTypeFactory atypeFactory, DependentTypesHelper helper) { super(atypeFactory); this.helper = helper; } @Override public Void visitNewArray(NewArrayTree node, AnnotatedTypeMirror annotatedType) { helper.standardizeExpression(node, annotatedType); return super.visitNewArray(node, annotatedType); } @Override public Void visitNewClass(NewClassTree node, AnnotatedTypeMirror annotatedType) { helper.standardizeExpression(node, annotatedType); return super.visitNewClass(node, annotatedType); } @Override public Void visitTypeCast(TypeCastTree node, AnnotatedTypeMirror annotatedType) { helper.standardizeExpression(node, annotatedType); return super.visitTypeCast(node, annotatedType); } @Override public Void visitVariable(VariableTree node, AnnotatedTypeMirror annotatedTypeMirror) { Element ele = TreeUtils.elementFromDeclaration(node); helper.standardizeVariable(node, annotatedTypeMirror, ele); return super.visitVariable(node, annotatedTypeMirror); } @Override public Void visitIdentifier(IdentifierTree node, AnnotatedTypeMirror annotatedTypeMirror) { Element ele = TreeUtils.elementFromUse(node); if (ele.getKind() == ElementKind.FIELD) { helper.standardizeVariable(node, annotatedTypeMirror, ele); } return super.visitIdentifier(node, annotatedTypeMirror); } @Override public Void visitMemberSelect(MemberSelectTree node, AnnotatedTypeMirror type) { helper.standardizeFieldAccess(node, type); return super.visitMemberSelect(node, type); } }