blob: 67bb434e8483331f126ba9e47319ebecc25a9a3b [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.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* A meta-annotation that indicates that an annotation E is a postcondition annotation, i.e., E is a
* type-specialized version of {@link EnsuresQualifier} or of {@link EnsuresQualifier.List}.
*
* <ul>
* <li>If E is a type-specialized version of {@link EnsuresQualifier}, its {@code value} element
* must be an array of {@code String}s, analogous to {@link EnsuresQualifier#expression()}.
* <li>If E is a type-specialized version of {@link EnsuresQualifier.List}, its {@code value}
* element must be an array of postcondition annotations, analogous to {@link
* EnsuresQualifier.List#value()}.
* </ul>
*
* <p>The established postcondition P has type specified by the {@code qualifier} field of this
* annotation.
*
* <p>If the annotation E has elements annotated by {@link QualifierArgument}, their values are
* copied to the arguments (elements) of annotation P with the same names. Different element names
* may be used in E and P, if a {@link QualifierArgument} in E gives the name of the corresponding
* element in P.
*
* <p>For example, the following code declares a postcondition annotation for the {@link
* org.checkerframework.common.value.qual.MinLen} qualifier:
*
* <pre><code>
* {@literal @}PostconditionAnnotation(qualifier = MinLen.class)
* {@literal @}Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
* public {@literal @}interface EnsuresMinLen {
* String[] value();
* {@literal @}QualifierArgument("value")
* int targetValue() default 0;
* </code></pre>
*
* The {@code value} element holds the expressions to which the qualifier applies and {@code
* targetValue} holds the value for the {@code value} argument of {@link
* org.checkerframework.common.value.qual.MinLen}.
*
* <p>The following code then uses the annotation on a method that ensures {@code field} to be
* {@code @MinLen(2)} upon return.
*
* <pre><code>
* {@literal @}EnsuresMinLen(value = "field", targetValue = 2")
* public void setField(String argument) {
* field = "(" + argument + ")";
* }
* </code></pre>
*
* @see EnsuresQualifier
* @see QualifierArgument
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE})
public @interface PostconditionAnnotation {
/**
* The qualifier that will be established as a postcondition.
*
* <p>This element is analogous to {@link EnsuresQualifier#qualifier()}.
*/
Class<? extends Annotation> qualifier();
}