package polyall; import com.sun.source.tree.Tree; import com.sun.source.tree.Tree.Kind; import com.sun.source.tree.VariableTree; import java.lang.annotation.Annotation; import java.util.Set; import javax.lang.model.element.AnnotationMirror; import org.checkerframework.common.basetype.BaseAnnotatedTypeFactory; import org.checkerframework.common.basetype.BaseTypeChecker; import org.checkerframework.framework.type.AnnotatedTypeMirror; import org.checkerframework.framework.type.QualifierHierarchy; import org.checkerframework.framework.util.MultiGraphQualifierHierarchy; import org.checkerframework.framework.util.MultiGraphQualifierHierarchy.MultiGraphFactory; import org.checkerframework.javacutil.AnnotationUtils; import polyall.quals.H1Bot; import polyall.quals.H1Invalid; import polyall.quals.H1Poly; import polyall.quals.H1S1; import polyall.quals.H1S2; import polyall.quals.H1Top; import polyall.quals.H2Bot; import polyall.quals.H2Poly; import polyall.quals.H2S1; import polyall.quals.H2S2; import polyall.quals.H2Top; public class PolyAllAnnotatedTypeFactory extends BaseAnnotatedTypeFactory { AnnotationMirror H1S2; public PolyAllAnnotatedTypeFactory(BaseTypeChecker checker) { super(checker); this.postInit(); H1S2 = AnnotationUtils.fromClass(elements, polyall.quals.H1S2.class); } @Override protected Set<Class<? extends Annotation>> createSupportedTypeQualifiers() { return getBundledTypeQualifiersWithPolyAll( H1Top.class, H1S1.class, H1S2.class, H1Bot.class, H2Top.class, H2S1.class, H2S2.class, H2Bot.class, H1Poly.class, H2Poly.class, H1Invalid.class); } @Override protected MultiGraphFactory createQualifierHierarchyFactory() { return new MultiGraphQualifierHierarchy.MultiGraphFactory(this); } @Override public QualifierHierarchy createQualifierHierarchy(MultiGraphFactory factory) { return new MultiGraphQualifierHierarchy(factory); } @Override protected void addComputedTypeAnnotations( Tree tree, AnnotatedTypeMirror type, boolean iUseFlow) { super.addComputedTypeAnnotations(tree, type, iUseFlow); if (tree.getKind() == Kind.VARIABLE && ((VariableTree) tree).getName().toString().contains("addH1S2")) { type.replaceAnnotation(H1S2); } } }