| 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 {} |
| * |
| * @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(); |
| } |