1f1790d60e
For the same reason as in the previous commit: descriptors are cached via weak references in moduleByClassLoader.kt and can be garbage-collected at any point. So different instances of KParameterImpl representing the same parameter may store different instances of descriptors.
47 lines
1.4 KiB
Kotlin
Vendored
47 lines
1.4 KiB
Kotlin
Vendored
// TARGET_BACKEND: JVM
|
|
// WITH_REFLECT
|
|
// FILE: box.kt
|
|
|
|
import kotlin.reflect.KMutableProperty
|
|
import kotlin.test.assertEquals
|
|
|
|
inline fun check(message: String, generate: () -> Any?) {
|
|
val x1: Any?
|
|
val x2: Any?
|
|
try {
|
|
x1 = generate()
|
|
|
|
// Force clear the internal maps, as if the weak values in them are garbage-collected.
|
|
kotlin.reflect.jvm.internal.ReflectionFactoryImpl.clearCaches()
|
|
|
|
x2 = generate()
|
|
} catch (e: Throwable) {
|
|
throw AssertionError("Fail $message", e)
|
|
}
|
|
|
|
assertEquals(x1, x2, "Fail equals $message")
|
|
assertEquals(x2, x1, "Fail equals $message")
|
|
assertEquals(x1.hashCode(), x2.hashCode(), "Fail hashCode $message")
|
|
}
|
|
|
|
class C(c: Any) {
|
|
fun Any.a(a: Any): Any = a
|
|
|
|
var <X> X.x: X
|
|
get() = this
|
|
set(value) {}
|
|
}
|
|
|
|
fun box(): String {
|
|
check("constructor parameter") { C::class.constructors.single().parameters.single() }
|
|
check("instance parameter") { C::class.members.single { it.name == "a" }.parameters[0] }
|
|
check("value parameter") { C::class.members.single { it.name == "a" }.parameters[1] }
|
|
|
|
check("extension receiver parameter") { (C::class.members.single { it.name == "x" } as KMutableProperty<*>).parameters[1] }
|
|
|
|
// TODO: depends on KT-13490
|
|
// check("property setter parameter") { (C::class.members.single { it.name == "x" } as KMutableProperty<*>).setter.parameters[2] }
|
|
|
|
return "OK"
|
|
}
|