import checkers.igj.quals.*;
@I
public class MethodInvocation {
@Mutable MethodInvocation mutable;
@Immutable MethodInvocation immutable;
@ReadOnly MethodInvocation readOnly;
void mutableReciever() @Mutable { }
void immutableReceiver() @Immutable { }
void readOnlyReceiver() @ReadOnly { }
void assignsFieldsMethod() @AssignsFields { }
void testMutable() @Mutable {
mutableReciever();
immutableReceiver(); // should emit error
readOnlyReceiver();
assignsFieldsMethod();
this.mutableReciever();
this.immutableReceiver(); // should emit error
this.readOnlyReceiver();
this.assignsFieldsMethod();
mutable.mutableReciever();
mutable.immutableReceiver(); // should emit error
mutable.readOnlyReceiver();
mutable.assignsFieldsMethod();
immutable.mutableReciever(); // should emit error
immutable.immutableReceiver();
immutable.readOnlyReceiver();
immutable.assignsFieldsMethod(); // should emit error
readOnly.mutableReciever(); // should emit error
readOnly.immutableReceiver(); // should emit error
readOnly.readOnlyReceiver();
readOnly.assignsFieldsMethod(); // should emit error
}
void testImmutable() @Immutable {
mutableReciever(); // should emit error
immutableReceiver();
readOnlyReceiver();
assignsFieldsMethod(); // should emit error
this.mutableReciever(); // should emit error
this.immutableReceiver();
this.readOnlyReceiver();
this.assignsFieldsMethod(); // should emit error
mutable.mutableReciever();
mutable.immutableReceiver(); // should emit error
mutable.readOnlyReceiver();
mutable.assignsFieldsMethod();
immutable.mutableReciever(); // should emit error
immutable.immutableReceiver();
immutable.readOnlyReceiver();
immutable.assignsFieldsMethod(); // should emit error
readOnly.mutableReciever(); // should emit error
readOnly.immutableReceiver(); // should emit error
readOnly.readOnlyReceiver();
readOnly.assignsFieldsMethod(); // should emit error
}
void testReadOnly() @ReadOnly {
mutableReciever(); // should emit error
immutableReceiver(); // should emit error
readOnlyReceiver();
assignsFieldsMethod(); // should emit error
this.mutableReciever(); // should emit error
this.immutableReceiver(); // should emit error
this.readOnlyReceiver();
this.assignsFieldsMethod(); // should emit error
mutable.mutableReciever();
mutable.immutableReceiver(); // should emit error
mutable.readOnlyReceiver();
mutable.assignsFieldsMethod();
immutable.mutableReciever(); // should emit error
immutable.immutableReceiver();
immutable.readOnlyReceiver();
immutable.assignsFieldsMethod(); // should emit error
readOnly.mutableReciever(); // should emit error
readOnly.immutableReceiver(); // should emit error
readOnly.readOnlyReceiver();
readOnly.assignsFieldsMethod(); // should emit error
}
void testAssignsFields() @AssignsFields {
mutableReciever(); // should emit error
immutableReceiver(); // should emit error
readOnlyReceiver();
assignsFieldsMethod();
this.mutableReciever(); // should emit error
this.immutableReceiver(); // should emit error
this.readOnlyReceiver();
this.assignsFieldsMethod();
mutable.mutableReciever();
mutable.immutableReceiver(); // should emit error
mutable.readOnlyReceiver();
mutable.assignsFieldsMethod();
immutable.mutableReciever(); // should emit error
immutable.immutableReceiver();
immutable.readOnlyReceiver();
immutable.assignsFieldsMethod(); // should emit error
readOnly.mutableReciever(); // should emit error
readOnly.immutableReceiver(); // should emit error
readOnly.readOnlyReceiver();
readOnly.assignsFieldsMethod(); // should emit error
}
void testExpressionMutable() {
(new @Mutable MethodInvocation()).mutableReciever();
(new @Mutable MethodInvocation()).immutableReceiver(); // should emit error
(new @Mutable MethodInvocation()).readOnlyReceiver();
(new @Mutable MethodInvocation()).assignsFieldsMethod();
(new @Mutable MethodInvocation()).mutableReciever();
(new @Mutable MethodInvocation()).immutableReceiver(); // should emit error
(new @Mutable MethodInvocation()).readOnlyReceiver();
(new @Mutable MethodInvocation()).assignsFieldsMethod();
(true ? mutable : new @Mutable MethodInvocation()).mutableReciever();
(true ? mutable : new @Mutable MethodInvocation()).immutableReceiver(); // should emit error
(true ? mutable : new @Mutable MethodInvocation()).readOnlyReceiver();
(true ? mutable : new @Mutable MethodInvocation()).assignsFieldsMethod();
}
void testExpressionImmutable() {
(new @Immutable MethodInvocation()).mutableReciever(); // should emit error
(new @Immutable MethodInvocation()).immutableReceiver();
(new @Immutable MethodInvocation()).readOnlyReceiver();
(new @Immutable MethodInvocation()).assignsFieldsMethod(); // should emit error
(new @Immutable MethodInvocation()).mutableReciever(); // should emit error
(new @Immutable MethodInvocation()).immutableReceiver();
(new @Immutable MethodInvocation()).readOnlyReceiver();
(new @Immutable MethodInvocation()).assignsFieldsMethod(); // should emit error
(true ? immutable : new @Immutable MethodInvocation()).mutableReciever(); // should emit error
(true ? immutable : new @Immutable MethodInvocation()).immutableReceiver();
(true ? immutable : new @Immutable MethodInvocation()).readOnlyReceiver();
(true ? immutable : new @Immutable MethodInvocation()).assignsFieldsMethod(); // should emit error
}
void testExpressionReadOnly() {
(true ? mutable : new @Immutable MethodInvocation()).mutableReciever(); // should emit error
(true ? mutable : new @Immutable MethodInvocation()).immutableReceiver(); // should emit error
(true ? mutable : new @Immutable MethodInvocation()).readOnlyReceiver();
(true ? mutable : new @Immutable MethodInvocation()).assignsFieldsMethod(); // should emit error
(true ? immutable : new @Mutable MethodInvocation()).mutableReciever(); // should emit error
(true ? immutable : new @Mutable MethodInvocation()).immutableReceiver(); // should emit error
(true ? immutable : new @Mutable MethodInvocation()).readOnlyReceiver();
(true ? immutable : new @Mutable MethodInvocation()).assignsFieldsMethod(); // should emit error
}
public static <A, B> java.util.Map<A, B> forMap(
java.util.Map<? super A, ? extends B> map, final B defaultValue) {
return forMap(map, null);
}
void testAnonClasses() @ReadOnly {
@I MethodInvocation m = new @I MethodInvocation();
@I MethodInvocation n = new @I MethodInvocation() {};
}
}