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 e5293b616e7..c03210c8cde 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/RuntimeTypeMapper.kt @@ -18,14 +18,18 @@ package kotlin.reflect.jvm.internal import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.PrimitiveType +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.descriptors.JavaConstructorDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor import org.jetbrains.kotlin.load.java.sources.JavaSourceElement import org.jetbrains.kotlin.load.java.structure.reflect.* +import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement +import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -41,6 +45,7 @@ import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Member import java.lang.reflect.Method +import kotlin.jvm.internal.KotlinClass import kotlin.reflect.KotlinReflectionInternalError internal sealed class JvmFunctionSignature { @@ -107,10 +112,26 @@ internal sealed class JvmPropertySignature { val (name, desc) = JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver) ?: throw KotlinReflectionInternalError("No field signature for property: $descriptor") - string = JvmAbi.getterName(name) + "()" + desc + + val moduleSuffix = + if (descriptor.visibility == Visibilities.INTERNAL && + descriptor.containingDeclaration is ClassDescriptor) { + val containingDeclaration = descriptor.containingDeclaration as ClassDescriptor + val sourceElement = containingDeclaration.source as KotlinJvmBinarySourceElement + val klass = (sourceElement.binaryClass as ReflectKotlinClass).klass + val moduleName = klass.getAnnotation(KotlinClass::class.java).moduleName + "$" + sanitizeAsJavaIdentifier(moduleName) + } + else { + "" + } + string = JvmAbi.getterName(name) + moduleSuffix + "()" + desc } } + private fun sanitizeAsJavaIdentifier(str: String): String = + str.replace("[^\\p{L}\\p{Digit}]".toRegex(), "_") + override fun asString(): String = string }