159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage checkers.quals;
259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.lang.annotation.Annotation;
459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.lang.annotation.Documented;
559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.lang.annotation.Retention;
659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.lang.annotation.RetentionPolicy;
759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/**
959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Refines the qualified type of the annotated field or variable based on the
1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * qualified type of the receiver.  The annotation declares a relationship
1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * between multiple type qualifier hierarchies.
1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <p><b>Example:</b>
1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Consider a field, {@code lock}, that is only initialized if the
1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * enclosing object (the receiver), is marked as {@code ThreadSafe}.
1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Such a field can be declared as:
1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *
1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <pre><code>
1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *   private @Nullable @Dependent(result=NonNull.class, when=ThreadSafe.class)
2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta *     Lock lock;
2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * </code></pre>
2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */
2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta@Documented
2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta@Retention(RetentionPolicy.RUNTIME)
2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta//@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic @interface Dependent {
2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * The class of the refined qualifier to be applied.
3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    Class<? extends Annotation> result();
3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta
3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    /**
3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * The qualifier class of the receiver that causes the {@code result}
3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     * qualifier to be applied.
3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta     */
3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta    Class<? extends Annotation> when();
3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta}
39