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() 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" return "OK"
} }
@@ -28,6 +28,6 @@ class CloneableClassScope(
) )
companion object { 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.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.builtins.jvm.CloneableClassScope
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.load.java.JvmAbi 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) 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 = private fun mapJvmFunctionSignature(descriptor: FunctionDescriptor): JvmFunctionSignature.KotlinFunction =
JvmFunctionSignature.KotlinFunction( JvmFunctionSignature.KotlinFunction(
JvmMemberSignature.Method(mapName(descriptor), descriptor.computeJvmDescriptor(withName = false)) JvmMemberSignature.Method(mapName(descriptor), descriptor.computeJvmDescriptor(withName = false))