Fix suspend function with inline class types in reflection

#KT-34024 Fixed
This commit is contained in:
Alexander Udalov
2020-10-27 10:53:23 +01:00
parent 56f7e34e3e
commit dd33ed9297
11 changed files with 234 additions and 21 deletions
@@ -0,0 +1,39 @@
// TARGET_BACKEND: JVM
// WITH_REFLECT
import kotlin.reflect.jvm.*
import kotlin.test.assertEquals
inline class Z1(val publicX: Int) {
companion object {
val publicXRef = Z1::publicX
val publicXBoundRef = Z1(42)::publicX
}
}
inline class Z2(internal val internalX: Int) {
companion object {
val internalXRef = Z2::internalX
val internalXBoundRef = Z2(42)::internalX
}
}
inline class Z3(private val privateX: Int) {
companion object {
val privateXRef = Z3::privateX
val privateXBoundRef = Z3(42)::privateX
}
}
fun box(): String {
assertEquals("getPublicX", Z1.publicXRef.javaGetter!!.name)
assertEquals("getPublicX", Z1.publicXBoundRef.javaGetter!!.name)
assertEquals(null, Z2.internalXRef.javaGetter)
assertEquals(null, Z2.internalXBoundRef.javaGetter)
assertEquals(null, Z3.privateXRef.javaGetter)
assertEquals(null, Z3.privateXBoundRef.javaGetter)
return "OK"
}
@@ -0,0 +1,47 @@
// TARGET_BACKEND: JVM
// WITH_REFLECT
package test
import kotlin.reflect.*
import kotlin.reflect.jvm.*
import kotlin.test.assertEquals
import kotlin.test.assertTrue
inline class Z(val value: String)
class S {
suspend fun consumeZ(z: Z) {}
suspend fun produceZ(): Z = Z("")
suspend fun consumeAndProduceZ(z: Z): Z = z
}
fun box(): String {
val members = S::class.members.filterIsInstance<KFunction<*>>().associateBy(KFunction<*>::name)
members["consumeZ"]!!.let { cz ->
val czj = cz.javaMethod!!
assertTrue(czj.name.startsWith("consumeZ-"), czj.name)
assertEquals("java.lang.String, kotlin.coroutines.Continuation", czj.parameterTypes.joinToString { it.name })
val czjk = czj.kotlinFunction
assertEquals(cz, czjk)
}
members["produceZ"]!!.let { pz ->
val pzj = pz.javaMethod!!
assertTrue(pzj.name.startsWith("produceZ-"), pzj.name)
assertEquals("kotlin.coroutines.Continuation", pzj.parameterTypes.joinToString { it.name })
val pzjk = pzj!!.kotlinFunction
assertEquals(pz, pzjk)
}
members["consumeAndProduceZ"]!!.let { cpz ->
val cpzj = cpz.javaMethod!!
assertTrue(cpzj.name.startsWith("consumeAndProduceZ-"), cpzj.name)
assertEquals("java.lang.String, kotlin.coroutines.Continuation", cpzj.parameterTypes.joinToString { it.name })
val cpzjk = cpzj!!.kotlinFunction
assertEquals(cpz, cpzjk)
}
return "OK"
}