blob: 588bf67a145be9caab17037332e3858656cafaed [file] [log] [blame]
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;
/**
* This annotation can be used two ways:
*
* <p>1. As 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>
* {@code @IgnoreInWholeProgramInference}<br>
* {@code @interface Inject {}}<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>2. As a field annotation indicating that no type qualifier will be inferred for the field it
* annotates.
*
* <p>See
* org.checkerframework.common.wholeprograminference.WholeProgramInferenceScenes#updateFromFieldAssignment
*
* @checker_framework.manual #whole-program-inference-ignores-some-code Whole-program inference
* ignores some code
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD})
public @interface IgnoreInWholeProgramInference {}