1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
import org.checkerframework.framework.qual.ConditionalPostconditionAnnotation;
import org.checkerframework.framework.qual.PostconditionAnnotation;
import org.checkerframework.framework.qual.PreconditionAnnotation;
import org.checkerframework.framework.qual.QualifierArgument;
import testlib.util.Value;
public class CustomContractWithArgs {
// Postcondition for Value
@PostconditionAnnotation(qualifier = Value.class)
@interface EnsuresValue {
public String[] value();
@QualifierArgument("value")
public int targetValue();
}
// Conditional postcondition for LTLengthOf
@ConditionalPostconditionAnnotation(qualifier = Value.class)
@interface EnsuresValueIf {
public boolean result();
public String[] expression();
@QualifierArgument("value")
public int targetValue();
}
// Precondition for LTLengthOf
@PreconditionAnnotation(qualifier = Value.class)
@interface RequiresValue {
public String[] value();
@QualifierArgument("value")
public int targetValue();
}
class Base {
Object o;
@Value(10) Object o10;
@EnsuresValue(value = "o", targetValue = 10)
void ensures() {
o = o10;
}
@EnsuresValue(value = "o", targetValue = 9)
// :: error: (contracts.postcondition.not.satisfied)
void ensuresWrong() {
o = o10;
}
void ensuresUse() {
ensures();
o10 = o;
}
@EnsuresValueIf(expression = "o", targetValue = 10, result = true)
boolean ensuresIf(boolean b) {
if (b) {
o = o10;
return true;
} else {
return false;
}
}
@RequiresValue(value = "o", targetValue = 10)
void requires() {
o10 = o;
}
void use(boolean b) {
if (ensuresIf(b)) {
o10 = o;
requires();
}
// :: error: (assignment.type.incompatible)
o10 = o;
// :: error: (contracts.precondition.not.satisfied)
requires();
}
}
}
|