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
|
import testlib.flowexpression.qual.FlowExp;
public class Canonicalization {
class LockExample {
protected final Object myLock = new Object();
protected @FlowExp("myLock") Object locked;
protected @FlowExp("this.myLock") Object locked2;
public @FlowExp("myLock") Object getLocked() {
return locked;
}
}
class Use {
final LockExample lockExample1 = new LockExample();
final Object myLock = new Object();
@FlowExp("lockExample1.myLock") Object o1 = lockExample1.locked;
@FlowExp("lockExample1.myLock") Object o2 = lockExample1.locked2;
@FlowExp("myLock")
// :: error: (assignment.type.incompatible)
Object o3 = lockExample1.locked;
@FlowExp("this.myLock")
// :: error: (assignment.type.incompatible)
Object o4 = lockExample1.locked2;
@FlowExp("lockExample1.myLock") Object oM1 = lockExample1.getLocked();
@FlowExp("myLock")
// :: error: (assignment.type.incompatible)
Object oM2 = lockExample1.getLocked();
@FlowExp("this.myLock")
// :: error: (assignment.type.incompatible)
Object oM3 = lockExample1.getLocked();
}
}
|