[JVM IR] Copy metadata in IrFieldBuilder.
This fixes an issue with lateinit properties where the metadata from the original field was not copied to the nullable field in LateinitLowering. Also consolidated related tests.
This commit is contained in:
committed by
Alexander Udalov
parent
f5f25224b0
commit
e226561150
@@ -0,0 +1,33 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
class K {
|
||||
lateinit var value: String
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val p = K::value
|
||||
|
||||
assertNotNull(p.javaField, "Fail p field")
|
||||
|
||||
val getter = p.javaGetter!!
|
||||
val setter = p.javaSetter!!
|
||||
|
||||
assertEquals(K::class.java.getMethod("getValue"), getter)
|
||||
assertEquals(K::class.java.getMethod("setValue", String::class.java), setter)
|
||||
|
||||
assertNull(p.getter.javaConstructor)
|
||||
assertNull(p.setter.javaConstructor)
|
||||
|
||||
val k = K()
|
||||
assertFails("Fail k getter") { getter.invoke(k) } // lateinit not yet initialized
|
||||
setter.invoke(k, "foo")
|
||||
assertEquals("foo", getter.invoke(k), "Fail k setter")
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -4,25 +4,28 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.*
|
||||
|
||||
class K(var value: Long)
|
||||
|
||||
fun box(): String {
|
||||
val p = K::value
|
||||
|
||||
assert(p.javaField != null) { "Fail p field" }
|
||||
assertNotNull(p.javaField, "Fail p field")
|
||||
|
||||
val getter = p.javaGetter!!
|
||||
val setter = p.javaSetter!!
|
||||
|
||||
assertEquals(getter, K::class.java.getMethod("getValue"))
|
||||
assertEquals(setter, K::class.java.getMethod("setValue", Long::class.java))
|
||||
assertEquals(K::class.java.getMethod("getValue"), getter)
|
||||
assertEquals(K::class.java.getMethod("setValue", Long::class.java), setter)
|
||||
|
||||
assertNull(p.getter.javaConstructor)
|
||||
assertNull(p.setter.javaConstructor)
|
||||
|
||||
val k = K(42L)
|
||||
assert(getter.invoke(k) == 42L) { "Fail k getter" }
|
||||
assertEquals(42L, getter.invoke(k), "Fail k getter")
|
||||
setter.invoke(k, -239L)
|
||||
assert(getter.invoke(k) == -239L) { "Fail k setter" }
|
||||
assertEquals(-239L, getter.invoke(k), "Fail k setter")
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.*
|
||||
import kotlin.reflect.full.*
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
class K(private var value: Long)
|
||||
|
||||
fun box(): String {
|
||||
val p = K::class.declaredMemberProperties.single() as KMutableProperty1<K, Long>
|
||||
|
||||
assertNotNull(p.javaField, "Fail p field")
|
||||
assertNull(p.javaGetter, "Fail p getter")
|
||||
assertNull(p.javaSetter, "Fail p setter")
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// TARGET_BACKEND: JVM
|
||||
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.*
|
||||
|
||||
var foo = "foo"
|
||||
|
||||
class A {
|
||||
var bar = "bar"
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val fooGetter = ::foo.getter.javaMethod ?: return "Fail fooGetter"
|
||||
assertEquals("foo", fooGetter.invoke(null))
|
||||
|
||||
val fooSetter = ::foo.setter.javaMethod ?: return "Fail fooSetter"
|
||||
fooSetter.invoke(null, "foof")
|
||||
assertEquals("foof", foo)
|
||||
|
||||
assertNull(::foo.getter.javaConstructor)
|
||||
assertNull(::foo.setter.javaConstructor)
|
||||
|
||||
|
||||
val a = A()
|
||||
val barGetter = A::bar.getter.javaMethod ?: return "Fail barGetter"
|
||||
assertEquals("bar", barGetter.invoke(a))
|
||||
|
||||
val barSetter = A::bar.setter.javaMethod ?: return "Fail barSetter"
|
||||
barSetter.invoke(a, "barb")
|
||||
assertEquals("barb", a.bar)
|
||||
|
||||
assertNull(A::bar.getter.javaConstructor)
|
||||
assertNull(A::bar.setter.javaConstructor)
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
// WITH_REFLECT
|
||||
|
||||
import kotlin.reflect.jvm.*
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.*
|
||||
|
||||
var topLevel = "123"
|
||||
|
||||
@@ -13,19 +13,21 @@ val fileFacadeClass = object {}::class.java.enclosingClass
|
||||
fun box(): String {
|
||||
val p = ::topLevel
|
||||
|
||||
assert(p.javaField != null) { "Fail p field" }
|
||||
val field = p.javaField!!
|
||||
assertEquals(fileFacadeClass, field.getDeclaringClass())
|
||||
assertNotNull(p.javaField, "Fail p field")
|
||||
assertEquals(p.javaField!!.getDeclaringClass(), fileFacadeClass)
|
||||
|
||||
val getter = p.javaGetter!!
|
||||
val setter = p.javaSetter!!
|
||||
|
||||
assertEquals(getter, fileFacadeClass.getMethod("getTopLevel"))
|
||||
assertEquals(setter, fileFacadeClass.getMethod("setTopLevel", String::class.java))
|
||||
assertEquals(fileFacadeClass.getMethod("getTopLevel"), getter)
|
||||
assertEquals(fileFacadeClass.getMethod("setTopLevel", String::class.java), setter)
|
||||
|
||||
assert(getter.invoke(null) == "123") { "Fail k getter" }
|
||||
assertNull(p.getter.javaConstructor)
|
||||
assertNull(p.setter.javaConstructor)
|
||||
|
||||
assertEquals("123", getter.invoke(null), "Fail k getter")
|
||||
setter.invoke(null, "456")
|
||||
assert(getter.invoke(null) == "456") { "Fail k setter" }
|
||||
assertEquals("456", getter.invoke(null), "Fail k setter")
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user