blob: 00fb30989c1c02b7d009513c5c622f6299f1083c [file] [log] [blame]
package org.checkerframework.framework.type.typeannotator;
import java.util.Set;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.type.TypeMirror;
import org.checkerframework.framework.qual.RelevantJavaTypes;
import org.checkerframework.framework.type.AnnotatedTypeMirror;
import org.checkerframework.framework.type.GenericAnnotatedTypeFactory;
/**
* Adds annotations to types that are not relevant specified by the {@link RelevantJavaTypes} on a
* checker.
*/
public class IrrelevantTypeAnnotator extends TypeAnnotator {
/** Annotations to add. */
private Set<? extends AnnotationMirror> annotations;
/**
* Annotate every type with the annotationMirror except for those whose underlying Java type is
* one of (or a subtype of) a class in relevantClasses. (Only adds annotationMirror if no
* annotation in the hierarchy are already on the type.) If relevantClasses includes
* Object[].class, then all arrays are considered relevant.
*
* @param typeFactory AnnotatedTypeFactory
* @param annotations annotations to add
*/
@SuppressWarnings("rawtypes")
public IrrelevantTypeAnnotator(
GenericAnnotatedTypeFactory typeFactory, Set<? extends AnnotationMirror> annotations) {
super(typeFactory);
this.annotations = annotations;
}
@Override
protected Void scan(AnnotatedTypeMirror type, Void aVoid) {
switch (type.getKind()) {
case TYPEVAR:
case WILDCARD:
case EXECUTABLE:
case INTERSECTION:
case UNION:
case NULL:
case NONE:
case PACKAGE:
case VOID:
return super.scan(type, aVoid);
default:
// go on
}
TypeMirror typeMirror = type.getUnderlyingType();
if (!((GenericAnnotatedTypeFactory) typeFactory).isRelevant(typeMirror)) {
type.addMissingAnnotations(annotations);
}
return super.scan(type, aVoid);
}
}