blob: b7c7df3e215427f5fe290946828f8b1323ab7f68 [file] [log] [blame]
package org.checkerframework.checker.units;
import java.lang.annotation.Annotation;
import javax.lang.model.element.AnnotationMirror;
import org.checkerframework.checker.units.qual.UnitsMultiple;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.framework.type.AnnotationClassLoader;
import org.checkerframework.javacutil.AnnotationBuilder;
import org.checkerframework.javacutil.AnnotationUtils;
public class UnitsAnnotationClassLoader extends AnnotationClassLoader {
public UnitsAnnotationClassLoader(BaseTypeChecker checker) {
super(checker);
}
/**
* Custom filter for units annotations:
*
* <p>This filter will ignore (by returning false) any units annotation which is an alias of
* another base unit annotation (identified via {@link UnitsMultiple} meta-annotation). Alias
* annotations can still be used in source code; they are converted into a base annotation by
* {@link UnitsAnnotatedTypeFactory#canonicalAnnotation(AnnotationMirror)}. This filter simply
* makes sure that the alias annotations themselves don't become part of the type hierarchy as
* their base annotations already are in the hierarchy.
*/
@Override
protected boolean isSupportedAnnotationClass(Class<? extends Annotation> annoClass) {
// build the initial annotation mirror (missing prefix)
AnnotationBuilder builder = new AnnotationBuilder(processingEnv, annoClass);
AnnotationMirror initialResult = builder.build();
// further refine to see if the annotation is an alias of some other SI Unit annotation
for (AnnotationMirror metaAnno :
initialResult.getAnnotationType().asElement().getAnnotationMirrors()) {
// TODO : special treatment of invisible qualifiers?
// If the annotation is a SI prefix multiple of some base unit, then return false classic
// Units checker does not need to load the annotations of SI prefix multiples of base units.
if (AnnotationUtils.areSameByName(
metaAnno, "org.checkerframework.checker.units.qual.UnitsMultiple")) {
return false;
}
}
// Not an alias unit
return true;
}
}