blob: 66a51941739eb64d78e74f4b24a4fac05331fbf3 [file] [log] [blame]
package org.checkerframework.framework.qual;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* A meta-annotation to specify all the qualifiers that the given qualifier is an immediate subtype
* of. This provides a declarative way to specify the type qualifier hierarchy. (Alternatively, the
* hierarchy can be defined procedurally by subclassing {@link
* org.checkerframework.framework.type.QualifierHierarchy} or {@link
* org.checkerframework.framework.type.TypeHierarchy}.)
*
* <p>Example:
*
* <pre> @SubtypeOf( { Nullable.class } )
* public @interface NonNull {}
* </pre>
*
* <p>For the top qualifier in the qualifier hierarchy (i.e., the qualifier that is a supertype of
* all other qualifiers in the given hierarchy), use an empty set of values:
*
* <pre><code> @SubtypeOf( {} )
* public @interface Nullable {}
*
* &#64;SubtypeOf( {} )
* public @interface MaybeAliased {}
* </code></pre>
*
* <p>Together, all the {@code @SubtypeOf} meta-annotations fully describe the type qualifier
* hierarchy.
*
* @checker_framework.manual #creating-declarative-hierarchy Declaratively defining the qualifier
* hierarchy
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
@AnnotatedFor("nullness")
public @interface SubtypeOf {
/** An array of the supertype qualifiers of the annotated qualifier. */
Class<? extends Annotation>[] value();
}