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