Fix local anonymous class name error in K2MetadataCompiler

Extract the logic of approximating to denotable class supertype
from JS/KLIB and use it in metadata compiler.

^KT-20996 In Progress
This commit is contained in:
Pavel Kirpichenkov
2021-01-14 18:53:18 +03:00
parent b82a44fa63
commit 2f3f75b512
9 changed files with 200 additions and 114 deletions
@@ -0,0 +1,13 @@
package test
import lib.*
val w = W()
val v1 = fn()
val v2 = O.o()
val v3 = w.w()
// private
val e1 = o3
val e2 = w.o7
val e3 = O.o10
@@ -0,0 +1,125 @@
package lib
interface I1 {
fun i1() {}
}
interface I2 {
fun i2() {}
}
interface I3 : I2, I1
open class C {
fun c() {}
}
open class G<T> {
fun g() {}
}
private val o1 = object { fun foo() {} }
private val o2 = object : I1 {}
private val o3 = object : I1, I2 {}
private val o4 = object : I3 {}
private val o5 = object : C() {}
private val o6 = object : C(), I1, I2 {}
private val o7 = object : C(), I3 {}
private val o8 = object : G<Int>() {}
private val o9 = object : G<Int>(), I1, I2 {}
private val o10 = object : G<Int>(), I3 {}
fun fn() {
o1.foo()
o2.i1()
o3.i1()
o3.i2()
o4.i1()
o4.i2()
o5.c()
o6.c()
o6.i1()
o6.i2()
o7.c()
o7.i1()
o7.i2()
o8.g()
o9.g()
o9.i1()
o9.i2()
o10.g()
o10.i1()
o10.i2()
}
class W {
private val o1 = object { fun foo() {} }
private val o2 = object : I1 {}
private val o3 = object : I1, I2 {}
private val o4 = object : I3 {}
private val o5 = object : C() {}
private val o6 = object : C(), I1, I2 {}
private val o7 = object : C(), I3 {}
private val o8 = object : G<Int>() {}
private val o9 = object : G<Int>(), I1, I2 {}
private val o10 = object : G<Int>(), I3 {}
fun w() {
o1.foo()
o2.i1()
o3.i1()
o3.i2()
o4.i1()
o4.i2()
o5.c()
o6.c()
o6.i1()
o6.i2()
o7.c()
o7.i1()
o7.i2()
o8.g()
o9.g()
o9.i1()
o9.i2()
o10.g()
o10.i1()
o10.i2()
}
}
object O {
private val o1 = object { fun foo() {} }
private val o2 = object : I1 {}
private val o3 = object : I1, I2 {}
private val o4 = object : I3 {}
private val o5 = object : C() {}
private val o6 = object : C(), I1, I2 {}
private val o7 = object : C(), I3 {}
private val o8 = object : G<Int>() {}
private val o9 = object : G<Int>(), I1, I2 {}
private val o10 = object : G<Int>(), I3 {}
fun o() {
o1.foo()
o2.i1()
o3.i1()
o3.i2()
o4.i1()
o4.i2()
o5.c()
o6.c()
o6.i1()
o6.i2()
o7.c()
o7.i1()
o7.i2()
o8.g()
o9.g()
o9.i1()
o9.i2()
o10.g()
o10.i1()
o10.i2()
}
}
@@ -0,0 +1,10 @@
compiler/testData/compileKotlinAgainstCustomBinaries/anonymousObjectTypeMetadata/anonymousObjectTypeMetadata.kt:11:10: error: cannot access 'o3': it is private in file
val e1 = o3
^
compiler/testData/compileKotlinAgainstCustomBinaries/anonymousObjectTypeMetadata/anonymousObjectTypeMetadata.kt:12:12: error: cannot access 'o7': it is private in 'W'
val e2 = w.o7
^
compiler/testData/compileKotlinAgainstCustomBinaries/anonymousObjectTypeMetadata/anonymousObjectTypeMetadata.kt:13:12: error: cannot access 'o10': it is private in 'O'
val e3 = O.o10
^
COMPILATION_ERROR