Labeled this & super to nested class' outer is an error
#KT-1174 In Progress
This commit is contained in:
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.*;
|
||||
import org.jetbrains.jet.lang.psi.*;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
||||
import org.jetbrains.jet.lang.resolve.DescriptorResolver;
|
||||
import org.jetbrains.jet.lang.resolve.name.LabelName;
|
||||
|
||||
import java.util.Collection;
|
||||
@@ -151,6 +152,13 @@ public class LabelResolver {
|
||||
context.trace.record(LABEL_TARGET, targetLabel, element);
|
||||
context.trace.record(REFERENCE_TARGET, thisReference, declarationDescriptor);
|
||||
|
||||
if (declarationDescriptor instanceof ClassDescriptor) {
|
||||
ClassDescriptor classDescriptor = (ClassDescriptor) declarationDescriptor;
|
||||
if (!DescriptorResolver.checkHasOuterClassInstance(context.scope, context.trace, targetLabel, classDescriptor)) {
|
||||
return LabeledReceiverResolutionResult.labelResolutionFailed();
|
||||
}
|
||||
}
|
||||
|
||||
return LabeledReceiverResolutionResult.labelResolutionSuccess(thisReceiver);
|
||||
}
|
||||
else if (size == 0) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class Outer() {
|
||||
class Inner() {
|
||||
inner class Inner() {
|
||||
val outer: Outer get() = this@Outer
|
||||
}
|
||||
|
||||
|
||||
@@ -3,13 +3,13 @@ open class A {
|
||||
}
|
||||
|
||||
open class B : A() {
|
||||
class E {
|
||||
inner class E {
|
||||
val foo: String = super<A>@B.foo
|
||||
}
|
||||
}
|
||||
|
||||
class C : B() {
|
||||
class D {
|
||||
inner class D {
|
||||
val foo: String = super<B>@C.foo
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ open class N() : M(), K {
|
||||
|
||||
override fun x() : Int = 20
|
||||
|
||||
open class C() : K {
|
||||
open inner class C() : K {
|
||||
fun test1() = x()
|
||||
fun test2() = super<M>@N.x()
|
||||
fun test3() = super<K>@N.x()
|
||||
|
||||
@@ -11,7 +11,7 @@ class A : K {
|
||||
override fun foo() = "A.foo"
|
||||
override fun bar() = "A.bar"
|
||||
|
||||
class B : K {
|
||||
inner class B : K {
|
||||
override fun foo() = "B.foo"
|
||||
override fun bar() = "B.bar"
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ class A : K() {
|
||||
override val foo = "A.foo"
|
||||
override fun bar() = "A.bar"
|
||||
|
||||
class B : K() {
|
||||
inner class B : K() {
|
||||
override val foo = "B.foo"
|
||||
override fun bar() = "B.bar"
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ class C() : B() {
|
||||
fun getInt() = 0
|
||||
|
||||
class D() {
|
||||
class B() {
|
||||
inner class B() {
|
||||
fun foo() {
|
||||
<!VARIABLE_EXPECTED!>this@D<!> = D()
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ class TestBackingFieldsVisibility() {
|
||||
|
||||
val x = <!INACCESSIBLE_BACKING_FIELD!>$namespaceLevelVar<!>
|
||||
|
||||
class Inner() {
|
||||
inner class Inner() {
|
||||
val z = this@TestBackingFieldsVisibility.$x
|
||||
}
|
||||
|
||||
@@ -169,4 +169,4 @@ class T() {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
trait Trait {
|
||||
fun bar() = 42
|
||||
}
|
||||
|
||||
class Outer : Trait {
|
||||
class Nested {
|
||||
val t = this<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>@Outer<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>bar<!>()
|
||||
val s = super<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>@Outer<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>bar<!>()
|
||||
|
||||
inner class NestedInner {
|
||||
val t = this<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>@Outer<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>bar<!>()
|
||||
val s = super<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>@Outer<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>bar<!>()
|
||||
}
|
||||
}
|
||||
|
||||
inner class Inner {
|
||||
val t = this@Outer.bar()
|
||||
val s = super@Outer.bar()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
trait Trait {
|
||||
fun bar() = 42
|
||||
}
|
||||
|
||||
class Outer : Trait {
|
||||
fun foo() {
|
||||
val <!UNUSED_VARIABLE!>t<!> = this@Outer
|
||||
val <!UNUSED_VARIABLE!>s<!> = super@Outer.bar()
|
||||
|
||||
class Local : Trait {
|
||||
val t = this@Outer
|
||||
val s = super@Outer.bar()
|
||||
|
||||
inner class Inner {
|
||||
val t = this@Local
|
||||
val s = super@Local.bar()
|
||||
|
||||
val tt = this@Outer
|
||||
val ss = super@Outer.bar()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,15 +5,21 @@ class Outer {
|
||||
class Nested {
|
||||
fun f() = <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>function()<!>
|
||||
fun g() = <!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>property<!>
|
||||
fun h() = this<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>@Outer<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>function<!>()
|
||||
fun i() = this<!INACCESSIBLE_OUTER_CLASS_EXPRESSION!>@Outer<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>property<!>
|
||||
}
|
||||
|
||||
inner class Inner {
|
||||
fun innerFun() = function()
|
||||
val innerProp = property
|
||||
fun innerThisFun() = this@Outer.function()
|
||||
val innerThisProp = this@Outer.property
|
||||
|
||||
inner class InnerInner {
|
||||
fun f() = innerFun()
|
||||
fun g() = innerProp
|
||||
fun h() = this@Inner.innerFun()
|
||||
fun i() = this@Inner.innerProp
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ class A<E>() : C(), T {
|
||||
<!DEBUG_INFO_MISSING_UNRESOLVED!>super<!><C><!UNRESOLVED_REFERENCE!>@B<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>bar<!>()
|
||||
}
|
||||
|
||||
class B : T {
|
||||
inner class B : T {
|
||||
fun test() {
|
||||
super<T>.foo();
|
||||
super<<!NOT_A_SUPERTYPE!>C<!>>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>bar<!>()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class A(val a:Int) {
|
||||
class B() {
|
||||
inner class B() {
|
||||
fun Char.xx() : Any {
|
||||
this : Char
|
||||
val <!UNUSED_VARIABLE!>a<!> = {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
class A(val a:Int) {
|
||||
|
||||
class B() {
|
||||
inner class B() {
|
||||
val x = this@B : B
|
||||
val y = this@A : A
|
||||
val z = this : B
|
||||
@@ -14,7 +14,7 @@
|
||||
`C`super<C>@A.bar()
|
||||
}
|
||||
|
||||
class B : T {
|
||||
inner class B : T {
|
||||
fun test() {
|
||||
`T`super<T>.foo();
|
||||
`C`super<C>@A.bar()
|
||||
|
||||
@@ -2419,6 +2419,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
||||
doTest("compiler/testData/diagnostics/tests/inner/extensionFun.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("innerThisSuper.kt")
|
||||
public void testInnerThisSuper() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/inner/innerThisSuper.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("localClass.kt")
|
||||
public void testLocalClass() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/inner/localClass.kt");
|
||||
@@ -2429,6 +2434,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
||||
doTest("compiler/testData/diagnostics/tests/inner/localClassInsideNested.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("localThisSuper.kt")
|
||||
public void testLocalThisSuper() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/inner/localThisSuper.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("modality.kt")
|
||||
public void testModality() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/inner/modality.kt");
|
||||
@@ -4063,9 +4073,9 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage
|
||||
doTest("compiler/testData/diagnostics/tests/thisAndSuper/thisInFunctionLiterals.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("thisInNestedClasses.kt")
|
||||
public void testThisInNestedClasses() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/thisAndSuper/thisInNestedClasses.kt");
|
||||
@TestMetadata("thisInInnerClasses.kt")
|
||||
public void testThisInInnerClasses() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/thisAndSuper/thisInInnerClasses.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("thisInPropertyInitializer.kt")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
class A(val a:Int) {
|
||||
|
||||
class B() {
|
||||
inner class B() {
|
||||
val x = this@B : B
|
||||
val y = this@A : A
|
||||
val z = this : B
|
||||
|
||||
Reference in New Issue
Block a user