Restore support for local class literals in annotation arguments
This was broken in c1ab08c8ce where we started to represent KClassValue
as a ClassId of the referenced class + number of times it's been wrapped
into kotlin.Array. Local classes do not have a sane ClassId, so in this
change we restore the old behavior by representing KClassValue with a
sealed class value instead
#KT-29891 Fixed
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
// TARGET_BACKEND: JVM
|
||||
// WITH_REFLECT
|
||||
|
||||
package test
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
annotation class Anno(val k1: KClass<*>, val k2: KClass<*>, val k3: KClass<*>)
|
||||
|
||||
fun box(): String {
|
||||
class L
|
||||
|
||||
@Anno(k1 = L::class, k2 = Array<L?>::class, k3 = Array<out Array<L>>::class)
|
||||
class M
|
||||
|
||||
val fqName = "test.LocalClassLiteralKt\$box\$L"
|
||||
assertEquals(
|
||||
"[@test.Anno(k1=class $fqName, k2=class [L$fqName;, k3=class [[L$fqName;)]",
|
||||
M::class.annotations.toString()
|
||||
)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,14 +1,25 @@
|
||||
// CLASS_NAME_SUFFIX: A$foo$Local
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
class A {
|
||||
annotation class Ann(val info: String)
|
||||
|
||||
fun foo() {
|
||||
@Ann("class") class Local {
|
||||
@Ann("fun") fun foo(): Local = this
|
||||
@field:Ann("val") val x = foo()
|
||||
annotation class Bnn(val klass: KClass<*>)
|
||||
|
||||
@Ann("inner") inner class Inner
|
||||
fun foo() {
|
||||
@Ann("class")
|
||||
class Local {
|
||||
@Ann("fun")
|
||||
fun foo(): Local = this
|
||||
|
||||
@field:Ann("val")
|
||||
@Bnn(Local::class)
|
||||
val x = foo()
|
||||
|
||||
@Ann("inner")
|
||||
@Bnn(Array<Array<out Local>>::class)
|
||||
inner class Inner
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
@A.Ann(info = "class") local final class `A$foo$Local`
|
||||
|
||||
public constructor `A$foo$Local`()
|
||||
@field:A.Ann(info = "val") public final val x: `A$foo$Local`
|
||||
@A.Bnn(klass = A$foo$Local::class) @field:A.Ann(info = "val") public final val x: `A$foo$Local`
|
||||
@A.Ann(info = "fun") public final fun foo(): `A$foo$Local`
|
||||
|
||||
@A.Ann(info = "inner") local final inner class Inner {
|
||||
@A.Ann(info = "inner") @A.Bnn(klass = kotlin.Array<kotlin.Array<A$foo$Local>>::class) local final inner class Inner {
|
||||
public constructor Inner()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user