blob: 770e19a788e278c8f92a188b0f389c42e9a29138 [file] [log] [blame]
package org.checkerframework.checker.index.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;
import org.checkerframework.framework.qual.JavaExpression;
import org.checkerframework.framework.qual.SubtypeOf;
/**
* The annotated expression evaluates to an integer whose value is less than the lengths of all the
* given sequences. This annotation is rarely used; it is more common to use {@code @}{@link
* IndexFor}.
*
* <p>For example, an expression with type {@code @LTLengthOf({"a", "b"})} is less than both {@code
* a.length} and {@code b.length}. The sequences {@code a} and {@code b} might have different
* lengths.
*
* <p>The {@code @LTLengthOf} annotation takes an optional {@code offset} element. If it is
* nonempty, then the annotated expression plus the expression in {@code offset[i]} is less than the
* length of the sequence specified by {@code value[i]}.
*
* <p>For example, suppose expression {@code e} has type {@code @LTLengthOf(value = {"a", "b"},
* offset = {"-1", "x"})}. Then {@code e - 1} is less than {@code a.length}, and {@code e + x} is
* less than {@code b.length}.
*
* <p>It is an error to write a {@code LTLengthOf} annotation with a different number of sequences
* and offsets, if an offset is included.
*
* @see IndexFor
* @checker_framework.manual #index-checker Index Checker
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf(LTEqLengthOf.class)
public @interface LTLengthOf {
/** Sequences, each of which is longer than the annotated expression's value. */
@JavaExpression
public String[] value();
/**
* This expression plus the annotated expression is less than the length of the sequence. The
* {@code offset} element must ether be empty or the same length as {@code value}.
*
* <p>The expressions in {@code offset} may be addition/subtraction of any number of Java
* expressions. For example, {@code @LessThanLengthOf(value = "a", offset = "x + y + 2"}}.
*/
@JavaExpression
String[] offset() default {};
}