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:
@@ -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