@Documented @Retention(value=RUNTIME) @Target(value={METHOD,CONSTRUCTOR}) @PostconditionAnnotation(qualifier=LTLengthOf.class) @InheritedAnnotation @Repeatable(value=EnsuresLTLengthOf.List.class) public @interface EnsuresLTLengthOf
Consider the following example, from the Index Checker's regression tests:
  @EnsuresLTLengthOf(value = "end", targetValue = "array", offset = "#1 - 1")
  public void shiftIndex(@NonNegative int x) {
      int newEnd = end - x;
      if (newEnd < 0) throw new RuntimeException();
      end = newEnd;
  }
 
 
 where end is annotated as @NonNegative @LTEqLengthOf("array") int end;
 This method guarantees that end has type @LTLengthOf(value="array", offset="x -
 1") after the method returns. This is useful in cases like this one:
 
 public void useShiftIndex(@NonNegative int x) {
    // :: error: (argument)
    Arrays.fill(array, end, end + x, null);
    shiftIndex(x);
    Arrays.fill(array, end, end + x, null);
 }
 Arrays.fill is rejected (hence the comment about an error). But, after
 calling shiftIndex(x), end has an annotation that allows the end + x to
 be accepted as @LTLengthOf("array").LTLengthOf| Modifier and Type | Required Element and Description | 
|---|---|
| String[] | targetValueSequences, each of which is longer than the each of the expressions' value on successful method
 termination. | 
| String[] | valueThe Java expressions that are less than the length of the given sequences on successful method
 termination. | 
@JavaExpression public abstract String[] value
@JavaExpression @QualifierArgument(value="value") public abstract String[] targetValue
@JavaExpression @QualifierArgument(value="offset") public abstract String[] offset
offset element must ether be empty or the same
 length as targetValue.