blob: 011a9ffa9eff6a00152c46856874e513bc9dc5a6 [file] [log] [blame]
package org.checkerframework.checker.nullness.qual;
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;
import org.checkerframework.framework.qual.InheritedAnnotation;
import org.checkerframework.framework.qual.PostconditionAnnotation;
// TODO: In a fix for https://tinyurl.com/cfissue/1917, add the text: Every prefix expression is
// also non-null; for example, {@code @EnsuresNonNull(expression="a.b.c")} implies that both {@code
// a.b} and {@code a.b.c} are non-null.
/**
* Indicates that the value expressions are non-null just after a method call, if the method
* terminates successfully.
*
* <p>This postcondition annotation is useful for methods that initialize a field:
*
* <pre><code>
* {@literal @}EnsuresNonNull("theMap")
* void initialize() {
* theMap = new HashMap&lt;&gt;();
* }
* </code></pre>
*
* It can also be used for a method that fails if a given expression is null:
*
* <pre><code>
* /** Throws an exception if the argument is null. *&#47;
* {@literal @}EnsuresNonNull("#1")
* void assertNonNull(Object arg) { ... }
* </code></pre>
*
* @see NonNull
* @see org.checkerframework.checker.nullness.NullnessChecker
* @checker_framework.manual #nullness-checker Nullness Checker
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@PostconditionAnnotation(qualifier = NonNull.class)
@InheritedAnnotation
@Repeatable(EnsuresNonNull.List.class)
public @interface EnsuresNonNull {
/**
* Returns Java expressions that are {@link NonNull} after successful method termination.
*
* @return Java expressions that are {@link NonNull} after successful method termination
* @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions
*/
String[] value();
/**
* A wrapper annotation that makes the {@link EnsuresNonNull} annotation repeatable.
*
* <p>Programmers generally do not need to write this. It is created by Java when a programmer
* writes more than one {@link EnsuresNonNull} annotation at the same location.
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@PostconditionAnnotation(qualifier = NonNull.class)
@InheritedAnnotation
@interface List {
/**
* Returns the repeatable annotations.
*
* @return the repeatable annotations
*/
EnsuresNonNull[] value();
}
}