package org.checkerframework.framework.qual; 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; /** * A meta-annotation indicating that an annotation type prevents whole-program inference. For * example, if the definition of {@code @Inject} is meta-annotated with {@code * @IgnoreInWholeProgramInference}:<br> * <tt>@IgnoreInWholeProgramInference</tt><br> * <tt>@interface Inject { }</tt><br> * then no type qualifier will be inferred for any field annotated by {@code @Inject}. * * <p>This is appropriate for fields that are set reflectively, so there are no calls in client code * that type inference can learn from. Examples of qualifiers that should be meta-annotated with * {@code @IgnoreInWholeProgramInference} include <a * href="https://docs.oracle.com/javaee/7/api/javax/inject/Inject.html">{@code @Inject}</a>, <a * href="https://docs.oracle.com/javaee/7/api/javax/inject/Singleton.html">{@code @Singleton}</a>, * and <a * href="https://types.cs.washington.edu/plume-lib/api/plume/Option.html">{@code @Option}</a>. * * <p>See {@link * org.checkerframework.common.wholeprograminference.WholeProgramInferenceScenes#updateInferredFieldType} */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface IgnoreInWholeProgramInference {}