package checkers.quals;
import java.lang.annotation.*;
import javax.annotation.processing.SupportedAnnotationTypes;
import checkers.basetype.BaseTypeChecker;
import checkers.types.AnnotatedTypeMirror;
/**
* An annotation that lists the type qualifiers supported by the annotated
* {@code Checker}.
*
* <p>
* Example:
*
* <pre>
* @TypeQualifiers( { Nullable.class, NonNull.class } )
* public class NullnessChecker extends BaseTypeChecker { ... }
* </pre>
*
* The checker reflectively queries this annotation, and subsequently the
* meta-annotations on the annotations in the list, to form the result of
* {@link BaseTypeChecker#getSupportedTypeQualifiers()} construct the type
* qualifier hierarchy. The framework also uses this annotation to determine
* which annotations may be added to an {@link AnnotatedTypeMirror} (an
* annotation may be added if and only if it is a {@link TypeQualifier} and it
* appears in in the list of supported annotations from {@link TypeQualifiers}).
*
* <p>
*
* This annotation differs from {@link SupportedAnnotationTypes} in that it
* simply lists the annotations that a processor (checker) recognizes -- any
* annotations not in the list should be ignored, but files lacking these
* annotations should still be processed. {@link SupportedAnnotationTypes}, on
* the other hand, instructs the compiler to skip processing of any file that
* does not contain any supported annotations.
*
* Another difference is that {@link SupportedAnnotationTypes}'s argument is an
* array of strings, whereas {@link TypeQualifiers}'s argument is an array of
* classes. The former supports the use of "*" for specifying multiple
* annotations (which is less important for {@link TypeQualifiers} than for
* {@link SupportedAnnotationTypes}), while the latter permits type-checking,
* refactoring by IDEs, etc.
*
* @see BaseTypeChecker#getSupportedTypeQualifiers()
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target ( { ElementType.TYPE } )
public @interface TypeQualifiers {
/** The type qualifier annotations supported by the annotated {@code Checker}.
* The checker may also support other, non-type-qualifier, annotations. */
Class<? extends Annotation>[] value();
}