diff --git a/compiler/testData/capturedTypeApproximation/contravariant.kt b/compiler/testData/capturedTypeApproximation/contravariant.kt deleted file mode 100644 index fd826a41ef3..00000000000 --- a/compiler/testData/capturedTypeApproximation/contravariant.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Contr - -fun foo(a: Contr) {} - -// T captures 'in Int' -// lower: Contr -// upper: Contr - -// T captures 'out Int' -// lower: Contr -// upper: Contr diff --git a/compiler/testData/capturedTypeApproximation/covariant.kt b/compiler/testData/capturedTypeApproximation/covariant.kt deleted file mode 100644 index a92cb853e38..00000000000 --- a/compiler/testData/capturedTypeApproximation/covariant.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Cov - -fun foo(a: Cov) {} - -// T captures 'in Int' -// lower: Cov -// upper: Cov - -// T captures 'out Int' -// lower: Cov -// upper: Cov diff --git a/compiler/testData/capturedTypeApproximation/declarations.kt b/compiler/testData/capturedTypeApproximation/declarations.kt new file mode 100644 index 00000000000..53b8b6ad0a5 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/declarations.kt @@ -0,0 +1,10 @@ +// declarations + +class Inv +class Out +class In + +class Inv2 +class Fun + +fun foo(): #TestType# = throw Exception() \ No newline at end of file diff --git a/compiler/testData/capturedTypeApproximation/invariant.kt b/compiler/testData/capturedTypeApproximation/invariant.kt deleted file mode 100644 index 6b9a115d553..00000000000 --- a/compiler/testData/capturedTypeApproximation/invariant.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Inv - -fun foo(a: Inv) {} - -// T captures 'in Int' -// lower: Nothing -// upper: Inv - -// T captures 'out Int' -// lower: Nothing -// upper: Inv diff --git a/compiler/testData/capturedTypeApproximation/nestedCov.kt b/compiler/testData/capturedTypeApproximation/nestedCov.kt deleted file mode 100644 index 746b0b19b7c..00000000000 --- a/compiler/testData/capturedTypeApproximation/nestedCov.kt +++ /dev/null @@ -1,12 +0,0 @@ -class Cov -class Inv - -fun foo(a: Cov>) {} - -// T captures 'in Int' -// lower: Cov -// upper: Cov> - -// T captures 'out Int' -// lower: Cov -// upper: Cov> diff --git a/compiler/testData/capturedTypeApproximation/nestedInv.kt b/compiler/testData/capturedTypeApproximation/nestedInv.kt deleted file mode 100644 index 85d56c3ca38..00000000000 --- a/compiler/testData/capturedTypeApproximation/nestedInv.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Inv - -fun foo(a: Inv>) {} - -// T captures 'in Int' -// lower: Nothing -// upper: Inv> - -// T captures 'out Int' -// lower: Nothing -// upper: Inv> diff --git a/compiler/testData/capturedTypeApproximation/nestedInvLevel2.kt b/compiler/testData/capturedTypeApproximation/nestedInvLevel2.kt deleted file mode 100644 index 679118362da..00000000000 --- a/compiler/testData/capturedTypeApproximation/nestedInvLevel2.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Inv - -fun foo(a: Inv>>) {} - -// T captures 'in Int' -// lower: Nothing -// upper: Inv>> - -// T captures 'out Int' -// lower: Nothing -// upper: Inv>> diff --git a/compiler/testData/capturedTypeApproximation/nullableT.txt b/compiler/testData/capturedTypeApproximation/nullableT.txt new file mode 100644 index 00000000000..0b41c917f39 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/nullableT.txt @@ -0,0 +1,279 @@ +In + in Int. lower: In; upper: In; substitution: In + out Int. lower: In; upper: In; substitution: In + +Out + in Int. lower: Out; upper: Out; substitution: Out + out Int. lower: Out; upper: Out; substitution: Out + +Inv + in Int. lower: Nothing; upper: Inv; substitution: Inv + out Int. lower: Nothing; upper: Inv; substitution: Inv + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In; substitution: In> + out Int. lower: In>; upper: In; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out; upper: Out>; substitution: Out> + out Int. lower: Out; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv; substitution: Inv> + out Int. lower: Inv>; upper: Inv; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv; upper: Inv>; substitution: Inv> + out Int. lower: Inv; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +In>> + in Int. lower: In>>; upper: In; substitution: In>> + out Int. lower: In>>; upper: In; substitution: In>> + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + in Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + out Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + +Inv>> + in Int. lower: Inv; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv; upper: Inv>>; substitution: Inv>> + +Inv>> + in Int. lower: Inv>>; upper: Inv; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv; substitution: Inv>> + +Out>> + in Int. lower: Out; upper: Out>>; substitution: Out>> + out Int. lower: Out; upper: Out>>; substitution: Out>> + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +Out>> + in Int. lower: Out>>; upper: Out>; substitution: Out>> + out Int. lower: Out>>; upper: Out>; substitution: Out>> + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +In>> + in Int. lower: In>>; upper: In>; substitution: In>> + out Int. lower: In>>; upper: In>; substitution: In>> + +Inv>>> + in Int. lower: Inv; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Nothing; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Nothing; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>> + in Int. lower: In>>>; upper: In>>>; substitution: In>>> + out Int. lower: In>>>; upper: In>>>; substitution: In>>> + +Out>>> + in Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + +Out>>> + in Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + +In>>>> + in Int. lower: In>; upper: In>>>>; substitution: In>>>> + out Int. lower: In>; upper: In>>>>; substitution: In>>>> + +Inv>>>> + in Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + +Out>>>> + in Int. lower: Out; upper: Out>>>>; substitution: Out>>>> + out Int. lower: Out; upper: Out>>>>; substitution: Out>>>> + +Inv>>>> + in Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + +Inv>>>> + in Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + +Inv>>>> + in Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + +Out>>>> + in Int. lower: Out>; upper: Out>>>>; substitution: Out>>>> + out Int. lower: Out>; upper: Out>>>>; substitution: Out>>>> + +In>>>> + in Int. lower: In>>>>; upper: In; substitution: In>>>> + out Int. lower: In>>>>; upper: In; substitution: In>>>> + +Inv>>>> + in Int. lower: Inv>>>>; upper: Inv>; substitution: Inv>>>> + out Int. lower: Inv>>>>; upper: Inv>; substitution: Inv>>>> + +In>>>> + in Int. lower: In>>>>; upper: In>>>>; substitution: In>>>> + out Int. lower: In>>>>; upper: In>>>>; substitution: In>>>> + +In>>>>> + in Int. lower: In>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>; upper: In; substitution: In>>>>> + +Out>>>>> + in Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + out Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>; substitution: Inv>>>>> + +In>>>>> + in Int. lower: In>>; upper: In>>>>>; substitution: In>>>>> + out Int. lower: In>>; upper: In>>>>>; substitution: In>>>>> + +In>>>>> + in Int. lower: In>>>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>>>; upper: In; substitution: In>>>>> + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Inv; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Inv; upper: Inv>>>>>; substitution: Inv>>>>> + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> diff --git a/compiler/testData/capturedTypeApproximation/nullableTypeVariable.kt b/compiler/testData/capturedTypeApproximation/nullableTypeVariable.kt deleted file mode 100644 index 88e4d883c25..00000000000 --- a/compiler/testData/capturedTypeApproximation/nullableTypeVariable.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Inv - -fun foo(a: Inv) {} - -// T captures 'in Int' -// lower: Nothing -// upper: Inv - -// T captures 'out Int' -// lower: Nothing -// upper: Inv diff --git a/compiler/testData/capturedTypeApproximation/simpleT.txt b/compiler/testData/capturedTypeApproximation/simpleT.txt new file mode 100644 index 00000000000..513827a4557 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/simpleT.txt @@ -0,0 +1,279 @@ +In + in Int. lower: In; upper: In; substitution: In + out Int. lower: In; upper: In; substitution: In + +Out + in Int. lower: Out; upper: Out; substitution: Out + out Int. lower: Out; upper: Out; substitution: Out + +Inv + in Int. lower: Nothing; upper: Inv; substitution: Inv + out Int. lower: Nothing; upper: Inv; substitution: Inv + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In; substitution: In> + out Int. lower: In>; upper: In; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out; upper: Out>; substitution: Out> + out Int. lower: Out; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv; substitution: Inv> + out Int. lower: Inv>; upper: Inv; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv; upper: Inv>; substitution: Inv> + out Int. lower: Inv; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +In>> + in Int. lower: In>>; upper: In; substitution: In>> + out Int. lower: In>>; upper: In; substitution: In>> + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + in Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + out Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + +Inv>> + in Int. lower: Inv; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv; upper: Inv>>; substitution: Inv>> + +Inv>> + in Int. lower: Inv>>; upper: Inv; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv; substitution: Inv>> + +Out>> + in Int. lower: Out; upper: Out>>; substitution: Out>> + out Int. lower: Out; upper: Out>>; substitution: Out>> + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +Out>> + in Int. lower: Out>>; upper: Out>; substitution: Out>> + out Int. lower: Out>>; upper: Out>; substitution: Out>> + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +In>> + in Int. lower: In>>; upper: In>; substitution: In>> + out Int. lower: In>>; upper: In>; substitution: In>> + +Inv>>> + in Int. lower: Inv; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Nothing; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Nothing; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>> + in Int. lower: In>>>; upper: In>>>; substitution: In>>> + out Int. lower: In>>>; upper: In>>>; substitution: In>>> + +Out>>> + in Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + +Out>>> + in Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>; upper: Out>>>; substitution: Out>>> + +In>>>> + in Int. lower: In>; upper: In>>>>; substitution: In>>>> + out Int. lower: In>; upper: In>>>>; substitution: In>>>> + +Inv>>>> + in Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + +Out>>>> + in Int. lower: Out; upper: Out>>>>; substitution: Out>>>> + out Int. lower: Out; upper: Out>>>>; substitution: Out>>>> + +Inv>>>> + in Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Nothing; upper: Inv>>>>; substitution: Inv>>>> + +Inv>>>> + in Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + +Inv>>>> + in Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + out Int. lower: Inv>>>>; upper: Inv>>>>; substitution: Inv>>>> + +Out>>>> + in Int. lower: Out>; upper: Out>>>>; substitution: Out>>>> + out Int. lower: Out>; upper: Out>>>>; substitution: Out>>>> + +In>>>> + in Int. lower: In>>>>; upper: In; substitution: In>>>> + out Int. lower: In>>>>; upper: In; substitution: In>>>> + +Inv>>>> + in Int. lower: Inv>>>>; upper: Inv>; substitution: Inv>>>> + out Int. lower: Inv>>>>; upper: Inv>; substitution: Inv>>>> + +In>>>> + in Int. lower: In>>>>; upper: In>>>>; substitution: In>>>> + out Int. lower: In>>>>; upper: In>>>>; substitution: In>>>> + +In>>>>> + in Int. lower: In>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>; upper: In; substitution: In>>>>> + +Out>>>>> + in Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + out Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>; substitution: Inv>>>>> + +In>>>>> + in Int. lower: In>>; upper: In>>>>>; substitution: In>>>>> + out Int. lower: In>>; upper: In>>>>>; substitution: In>>>>> + +In>>>>> + in Int. lower: In>>>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>>>; upper: In; substitution: In>>>>> + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Inv; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Inv; upper: Inv>>>>>; substitution: Inv>>>>> + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> diff --git a/compiler/testData/capturedTypeApproximation/twoVariables.txt b/compiler/testData/capturedTypeApproximation/twoVariables.txt new file mode 100644 index 00000000000..addd24d7f2d --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/twoVariables.txt @@ -0,0 +1,179 @@ +In> + T = in Int. R = out String. lower: In>; upper: In>; substitution: In> + +Out> + T = in Int. R = out String. lower: Out>; upper: Out>; substitution: Out> + +Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + T = in Int. R = out String. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + T = in Int. R = out String. lower: Inv>; upper: Inv>; substitution: Inv> + +Fun, In> + T = in Int. R = out String. lower: Fun, In>; upper: Fun, In>; substitution: Fun, In> + +Fun, Out> + T = in Int. R = out String. lower: Fun, Out>; upper: Fun, Out>; substitution: Fun, Out> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Nothing>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, In> + T = in Int. R = out String. lower: Fun, In>; upper: Fun, In>; substitution: Fun, In> + +Fun, Out> + T = in Int. R = out String. lower: Fun, Out>; upper: Fun, Out>; substitution: Fun, Out> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Nothing>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, In> + T = in Int. R = out String. lower: Fun, In>; upper: Fun>; substitution: Fun, In> + +Fun, Out> + T = in Int. R = out String. lower: Fun, Out>; upper: Fun>; substitution: Fun, Out> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Nothing>; upper: Fun>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun>; substitution: Fun, Inv> + +Fun, In> + T = in Int. R = out String. lower: Fun, In>; upper: Fun, In>; substitution: Fun, In> + +Fun, Out> + T = in Int. R = out String. lower: Fun, Out>; upper: Fun, Out>; substitution: Fun, Out> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Nothing>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, In> + T = in Int. R = out String. lower: Fun, In>; upper: Fun, In>; substitution: Fun, In> + +Fun, Out> + T = in Int. R = out String. lower: Fun, Out>; upper: Fun, Out>; substitution: Fun, Out> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Nothing>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +Fun, Inv> + T = in Int. R = out String. lower: Fun, Inv>; upper: Fun, Inv>; substitution: Fun, Inv> + +In> + T = in Int. R = out String. lower: In>; upper: In; substitution: In> + +Out> + T = in Int. R = out String. lower: Out; upper: Out>; substitution: Out> + +Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + T = in Int. R = out String. lower: Inv>; upper: Inv; substitution: Inv> + +Inv> + T = in Int. R = out String. lower: Inv; upper: Inv>; substitution: Inv> + +Inv2, In> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out In>; substitution: Inv2, In> + +Inv2, Out> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Out>; substitution: Inv2, Out> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, In> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out In>; substitution: Inv2, In> + +Inv2, Out> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Out>; substitution: Inv2, Out> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, In> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out In>; substitution: Inv2, In> + +Inv2, Out> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Out>; substitution: Inv2, Out> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, In> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out In>; substitution: Inv2, In> + +Inv2, Out> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Out>; substitution: Inv2, Out> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, In> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out In>; substitution: Inv2, In> + +Inv2, Out> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Out>; substitution: Inv2, Out> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> + +Inv2, Inv> + T = in Int. R = out String. lower: Nothing; upper: Inv2, out Inv>; substitution: Inv2, Inv> diff --git a/compiler/testData/capturedTypeApproximation/useSiteInNullableT.txt b/compiler/testData/capturedTypeApproximation/useSiteInNullableT.txt new file mode 100644 index 00000000000..417f39b4d10 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/useSiteInNullableT.txt @@ -0,0 +1,236 @@ +In + in Int. lower: In; upper: In; substitution: In + out Int. lower: In; upper: In; substitution: In + +Out + compiler error + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +Inv + compiler error + +Inv + compiler error + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + compiler error + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + compiler error + +In> + compiler error + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + compiler error + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + compiler error + +Out> + compiler error + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +In>> + compiler error + +Out>> + compiler error + +Inv>> + in Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + out Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + +Inv>> + compiler error + +Inv>> + in Int. lower: Inv>>; upper: Inv; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv; substitution: Inv>> + +Out>> + in Int. lower: Out; upper: Out>>; substitution: Out>> + out Int. lower: Out; upper: Out>>; substitution: Out>> + +Inv>> + compiler error + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + compiler error + +In>> + in Int. lower: In>>; upper: In>>; substitution: In>> + out Int. lower: In>>; upper: In>>; substitution: In>> + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + compiler error + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>> + compiler error + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>>> + in Int. lower: In>; upper: In>>>>; substitution: In>>>> + out Int. lower: In>; upper: In>>>>; substitution: In>>>> + +Inv>>>> + compiler error + +Out>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Out>>>> + compiler error + +In>>>> + compiler error + +Inv>>>> + compiler error + +In>>>> + compiler error + +In>>>>> + in Int. lower: In>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>; upper: In; substitution: In>>>>> + +Out>>>>> + in Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + out Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + +Inv>>>>> + compiler error + +In>>>>> + compiler error + +In>>>>> + in Int. lower: In>>>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>>>; upper: In; substitution: In>>>>> + +Out>>>>> + compiler error + +Inv>>>>> + compiler error + +Out>>>>> + compiler error + +Inv>>>>> + compiler error + diff --git a/compiler/testData/capturedTypeApproximation/useSiteInT.txt b/compiler/testData/capturedTypeApproximation/useSiteInT.txt new file mode 100644 index 00000000000..a9282634456 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/useSiteInT.txt @@ -0,0 +1,236 @@ +In + in Int. lower: In; upper: In; substitution: In + out Int. lower: In; upper: In; substitution: In + +Out + compiler error + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +Inv + compiler error + +Inv + compiler error + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + compiler error + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + compiler error + +In> + compiler error + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + compiler error + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + compiler error + +Out> + compiler error + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +In>> + compiler error + +Out>> + compiler error + +Inv>> + in Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + out Int. lower: Nothing; upper: Inv>>; substitution: Inv>> + +Inv>> + compiler error + +Inv>> + in Int. lower: Inv>>; upper: Inv; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv; substitution: Inv>> + +Out>> + in Int. lower: Out; upper: Out>>; substitution: Out>> + out Int. lower: Out; upper: Out>>; substitution: Out>> + +Inv>> + compiler error + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + compiler error + +In>> + in Int. lower: In>>; upper: In>>; substitution: In>> + out Int. lower: In>>; upper: In>>; substitution: In>> + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + compiler error + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>> + compiler error + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>>> + in Int. lower: In>; upper: In>>>>; substitution: In>>>> + out Int. lower: In>; upper: In>>>>; substitution: In>>>> + +Inv>>>> + compiler error + +Out>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Out>>>> + compiler error + +In>>>> + compiler error + +Inv>>>> + compiler error + +In>>>> + compiler error + +In>>>>> + in Int. lower: In>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>; upper: In; substitution: In>>>>> + +Out>>>>> + in Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + out Int. lower: Out; upper: Out>>>>>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + +Inv>>>>> + compiler error + +In>>>>> + compiler error + +In>>>>> + in Int. lower: In>>>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>>>; upper: In; substitution: In>>>>> + +Out>>>>> + compiler error + +Inv>>>>> + compiler error + +Out>>>>> + compiler error + +Inv>>>>> + compiler error + diff --git a/compiler/testData/capturedTypeApproximation/useSiteOutNullableT.txt b/compiler/testData/capturedTypeApproximation/useSiteOutNullableT.txt new file mode 100644 index 00000000000..9499fc2f783 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/useSiteOutNullableT.txt @@ -0,0 +1,236 @@ +In + compiler error + +Out + in Int. lower: Out; upper: Out; substitution: Out + out Int. lower: Out; upper: Out; substitution: Out + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +Inv + compiler error + +Inv + compiler error + +In> + compiler error + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + compiler error + +In> + compiler error + +Out> + compiler error + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + compiler error + +Out> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +In>> + in Int. lower: In>>; upper: In; substitution: In>> + out Int. lower: In>>; upper: In; substitution: In>> + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + compiler error + +Inv>> + in Int. lower: Inv; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv; upper: Inv>>; substitution: Inv>> + +Inv>> + in Int. lower: Inv>>; upper: Inv; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv; substitution: Inv>> + +Out>> + compiler error + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +In>> + in Int. lower: In>>; upper: In>>; substitution: In>> + out Int. lower: In>>; upper: In>>; substitution: In>> + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + compiler error + +Out>>> + compiler error + +In>>> + compiler error + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>>> + compiler error + +Inv>>>> + compiler error + +Out>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Out>>>> + compiler error + +In>>>> + compiler error + +Inv>>>> + compiler error + +In>>>> + compiler error + +In>>>>> + in Int. lower: In>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>; upper: In; substitution: In>>>>> + +Out>>>>> + compiler error + +Inv>>>>> + compiler error + +Inv>>>>> + compiler error + +In>>>>> + compiler error + +In>>>>> + compiler error + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + compiler error + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> diff --git a/compiler/testData/capturedTypeApproximation/useSiteOutT.txt b/compiler/testData/capturedTypeApproximation/useSiteOutT.txt new file mode 100644 index 00000000000..e8f7cc5b063 --- /dev/null +++ b/compiler/testData/capturedTypeApproximation/useSiteOutT.txt @@ -0,0 +1,236 @@ +In + compiler error + +Out + in Int. lower: Out; upper: Out; substitution: Out + out Int. lower: Out; upper: Out; substitution: Out + +Inv + in Int. lower: Inv; upper: Inv; substitution: Inv + out Int. lower: Inv; upper: Inv; substitution: Inv + +Inv + compiler error + +Inv + compiler error + +In> + compiler error + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + in Int. lower: In>; upper: In>; substitution: In> + out Int. lower: In>; upper: In>; substitution: In> + +In> + compiler error + +In> + compiler error + +Out> + compiler error + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + in Int. lower: Out>; upper: Out>; substitution: Out> + out Int. lower: Out>; upper: Out>; substitution: Out> + +Out> + compiler error + +Out> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Nothing; upper: Inv>; substitution: Inv> + out Int. lower: Nothing; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +Inv> + compiler error + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + in Int. lower: Inv>; upper: Inv>; substitution: Inv> + out Int. lower: Inv>; upper: Inv>; substitution: Inv> + +Inv> + compiler error + +Inv> + compiler error + +In>> + in Int. lower: In>>; upper: In; substitution: In>> + out Int. lower: In>>; upper: In; substitution: In>> + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + compiler error + +Inv>> + in Int. lower: Inv; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv; upper: Inv>>; substitution: Inv>> + +Inv>> + in Int. lower: Inv>>; upper: Inv; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv; substitution: Inv>> + +Out>> + compiler error + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +Out>> + in Int. lower: Out>>; upper: Out>>; substitution: Out>> + out Int. lower: Out>>; upper: Out>>; substitution: Out>> + +Inv>> + in Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + out Int. lower: Inv>>; upper: Inv>>; substitution: Inv>> + +In>> + in Int. lower: In>>; upper: In>>; substitution: In>> + out Int. lower: In>>; upper: In>>; substitution: In>> + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + compiler error + +Inv>>> + in Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + out Int. lower: Inv>>>; upper: Inv>>>; substitution: Inv>>> + +Inv>>> + compiler error + +Out>>> + compiler error + +In>>> + compiler error + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +Out>>> + in Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + out Int. lower: Out>>>; upper: Out>>>; substitution: Out>>> + +In>>>> + compiler error + +Inv>>>> + compiler error + +Out>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Inv>>>> + compiler error + +Out>>>> + compiler error + +In>>>> + compiler error + +Inv>>>> + compiler error + +In>>>> + compiler error + +In>>>>> + in Int. lower: In>>>; upper: In; substitution: In>>>>> + out Int. lower: In>>>; upper: In; substitution: In>>>>> + +Out>>>>> + compiler error + +Inv>>>>> + compiler error + +Inv>>>>> + compiler error + +In>>>>> + compiler error + +In>>>>> + compiler error + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + compiler error + +Out>>>>> + in Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + out Int. lower: Out>>>>>; upper: Out>; substitution: Out>>>>> + +Inv>>>>> + in Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> + out Int. lower: Nothing; upper: Inv>>>>>; substitution: Inv>>>>> diff --git a/compiler/testData/capturedTypeApproximation/useSiteVarianceIn.kt b/compiler/testData/capturedTypeApproximation/useSiteVarianceIn.kt deleted file mode 100644 index 6b07a31b157..00000000000 --- a/compiler/testData/capturedTypeApproximation/useSiteVarianceIn.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Inv - -fun foo(a: Inv) {} - -// T captures 'in Int' -// lower: Inv -// upper: Inv - -// T captures 'out Int' -// lower: Inv -// upper: Inv diff --git a/compiler/testData/capturedTypeApproximation/useSiteVarianceOut.kt b/compiler/testData/capturedTypeApproximation/useSiteVarianceOut.kt deleted file mode 100644 index 1e3a5f5afa0..00000000000 --- a/compiler/testData/capturedTypeApproximation/useSiteVarianceOut.kt +++ /dev/null @@ -1,11 +0,0 @@ -class Inv - -fun foo(a: Inv) {} - -// T captures 'in Int' -// lower: Inv -// upper: Inv - -// T captures 'out Int' -// lower: Inv -// upper: Inv diff --git a/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/AbstractCapturedTypeApproximationTest.kt b/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/AbstractCapturedTypeApproximationTest.kt deleted file mode 100644 index 03fa6b47258..00000000000 --- a/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/AbstractCapturedTypeApproximationTest.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2010-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.resolve.typeApproximation - -import org.jetbrains.jet.JetLiteFixture -import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment -import org.jetbrains.jet.ConfigurationKind -import java.io.File -import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil -import org.jetbrains.jet.lang.resolve.BindingContext -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor -import org.jetbrains.jet.lang.types.TypeSubstitutor -import org.jetbrains.jet.lang.types.TypeProjectionImpl -import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns -import org.jetbrains.jet.lang.types.Variance -import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypes -import org.jetbrains.jet.JetTestUtils -import org.jetbrains.jet.lang.psi.JetPsiFactory -import org.jetbrains.jet.lang.resolve.calls.inference.CapturedTypeConstructor -import org.jetbrains.jet.lang.types.JetTypeImpl -import org.jetbrains.jet.lang.resolve.calls.inference.createCapturedType - -abstract public class AbstractCapturedTypeApproximationTest() : JetLiteFixture() { - override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.ALL) - - public fun doTest(filePath: String) { - val file = File(filePath) - val text = JetTestUtils.doLoadFile(file)!! - - val jetFile = JetPsiFactory(getProject()).createFile(text) - val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(jetFile).bindingContext - - val functions = bindingContext.getSliceContents(BindingContext.FUNCTION) - val functionFoo = functions.values().firstOrNull { it.getName().asString() == "foo" } ?: - throw AssertionError("Function 'foo' is not declared") - val typeParameter = functionFoo.getTypeParameters().first() - val parameter = functionFoo.getValueParameters().first().getType() - - val result = StringBuilder { - val endIndex = text.indexOf("// T captures") - appendln(if (endIndex == -1) text else text.substring(0, endIndex).trimTrailing()) - - for (variance in listOf(Variance.IN_VARIANCE, Variance.OUT_VARIANCE)) { - - val captured = createCapturedType(TypeProjectionImpl(variance, KotlinBuiltIns.getInstance().getIntType())) - val typeSubstitutor = TypeSubstitutor.create(mapOf(typeParameter.getTypeConstructor() to TypeProjectionImpl(captured))) - val typeWithCapturedType = typeSubstitutor.substituteWithoutApproximation( - TypeProjectionImpl(Variance.INVARIANT, parameter))!!.getType() - - val (lower, upper) = approximateCapturedTypes(typeWithCapturedType) - - appendln() - appendln("// T captures '${(captured.getConstructor() as CapturedTypeConstructor).typeProjection}'") - appendln("// lower: $lower") - appendln("// upper: $upper") - } - }.toString() - - JetTestUtils.assertEqualsToFile(file, result) - } -} diff --git a/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/CapturedTypeApproximationTest.kt b/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/CapturedTypeApproximationTest.kt new file mode 100644 index 00000000000..5d472120da5 --- /dev/null +++ b/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/CapturedTypeApproximationTest.kt @@ -0,0 +1,199 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.resolve.typeApproximation + +import org.jetbrains.jet.JetLiteFixture +import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment +import org.jetbrains.jet.ConfigurationKind +import java.io.File +import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil +import org.jetbrains.jet.lang.resolve.BindingContext +import org.jetbrains.jet.lang.types.TypeSubstitutor +import org.jetbrains.jet.lang.types.TypeProjectionImpl +import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns +import org.jetbrains.jet.lang.types.Variance +import org.jetbrains.jet.lang.types.Variance.* +import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypes +import org.jetbrains.jet.JetTestUtils +import org.jetbrains.jet.lang.psi.JetPsiFactory +import org.jetbrains.jet.lang.resolve.calls.inference.CapturedTypeConstructor +import org.jetbrains.jet.lang.resolve.calls.inference.createCapturedType +import org.jetbrains.jet.lang.diagnostics.Severity +import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypesIfNecessary +import java.util.ArrayList +import org.jetbrains.jet.lang.types.TypeProjection +import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor + +public class CapturedTypeApproximationTest() : JetLiteFixture() { + + override fun getTestDataPath() = "compiler/testData/capturedTypeApproximation/" + + override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.JDK_ONLY) + + public fun doTest(filePath: String, vararg substitutions: String) { + assert(substitutions.size() in 1..2, "Captured type approximation test requires substitutions for (T) or (T, R)") + val oneTypeVariable = substitutions.size() == 1 + + val declarationsText = JetTestUtils.doLoadFile(File(getTestDataPath() + "/declarations.kt")) + + fun analyzeTestFile(testType: String) = run { + val test = declarationsText.replace("#TestType#", testType) + val testFile = JetPsiFactory(getProject()).createFile(test) + val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(testFile).bindingContext + val functions = bindingContext.getSliceContents(BindingContext.FUNCTION) + val functionFoo = functions.values().firstOrNull { it.getName().asString() == "foo" } ?: + throw AssertionError("Function 'foo' is not declared") + Pair(bindingContext, functionFoo) + } + + fun createTestType(testTypeWithT: String): String { + val testType = testTypeWithT.replace("#T#", substitutions[0]) + if (oneTypeVariable) return testType + return testType.replace("#R#", substitutions[1]) + } + + fun createTestSubstitutions(typeParameters: List) = run { + val intType = KotlinBuiltIns.getInstance().getIntType() + val stringType = KotlinBuiltIns.getInstance().getStringType() + val t = typeParameters[0] + val r = typeParameters[1] + if (oneTypeVariable) + listOf(mapOf(t to TypeProjectionImpl(IN_VARIANCE, intType)), + mapOf(t to TypeProjectionImpl(OUT_VARIANCE, intType))) + else { + listOf(mapOf( + t to TypeProjectionImpl(IN_VARIANCE, intType), + r to TypeProjectionImpl(OUT_VARIANCE, stringType)) + ) + } + } + + fun createTestSubstitutor(testSubstitution: Map): TypeSubstitutor { + val substitutionContext = testSubstitution.map { + val (typeParameter, typeProjection) = it + typeParameter.getTypeConstructor() to TypeProjectionImpl(createCapturedType(typeProjection)) + }.toMap() + return TypeSubstitutor.create(substitutionContext) + } + + val testTypes = if (oneTypeVariable) getTestTypesForOneTypeVariable() else getTestTypesForTwoTypeVariables() + val result = StringBuilder { + for ((index, testTypeWithUnsubstitutedTypeVars) in testTypes.withIndex()) { + val testType = createTestType(testTypeWithUnsubstitutedTypeVars) + val (bindingContext, functionFoo) = analyzeTestFile(testType) + val typeParameters = functionFoo.getTypeParameters() + val type = functionFoo.getReturnType() + + appendln(testType) + + if (bindingContext.getDiagnostics().any { it.getSeverity() == Severity.ERROR }) { + appendln(" compiler error\n") + continue + } + + val testSubstitutions = createTestSubstitutions(typeParameters) + for (testSubstitution in testSubstitutions) { + val typeSubstitutor = createTestSubstitutor(testSubstitution) + val typeWithCapturedType = typeSubstitutor.substituteWithoutApproximation(TypeProjectionImpl(INVARIANT, type))!!.getType() + + val (lower, upper) = approximateCapturedTypes(typeWithCapturedType) + val substitution = approximateCapturedTypesIfNecessary(TypeProjectionImpl(INVARIANT, typeWithCapturedType)) + + append(" ") + for (typeParameter in testSubstitution.keySet()) { + if (testSubstitution.size() > 1) append("${typeParameter.getName()} = ") + append("${testSubstitution[typeParameter]}. ") + } + appendln("lower: $lower; upper: $upper; substitution: $substitution") + } + if (testTypes.lastIndex != index) appendln() + } + } + + JetTestUtils.assertEqualsToFile(File(getTestDataPath() + "/" + filePath), result.toString()) + } + + private fun getTypePatternsForOneTypeVariable() = listOf("In<#T#>", "Out<#T#>", "Inv<#T#>", "Inv", "Inv") + private fun getTypePatternsForTwoTypeVariables() = listOf("Fun<#T#, #R#>", "Inv2<#T#, #R#>") + + private fun getTestTypesForOneTypeVariable(): List { + val typePatterns = getTypePatternsForOneTypeVariable() + + val range = typePatterns.size().indices + val variants = ArrayList>() + for (i in range) variants.add(listOf(i)) + for (i in range) for (j in range) variants.add(listOf(i, j)) + + fun addRandomVariants(vararg randomVariants: String) { + variants.addAll(randomVariants.map { digits -> digits.map { digit -> digit - '0' } }) + } + assert (typePatterns.size() == 5, "Generated random variants below depend on size 5") + //From 021 the following is generated: In>>, where In = typePatterns[0], Inv = typePatterns[2], Out = typePatterns[1] + addRandomVariants("021", "111", "230", "421", "322", "120", "411", "102", "401", "012") + addRandomVariants("4243", "3103", "3043", "2003", "4442", "4143", "1440", "0303", "1302", "1332") + addRandomVariants("00200", "22213", "12114", "20304", "34014", "41333", "11214", "02004", "43244", "03004") + addRandomVariants("021022", "124230", "210030", "202344", "043234", "024400", "102121", "423143", "132121", "233001") + + return variants.map { it.fold("#T#") {(type, index) -> type.replace("#T#", typePatterns[index]) } } + } + + private fun getTestTypesForTwoTypeVariables(): List { + val typePatterns = getTypePatternsForOneTypeVariable() + + val range = typePatterns.size().indices + val result = ArrayList() + for (pattern in getTypePatternsForTwoTypeVariables()) { + for (i in range) { + result.add(typePatterns[i].replace("#T#", pattern)) + } + for (i in range) { + for (j in range) { + result.add(pattern.replace("#T#", typePatterns[i]).replace("#R#", typePatterns[j].replace("#T#", "#R#"))) + } + } + } + return result + } + + public fun testSimpleT() { + doTest("simpleT.txt", "T"); + } + + public fun testNullableT() { + doTest("nullableT.txt", "T?") + } + + public fun testUseSiteInT() { + doTest("useSiteInT.txt", "in T"); + } + + public fun testUseSiteInNullableT() { + doTest("useSiteInNullableT.txt", "in T?"); + } + + public fun testUseSiteOutT() { + doTest("useSiteOutT.txt", "out T"); + } + + public fun testUseSiteOutNullableT() { + doTest("useSiteOutNullableT.txt", "out T?"); + } + + public fun testTwoVariables() { + doTest("twoVariables.txt", "T", "R") + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/CapturedTypeApproximationTestGenerated.java b/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/CapturedTypeApproximationTestGenerated.java deleted file mode 100644 index eb2957a3c98..00000000000 --- a/compiler/tests/org/jetbrains/jet/resolve/typeApproximation/CapturedTypeApproximationTestGenerated.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2010-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.resolve.typeApproximation; - -import com.intellij.testFramework.TestDataPath; -import org.jetbrains.jet.JUnit3RunnerWithInners; -import org.jetbrains.jet.JetTestUtils; -import org.jetbrains.jet.test.InnerTestClasses; -import org.jetbrains.jet.test.TestMetadata; -import org.junit.runner.RunWith; - -import java.io.File; -import java.util.regex.Pattern; - -/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ -@SuppressWarnings("all") -@TestMetadata("compiler/testData/capturedTypeApproximation") -@TestDataPath("$PROJECT_ROOT") -@RunWith(JUnit3RunnerWithInners.class) -public class CapturedTypeApproximationTestGenerated extends AbstractCapturedTypeApproximationTest { - public void testAllFilesPresentInCapturedTypeApproximation() throws Exception { - JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/capturedTypeApproximation"), Pattern.compile("^(.+)\\.kt$"), true); - } - - @TestMetadata("contravariant.kt") - public void testContravariant() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/contravariant.kt"); - doTest(fileName); - } - - @TestMetadata("covariant.kt") - public void testCovariant() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/covariant.kt"); - doTest(fileName); - } - - @TestMetadata("invariant.kt") - public void testInvariant() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/invariant.kt"); - doTest(fileName); - } - - @TestMetadata("nestedCov.kt") - public void testNestedCov() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedCov.kt"); - doTest(fileName); - } - - @TestMetadata("nestedInv.kt") - public void testNestedInv() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedInv.kt"); - doTest(fileName); - } - - @TestMetadata("nestedInvLevel2.kt") - public void testNestedInvLevel2() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedInvLevel2.kt"); - doTest(fileName); - } - - @TestMetadata("nullableTypeVariable.kt") - public void testNullableTypeVariable() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nullableTypeVariable.kt"); - doTest(fileName); - } - - @TestMetadata("useSiteVarianceIn.kt") - public void testUseSiteVarianceIn() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/useSiteVarianceIn.kt"); - doTest(fileName); - } - - @TestMetadata("useSiteVarianceOut.kt") - public void testUseSiteVarianceOut() throws Exception { - String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/useSiteVarianceOut.kt"); - doTest(fileName); - } -} diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/CapturedTypeApproximation.kt b/core/descriptors/src/org/jetbrains/jet/lang/types/CapturedTypeApproximation.kt index 8281c44262f..65d66db3622 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/CapturedTypeApproximation.kt +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/CapturedTypeApproximation.kt @@ -51,17 +51,15 @@ private val NULLABLE_ANY = KotlinBuiltIns.getInstance().getNullableAnyType() private val NOTHING = KotlinBuiltIns.getInstance().getNothingType() -private val NULLABLE_NOTHING = KotlinBuiltIns.getInstance().getNullableNothingType() - private fun TypeArgument.toTypeProjection(): TypeProjection { assert(isConsistent) { "Only consistent enhanced type propection can be converted to type projection" } fun removeProjectionIfRedundant(variance: Variance) = if (variance == typeParameter.getVariance()) Variance.INVARIANT else variance return when { inProjection == outProjection -> TypeProjectionImpl(inProjection) - (inProjection == NOTHING || inProjection == NULLABLE_NOTHING) && typeParameter.getVariance() != Variance.IN_VARIANCE -> + inProjection == NOTHING && typeParameter.getVariance() != Variance.IN_VARIANCE -> TypeProjectionImpl(removeProjectionIfRedundant(Variance.OUT_VARIANCE), outProjection) outProjection == NULLABLE_ANY -> TypeProjectionImpl(removeProjectionIfRedundant(Variance.IN_VARIANCE), inProjection) - else -> throw AssertionError("Enhanced type projection can't be converted to type projection: $this") + else -> TypeProjectionImpl(removeProjectionIfRedundant(Variance.OUT_VARIANCE), outProjection) } } diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index 3df89598348..7bfab137e89 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -116,7 +116,6 @@ import org.jetbrains.jet.lang.resolve.java.AbstractJavaTypeSubstitutorTest import org.jetbrains.jet.plugin.intentions.declarations.AbstractJoinLinesTest import org.jetbrains.jet.codegen.AbstractScriptCodegenTest import org.jetbrains.jet.plugin.parameterInfo.AbstractFunctionParameterInfoTest -import org.jetbrains.jet.resolve.typeApproximation.AbstractCapturedTypeApproximationTest import org.jetbrains.jet.psi.patternMatching.AbstractJetPsiUnifierTest import org.jetbrains.jet.completion.weighers.AbstractBasicCompletionWeigherTest import org.jetbrains.jet.completion.weighers.AbstractSmartCompletionWeigherTest @@ -172,10 +171,6 @@ fun main(args: Array) { model("constraintSystem", extension = "bounds") } - testClass(javaClass()) { - model("capturedTypeApproximation") - } - testClass(javaClass()) { model("psi", testMethod = "doParsingTest", pattern = "^(.*)\\.kts?$") model("parseCodeFragment/expression", testMethod = "doExpressionCodeFragmentParsingTest", extension = "kt")