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