[FIR] Carefully process constructors of inner and nested classes in the tower

If there is an expression receiver, we should process constructors only
  of inner classes. Constructors of nested classes can be called only
  on classifier

^KT-65333 Fixed
This commit is contained in:
Dmitriy Novozhilov
2024-02-27 12:36:29 +02:00
committed by Space Team
parent 67557ce731
commit 5b01396a11
15 changed files with 182 additions and 25 deletions
@@ -0,0 +1,74 @@
// TARGET_BACKEND: JVM_IR
// ISSUE: KT-65333
// FILE: BaseClass.java
public class BaseClass {
public class Inner {
public String box() {
return "BaseClass";
}
}
}
// FILE: BaseInterface.java
public interface BaseInterface {
class Inner {
public String box() {
return "BaseInterface";
}
}
}
// FILE: main.kt
class A: BaseClass(), BaseInterface
class B : BaseClass(), BaseInterface {
class Inner {
fun box(): String = "B"
}
}
class C : BaseClass(), BaseInterface {
inner class Inner {
fun box(): String = "C"
}
}
object D : BaseClass(), BaseInterface
object E : BaseClass(), BaseInterface {
class Inner {
fun box(): String = "E"
}
}
object F : BaseClass()
object G : BaseClass() {
class Inner {
fun box(): String = "G"
}
}
object H : BaseInterface
object I : BaseInterface {
class Inner {
fun box(): String = "I"
}
}
fun check(actual: String, expected: String) {
if (expected != actual) {
throw AssertionError("\nExpected: $expected\nActual: $actual\n")
}
}
fun box(): String {
check(A().Inner().box(), "BaseClass")
// check(A.Inner().box(), "BaseInterface")
// check(B().Inner().box(), "BaseInterface")
check(B.Inner().box(), "B")
check(C().Inner().box(), "C")
// check(C.Inner().box(), "BaseInterface")
check(D.Inner().box(), "BaseClass")
check(E.Inner().box(), "E")
check(F.Inner().box(), "BaseClass")
check(G.Inner().box(), "G")
// check(H.Inner().box(), "E")
check(I.Inner().box(), "I")
return "OK"
}