package checkers.oigj; import javax.lang.model.element.ElementKind; import com.sun.source.tree.CompilationUnitTree; import checkers.oigj.quals.*; import checkers.types.BasicAnnotatedTypeFactory; import checkers.types.TypeAnnotator; import checkers.types.AnnotatedTypeMirror.AnnotatedDeclaredType; import checkers.util.TypesUtils; public class OwnershipAnnotatedTypeFactory extends BasicAnnotatedTypeFactory<OwnershipSubchecker> { public OwnershipAnnotatedTypeFactory(OwnershipSubchecker checker, CompilationUnitTree root) { super(checker, root); } @Override protected TypeAnnotator createTypeAnnotator(OwnershipSubchecker checker) { return new OwnershipTypeAnnotator(checker); } private class OwnershipTypeAnnotator extends TypeAnnotator { public OwnershipTypeAnnotator(OwnershipSubchecker checker) { super(checker); } public Void visitDeclared(AnnotatedDeclaredType type, ElementKind p) { if (type.isAnnotated()) return super.visitDeclared(type, p); if (p == ElementKind.CLASS && TypesUtils.isObject(type.getUnderlyingType())) type.addAnnotation(World.class); return super.visitDeclared(type, p); } } }