diff --git a/compiler/testData/codegen/box/reflection/mapping/methodsFromObject.kt b/compiler/testData/codegen/box/reflection/mapping/methodsFromObject.kt index 3817253e1b5..b3198acc7c3 100644 --- a/compiler/testData/codegen/box/reflection/mapping/methodsFromObject.kt +++ b/compiler/testData/codegen/box/reflection/mapping/methodsFromObject.kt @@ -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" } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/CloneableClassScope.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/CloneableClassScope.kt index 99bd7d56cf2..11f8e98536d 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/CloneableClassScope.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/builtins/jvm/CloneableClassScope.kt @@ -28,6 +28,6 @@ class CloneableClassScope( ) companion object { - internal val CLONE_NAME = Name.identifier("clone") + val CLONE_NAME = Name.identifier("clone") } } diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt index 66135b7ac80..d6610ff6462 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -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))