blob: f8d57e4c0cad2e50ffa9d4961fe0e6a225ccabcf [file] [log] [blame]
package org.checkerframework.framework.qual;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* A precondition annotation to indicate that a method requires certain expressions to have a
* certain qualifier at the time of the call to the method. The expressions for which the annotation
* must hold after the method's execution are indicated by {@code expression} and are specified
* using a string. The qualifier is specified by {@code qualifier}.
*
* @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Repeatable(RequiresQualifier.List.class)
public @interface RequiresQualifier {
/**
* Returns the Java expressions for which the annotation need to be present.
*
* @return the Java expressions for which the annotation need to be present
* @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions
*/
String[] expression();
/**
* Returns the qualifier that is required.
*
* @return the qualifier that is required
*/
Class<? extends Annotation> qualifier();
/**
* A wrapper annotation that makes the {@link RequiresQualifier} annotation repeatable.
*
* <p>Programmers generally do not need to write this. It is created by Java when a programmer
* writes more than one {@link RequiresQualifier} annotation at the same location.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@interface List {
/**
* Returns the repeatable annotations.
*
* @return the repeatable annotations
*/
RequiresQualifier[] value();
}
}