package polyall; import com.sun.source.tree.Tree; import javax.lang.model.element.AnnotationMirror; import org.checkerframework.common.basetype.BaseTypeChecker; import org.checkerframework.common.basetype.BaseTypeValidator; import org.checkerframework.common.basetype.BaseTypeVisitor; import org.checkerframework.framework.source.Result; import org.checkerframework.framework.type.AnnotatedTypeFactory; import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedDeclaredType; import org.checkerframework.framework.util.AnnotatedTypes; import org.checkerframework.javacutil.AnnotationUtils; import polyall.quals.H1Invalid; public class PolyAllVisitor extends BaseTypeVisitor<PolyAllAnnotatedTypeFactory> { public PolyAllVisitor(BaseTypeChecker checker) { super(checker); } @Override protected BaseTypeValidator createTypeValidator() { return new PolyAllTypeValidator(checker, this, atypeFactory); } private final class PolyAllTypeValidator extends BaseTypeValidator { public PolyAllTypeValidator( BaseTypeChecker checker, BaseTypeVisitor<?> visitor, AnnotatedTypeFactory atypeFactory) { super(checker, visitor, atypeFactory); } @Override public Void visitDeclared(AnnotatedDeclaredType type, Tree p) { AnnotationMirror h1Invalid = AnnotationUtils.fromClass(elements, H1Invalid.class); if (AnnotatedTypes.containsModifier(type, h1Invalid)) { checker.report( Result.failure( "polyall.h1invalid.forbidden", type.getAnnotations(), type.toString()), p); } return super.visitDeclared(type, p); } } }