diff options
Diffstat (limited to 'engine/src/core/checkers/quals/SubtypeOf.java')
-rw-r--r-- | engine/src/core/checkers/quals/SubtypeOf.java | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/engine/src/core/checkers/quals/SubtypeOf.java b/engine/src/core/checkers/quals/SubtypeOf.java new file mode 100644 index 0000000..ffc8be0 --- /dev/null +++ b/engine/src/core/checkers/quals/SubtypeOf.java @@ -0,0 +1,59 @@ +package checkers.quals; + +import java.lang.annotation.*; + +/** + * A meta-annotation to specify all the qualifiers that the given qualifier + * is a subtype of. This provides a declarative way to specify the type + * qualifier hierarchy. (Alternatively, the hierarchy can be defined + * procedurally by subclassing {@link checkers.types.QualifierHierarchy} or + * {@link checkers.types.TypeHierarchy}.) + * + * <p> + * Example: + * <pre> @SubtypeOf( { Nullable.class } ) + * public @interface NonNull { } + * </pre> + * + * <p> + * + * If a qualified type is a subtype of the same type without any qualifier, + * then use <code>Unqualified.class</code> in place of a type qualifier + * class. For example, to express that <code>@Encrypted <em>C</em></code> + * is a subtype of <code><em>C</em></code> (for every class + * <code><em>C</em></code>), and likewise for <code>@Interned</code>, write: + * + * <pre> @SubtypeOf(Unqualified.class) + * public @interface Encrypted { } + * + * @SubtypeOf(Unqualified.class) + * public @interface Interned { } + * </pre> + * + * <p> + * + * For the root type 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> @SubtypeOf( { } ) + * public @interface Nullable { } + * + * @SubtypeOf( {} ) + * public @interface ReadOnly { } + * </pre> + * + * <p> + * Together, all the @SubtypeOf meta-annotations fully describe the type + * qualifier hierarchy. + * No @SubtypeOf meta-annotation is needed on (or can be written on) the + * Unqualified pseudo-qualifier, whose position in the hierarchy is + * inferred from the meta-annotations on the explicit qualifiers. + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.ANNOTATION_TYPE) +public @interface SubtypeOf { + /** An array of the supertype qualifiers of the annotated qualifier **/ + Class<? extends Annotation>[] value(); +} |