@Documented @Retention(value=RUNTIME) @Target(value={METHOD,CONSTRUCTOR}) @ConditionalPostconditionAnnotation(qualifier=LTLengthOf.class) @InheritedAnnotation @Repeatable(value=EnsuresLTLengthOfIf.List.class) public @interface EnsuresLTLengthOfIf
As an example, consider the following method:
@EnsuresLTLengthOfIf(
expression = "end",
result = true,
targetValue = "array",
offset = "#1 - 1"
)
public boolean tryShiftIndex(@NonNegative int x) {
int newEnd = end - x;
if (newEnd < 0) {
return false;
}
end = newEnd;
return true;
}
Calling this function ensures that the field end of the this object is of type
@LTLengthOf(value = "array", offset = "x - 1"), for the value x that is passed as
the argument. This allows the Index Checker to verify that end + x is an index into
array in the following code:
public void useTryShiftIndex(@NonNegative int x) {
if (tryShiftIndex(x)) {
Arrays.fill(array, end, end + x, null);
}
}
LTLengthOf,
EnsuresLTLengthOf| Modifier and Type | Required Element and Description |
|---|---|
String[] |
expression
Java expression(s) that are less than the length of the given sequences after the method
returns the given result.
|
boolean |
result
The return value of the method that needs to hold for the postcondition to hold.
|
String[] |
targetValue
Sequences, each of which is longer than each of the expressions' value after the method
returns the given result.
|
public abstract String[] expression
public abstract boolean result
@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.