[FIR] Fix naming of local classes when serializing metadata

^KT-63655: Fixed
^KT-63901: Fixed
^KT-63988: Fixed
This commit is contained in:
vladislav.grechko
2024-01-29 18:02:09 +01:00
committed by Space Team
parent 78876b32e9
commit 54858c2118
49 changed files with 327 additions and 182 deletions
@@ -0,0 +1,15 @@
MODULE main
CLASS LocalNestedClassesKt$foo1$X$Y.class
CLASS METADATA
Property: class.metadata.companionObject
K1
null
K2
Z
CLASS LocalNestedClassesKt$foo2$X$Y.class
CLASS METADATA
Property: class.metadata.companionObject
K1
null
K2
Companion
@@ -0,0 +1,144 @@
// TARGET_BACKEND: JVM_IR
// WITH_REFLECT
// JVM_ABI_K1_K2_DIFF: K2 names companion objects in metadata correctly
import kotlin.reflect.KType
import kotlin.reflect.full.memberProperties
val KType.str get() = classifier.toString()
class A {
fun foo(): String {
class Nested {
inner class Inner {
val prop = this
}
}
return Nested().Inner()::class.memberProperties.iterator().next().returnType.str
}
}
fun foo1(): String {
class X {
inner class Y {
companion object Z
val prop = Z
}
}
return X.Y::class.memberProperties.iterator().next().returnType.str
}
fun foo2(): String {
class X {
inner class Y {
companion object
val prop = Companion
}
}
return X.Y::class.memberProperties.iterator().next().returnType.str
}
fun foo3(): String {
class X {
inner class Y {
val prop = object {}
}
}
return X.Y::class.memberProperties.iterator().next().returnType.str
}
fun foo4(): String {
var res = ""
class A {
inner class B {
inner class C {
fun bar() {
class D {
val prop = this
}
res = D::class.memberProperties.iterator().next().returnType.str
}
init {
bar()
}
}
}
}
A().B().C()
return res
}
fun foo5(): String {
var res = ""
object {
fun bar() {
return object {
fun foo() {
class A {
inner class B {
val prop = this
init {
res = prop::class.memberProperties.iterator().next().returnType.str
}
}
}
A().B()
}
}.foo()
}
}.bar()
return res
}
fun foo6(): String {
var res = ""
object {
fun bar() {
class A {
inner class B {
inner class C {
val prop = this
init {
res = prop::class.memberProperties.iterator().next().returnType.str
}
}
}
}
A().B().C()
}
}.bar()
return res
}
fun foo7(): String {
var res = ""
val x = object {
val y = object {
val z = object {
val y = this
init {
res = this::class.memberProperties.iterator().next().returnType.str
}
}
}
}
return res
}
fun box(): String {
if (A().foo() != "class A\$foo\$Nested\$Inner") return "Fail 1"
if (foo1() != "class LocalNestedClassesKt\$foo1\$X\$Y\$Z") return "Fail 2"
if (foo2() != "class LocalNestedClassesKt\$foo2\$X\$Y\$Companion") return "Fail 3"
if (foo3() != "class LocalNestedClassesKt\$foo3\$X\$Y\$prop\$1") return "Fail 4"
if (foo4() != "class LocalNestedClassesKt\$foo4\$A\$B\$C\$bar\$D") return "Fail 5"
if (foo5() != "class LocalNestedClassesKt\$foo5\$1\$bar\$1\$foo\$A\$B") return "Fail 6"
if (foo6() != "class LocalNestedClassesKt\$foo6\$1\$bar\$A\$B\$C") return "Fail 7"
if (foo7() != "class LocalNestedClassesKt\$foo7\$x\$1\$y\$1\$z\$1") return "Fail 8"
return "OK"
}