Fix for KT-3335: Creating imported super class' inner class fails in codegen

#KT-3335 Fixed
This commit is contained in:
Michael Bogdanov
2015-10-30 16:48:51 +03:00
parent 3bd7f87d2b
commit 65b85711e3
7 changed files with 177 additions and 6 deletions
@@ -0,0 +1,40 @@
open class A(val value: String) {
inner class B(val s: String) {
val result = value + "_" + s
}
}
class C : A("fromC") {
fun classReceiver() = B("OK")
fun superReceiver() = super.B("OK")
fun newAReceiver() = A("fromA").B("OK")
fun aReceiver(): B {
val a = A("fromA")
return a.B("OK")
}
fun A.extReceiver() = this.B("OK")
fun extReceiver() = A("fromA").extReceiver()
}
fun box(): String {
val receiver = C()
var result = receiver.classReceiver().result
if (result != "fromC_OK") return "fail 1: $result"
result = receiver.superReceiver().result
if (result != "fromC_OK") return "fail 2: $result"
result = receiver.aReceiver().result
if (result != "fromA_OK") return "fail 3: $result"
result = receiver.newAReceiver().result
if (result != "fromA_OK") return "fail 3: $result"
result = receiver.extReceiver().result
if (result != "fromA_OK") return "fail 3: $result"
return "OK"
}
@@ -0,0 +1,42 @@
open class A(val value: String) {
inner class B(val s: String) {
val result = value + "_" + s
}
}
class C : A("fromC") {
inner class X: A("fromX") {
fun classReceiver() = B("OK")
fun superReceiver() = super.B("OK")
fun superXReceiver() = super@X.B("OK")
fun superXCastReceiver() = (this@X as A).B("OK")
fun superCReceiver() = super@C.B("OK")
fun superCCastReceiver() = (this@C as A).B("OK")
}
}
fun box(): String {
val receiver = C().X()
var result = receiver.classReceiver().result
if (result != "fromX_OK") return "fail 1: $result"
result = receiver.superReceiver().result
if (result != "fromX_OK") return "fail 2: $result"
result = receiver.superXReceiver().result
if (result != "fromX_OK") return "fail 3: $result"
result = receiver.superXCastReceiver().result
if (result != "fromX_OK") return "fail 4: $result"
result = receiver.superCReceiver().result
if (result != "fromC_OK") return "fail 3: $result"
result = receiver.superCCastReceiver().result
if (result != "fromC_OK") return "fail 4: $result"
return "OK"
}
@@ -0,0 +1,34 @@
class C(val value: String = "C") {
inner class B(val s: String) {
val result = value + "_" + s
}
fun classReceiver() = B("OK")
fun newCReceiver() = C("newC").B("OK")
fun cReceiver(): B {
val c = C("newC")
return c.B("OK")
}
fun C.extReceiver1() = this.B("OK")
fun extReceiver() = C("newC").extReceiver1()
}
fun box(): String {
val receiver = C()
var result = receiver.classReceiver().result
if (result != "C_OK") return "fail 1: $result"
result = receiver.cReceiver().result
if (result != "newC_OK") return "fail 3: $result"
result = receiver.newCReceiver().result
if (result != "newC_OK") return "fail 3: $result"
result = receiver.extReceiver().result
if (result != "newC_OK") return "fail 3: $result"
return "OK"
}
@@ -0,0 +1,16 @@
open class A(val s: String) {
open inner class B(val s: String) {
fun testB() = s + this@A.s
}
open inner class C(): A("C") {
fun testC() =
B("B_").testB()
}
}
fun box(): String {
val res = A("A").C().testC()
return if (res == "B_C") "OK" else res;
}