blob: 2596dbea864d280667baa5cd94f5a7627524f02c [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 conditional postcondition annotation to indicate that a method ensures that certain expressions
* have a certain qualifier once the method has terminated, and if the result is as indicated by
* {@code result}. The expressions for which the qualifier holds after the method's execution are
* indicated by {@code expression} and are specified using a string. The qualifier is specified by
* the {@code qualifier} annotation element.
*
* <p>Here is an example use:
*
* <pre><code>
* {@literal @}EnsuresQualifierIf(result = true, expression = "#1", qualifier = Odd.class)
* boolean isOdd(final int p1, int p2) {
* return p1 % 2 == 1;
* }
* </code></pre>
*
* <p>This annotation is only applicable to methods with a boolean return type.
*
* <p>Some type systems have specialized versions of this annotation, such as {@code
* org.checkerframework.checker.nullness.qual.EnsuresNonNullIf} and {@code
* org.checkerframework.checker.lock.qual.EnsuresLockHeldIf}.
*
* @see EnsuresQualifier
* @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@InheritedAnnotation
@Repeatable(EnsuresQualifierIf.List.class)
public @interface EnsuresQualifierIf {
/**
* Returns the Java expressions for which the qualifier holds if the method terminates with return
* value {@link #result()}.
*
* @return the Java expressions for which the qualifier holds if the method terminates with return
* value {@link #result()}
* @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions
*/
String[] expression();
/**
* Returns the qualifier that is guaranteed to hold if the method terminates with return value
* {@link #result()}.
*
* @return the qualifier that is guaranteed to hold if the method terminates with return value
* {@link #result()}
*/
Class<? extends Annotation> qualifier();
/**
* Returns the return value of the method that needs to hold for the postcondition to hold.
*
* @return the return value of the method that needs to hold for the postcondition to hold
*/
boolean result();
/**
* A wrapper annotation that makes the {@link EnsuresQualifierIf} annotation repeatable.
*
* <p>Programmers generally do not need to write this. It is created by Java when a programmer
* writes more than one {@link EnsuresQualifierIf} annotation at the same location.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@InheritedAnnotation
@interface List {
/**
* Return the repeatable annotations.
*
* @return the repeatable annotations
*/
EnsuresQualifierIf[] value();
}
}