import testlib.flowexpression.qual.FlowExp;

public class ViewpointAdaptation {

    class MyClass {
        protected final Object field = new Object();

        protected @FlowExp("field") Object annotatedField1;

        protected @FlowExp("this.field") Object annotatedField2;

        public @FlowExp("field") Object getAnnotatedField1() {
            return annotatedField1;
        }
    }

    class Use {
        final MyClass myClass1 = new MyClass();
        final Object field = new Object();

        @FlowExp("this.myClass1.field") Object o1 = myClass1.annotatedField1;

        @FlowExp("this.myClass1.field") Object o2 = myClass1.annotatedField2;

        @FlowExp("field")
        // :: error: (assignment.type.incompatible)
        Object o3 = myClass1.annotatedField1;

        @FlowExp("this.field")
        // :: error: (assignment.type.incompatible)
        Object o4 = myClass1.annotatedField2;

        @FlowExp("field")
        // :: error: (assignment.type.incompatible)
        Object oM2 = myClass1.getAnnotatedField1();

        @FlowExp("this.field")
        // :: error: (assignment.type.incompatible)
        Object oM3 = myClass1.getAnnotatedField1();
    }
}
