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;
/**
* Refines the qualified type of the annotated field or variable based on the qualified type of the
* receiver. The annotation declares a relationship between multiple type qualifier hierarchies.
*
* <p><b>Example:</b> Consider a field, {@code lock}, that is only initialized if the enclosing
* object (the receiver), is marked as {@code ThreadSafe}. Such a field can be declared as:
*
* <pre>{@code
* private @Nullable @Dependent(result=NonNull.class, when=ThreadSafe.class)
* Lock lock;
* }</pre>
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface Dependent {
/** The class of the refined qualifier to be applied. */
Class<? extends Annotation> result();
/**
* The qualifier class of the receiver that causes the {@code result} qualifier to be applied.
*/
Class<? extends Annotation> when();
}