Fix KotlinReflectionInternalError on encountering 'clone' in a class

`RuntimeTypeMapper.mapSignature` threw exception because the descriptor
for `clone` was created manually in CloneableClassScope and therefore it
didn't have a JVM signature as in deserialized descriptors, and wasn't
recognized as a Java method either.

 #KT-22923 Fixed
This commit is contained in:
Alexander Udalov
2019-05-29 11:36:37 +02:00
parent 2857c62dba
commit 4c9e9b1f3a
3 changed files with 12 additions and 4 deletions
@@ -30,8 +30,7 @@ fun box(): String {
MyCustomMembers::class.functions()
)
// TODO: KT-22923
// assertEquals(listOf("clone", "equals", "hashCode", "toString"), MyCloneable::class.functions())
assertEquals(listOf("clone", "equals", "hashCode", "toString"), MyCloneable::class.functions())
return "OK"
}
@@ -28,6 +28,6 @@ class CloneableClassScope(
)
companion object {
internal val CLONE_NAME = Name.identifier("clone")
val CLONE_NAME = Name.identifier("clone")
}
}
@@ -18,6 +18,7 @@ package kotlin.reflect.jvm.internal
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.builtins.jvm.CloneableClassScope
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.load.java.JvmAbi
@@ -199,7 +200,7 @@ internal object RuntimeTypeMapper {
}
}
if (DescriptorFactory.isEnumValueOfMethod(function) || DescriptorFactory.isEnumValuesMethod(function)) {
if (isKnownBuiltInFunction(function)) {
return mapJvmFunctionSignature(function)
}
@@ -235,6 +236,14 @@ internal object RuntimeTypeMapper {
)
}
private fun isKnownBuiltInFunction(descriptor: FunctionDescriptor): Boolean {
if (DescriptorFactory.isEnumValueOfMethod(descriptor) || DescriptorFactory.isEnumValuesMethod(descriptor)) return true
if (descriptor.name == CloneableClassScope.CLONE_NAME && descriptor.valueParameters.isEmpty()) return true
return false
}
private fun mapJvmFunctionSignature(descriptor: FunctionDescriptor): JvmFunctionSignature.KotlinFunction =
JvmFunctionSignature.KotlinFunction(
JvmMemberSignature.Method(mapName(descriptor), descriptor.computeJvmDescriptor(withName = false))