1package checkers.quals;
2
3import java.lang.annotation.Annotation;
4import java.lang.annotation.Documented;
5import java.lang.annotation.Retention;
6import java.lang.annotation.RetentionPolicy;
7
8/**
9 * Refines the qualified type of the annotated field or variable based on the
10 * qualified type of the receiver.  The annotation declares a relationship
11 * between multiple type qualifier hierarchies.
12 *
13 * <p><b>Example:</b>
14 * Consider a field, {@code lock}, that is only initialized if the
15 * enclosing object (the receiver), is marked as {@code ThreadSafe}.
16 * Such a field can be declared as:
17 *
18 * <pre><code>
19 *   private @Nullable @Dependent(result=NonNull.class, when=ThreadSafe.class)
20 *     Lock lock;
21 * </code></pre>
22 */
23@Documented
24@Retention(RetentionPolicy.RUNTIME)
25//@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
26public @interface Dependent {
27
28    /**
29     * The class of the refined qualifier to be applied.
30     */
31    Class<? extends Annotation> result();
32
33    /**
34     * The qualifier class of the receiver that causes the {@code result}
35     * qualifier to be applied.
36     */
37    Class<? extends Annotation> when();
38}
39