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:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user