File: NTDTest.java

package info (click to toggle)
checker-framework-java 3.0.1%2Bds2-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 22,736 kB
  • sloc: java: 145,286; xml: 785; sh: 456; makefile: 401; perl: 26
file content (70 lines) | stat: -rw-r--r-- 3,112 bytes parent folder | download | duplicates (3)
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
import testlib.nontopdefault.qual.NTDMiddle;
import testlib.nontopdefault.qual.NTDTop;

// Testcase for Issue 948:
// https://github.com/typetools/checker-framework/issues/948
// @skip-test

// Problem: @DefaultFor TypeUseLocation.RECEIVER is not applied to inner class constructor
// receivers. The inner class constructor receivers currently take on the default qualifier of
// the hierarchy. All other methods take on the default qualifier set by TypeUseLocation.RECEIVER.

// DefaultQualifierInHierarchy is @NTDMiddle
// DefaultFor receivers is @NTDTop

class NTDConstructorReceiverTest {

    // default method receiver is @NTDTop
    void DefaultMethodReceiver() {

        // this line produces a methodref.receiver.bound.invalid error, but it shouldn't if the
        // receiver for inner class constructors are properly applied
        Demand<InnerDefaultReceiver> constructorReference = InnerDefaultReceiver::new;

        // this line does not as the receiver is explicitly declared to be @NTDTop
        Demand<InnerExplicitReceiver> constructorReference2 = InnerExplicitReceiver::new;
    }

    class InnerDefaultReceiver {
        // takes on the default receiver for inner class constructor methods
        InnerDefaultReceiver(NTDConstructorReceiverTest NTDConstructorReceiverTest.this) {
            // The type of NTDConstructorReceiverTest.this should be @NTDTop.
            // :: error: (assignment.type.incompatible)
            @NTDMiddle NTDConstructorReceiverTest that = NTDConstructorReceiverTest.this;
            // :: error: (assignment.type.incompatible)
            @NTDMiddle NTDConstructorReceiverTest.@NTDTop InnerDefaultReceiver thatInner = this;
        }

        void method() {
            // The TypeUseLocation.RECEIVER only applies to the outer most type, so
            // NTDConstructorReceiverTest.this is given the
            @NTDMiddle NTDConstructorReceiverTest that = NTDConstructorReceiverTest.this;
            // :: error: (assignment.type.incompatible)
            @NTDMiddle InnerDefaultReceiver thatInner = this;
        }

        void explicit(@NTDTop NTDConstructorReceiverTest.@NTDTop InnerDefaultReceiver this) {
            // :: error: (assignment.type.incompatible)
            @NTDMiddle NTDConstructorReceiverTest that = NTDConstructorReceiverTest.this;
            // :: error: (assignment.type.incompatible)
            @NTDMiddle NTDConstructorReceiverTest.@NTDTop InnerDefaultReceiver thatInner = this;
        }
    }

    class InnerExplicitReceiver {
        // explicitly set the receiver to be @NTDTop
        InnerExplicitReceiver(@NTDTop NTDConstructorReceiverTest NTDConstructorReceiverTest.this) {
            // :: error: (assignment.type.incompatible)
            @NTDMiddle NTDConstructorReceiverTest that = NTDConstructorReceiverTest.this;
        }

        InnerExplicitReceiver(
                @NTDMiddle NTDConstructorReceiverTest NTDConstructorReceiverTest.this, int i) {
            @NTDMiddle NTDConstructorReceiverTest that = NTDConstructorReceiverTest.this;
        }
    }
}

interface Demand<R> {
    R supply();
}