package testlib.reflection;
import javax.lang.model.element.AnnotationMirror;
import org.checkerframework.common.basetype.BaseAnnotatedTypeFactory;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.framework.type.*;
import org.checkerframework.framework.type.treeannotator.ImplicitsTreeAnnotator;
import org.checkerframework.framework.type.treeannotator.ListTreeAnnotator;
import org.checkerframework.framework.type.treeannotator.PropagationTreeAnnotator;
import org.checkerframework.framework.type.treeannotator.TreeAnnotator;
import org.checkerframework.framework.util.GraphQualifierHierarchy;
import org.checkerframework.framework.util.MultiGraphQualifierHierarchy.MultiGraphFactory;
import org.checkerframework.javacutil.AnnotationUtils;
import testlib.reflection.qual.ReflectBottom;
/**
* AnnotatedTypeFactory with reflection resolution enabled. The used qualifier hierarchy is
* straightforward and only intended for test purposes.
*
* @author rjust, smillst
*/
public final class ReflectionTestAnnotatedTypeFactory extends BaseAnnotatedTypeFactory {
public ReflectionTestAnnotatedTypeFactory(BaseTypeChecker checker) {
super(checker);
postInit();
AnnotationMirror bottom = AnnotationUtils.fromClass(elements, ReflectBottom.class);
addTypeNameImplicit(java.lang.Void.class, bottom);
}
@Override
public TreeAnnotator createTreeAnnotator() {
ImplicitsTreeAnnotator implicitsTreeAnnotator = new ImplicitsTreeAnnotator(this);
AnnotationMirror bottom = AnnotationUtils.fromClass(elements, ReflectBottom.class);
implicitsTreeAnnotator.addTreeKind(com.sun.source.tree.Tree.Kind.NULL_LITERAL, bottom);
implicitsTreeAnnotator.addTreeKind(com.sun.source.tree.Tree.Kind.INT_LITERAL, bottom);
return new ListTreeAnnotator(new PropagationTreeAnnotator(this), implicitsTreeAnnotator);
}
@Override
public QualifierHierarchy createQualifierHierarchy(MultiGraphFactory factory) {
AnnotationMirror bottom = AnnotationUtils.fromClass(elements, ReflectBottom.class);
return new GraphQualifierHierarchy(factory, bottom);
}
}