diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 9015bcde149..65ad1e2251a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -959,7 +959,7 @@ public class KotlinTypeMapper { if (!(descriptor instanceof ConstructorDescriptor) && descriptor.getVisibility() == Visibilities.INTERNAL && !DescriptorUtilsKt.isPublishedApi(descriptor)) { - return name + "$" + NameUtils.sanitizeAsJavaIdentifier(moduleName); + return InternalNameMapper.mangleInternalName(name, moduleName); } return name; @@ -1510,4 +1510,24 @@ public class KotlinTypeMapper { } return TypeSignatureMappingKt.computeInternalName(classDescriptor, typeMappingConfiguration); } + + public static class InternalNameMapper { + public static String mangleInternalName(@NotNull String name, @NotNull String moduleName) { + return name + "$" + NameUtils.sanitizeAsJavaIdentifier(moduleName); + } + + public static boolean canBeMangledInternalName(@NotNull String name) { + return name.indexOf('$') != -1; + } + + @Nullable + public static String internalNameWithoutModuleSuffix(@NotNull String name) { + int indexOfDollar = name.indexOf('$'); + if (indexOfDollar == -1) { + return null; + } + + return name.substring(0, indexOfDollar) + '$'; + } + } } diff --git a/eval4j/eval4j.iml b/eval4j/eval4j.iml index d01b023235c..8b0c78cb882 100644 --- a/eval4j/eval4j.iml +++ b/eval4j/eval4j.iml @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/eval4j/src/org/jetbrains/eval4j/jdi/jdiEval.kt b/eval4j/src/org/jetbrains/eval4j/jdi/jdiEval.kt index 141122343e5..cfa5febed4c 100644 --- a/eval4j/src/org/jetbrains/eval4j/jdi/jdiEval.kt +++ b/eval4j/src/org/jetbrains/eval4j/jdi/jdiEval.kt @@ -19,6 +19,8 @@ package org.jetbrains.eval4j.jdi import com.sun.jdi.* import org.jetbrains.eval4j.* import org.jetbrains.eval4j.Value +import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.InternalNameMapper.canBeMangledInternalName +import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper.InternalNameMapper.internalNameWithoutModuleSuffix import org.jetbrains.org.objectweb.asm.Type import java.lang.reflect.AccessibleObject import com.sun.jdi.Type as jdi_Type @@ -216,11 +218,12 @@ class JDIEval( return method } - if (methodName.contains('$')) { - // Module name can be different for internal functions during evaluation and compilation - val internalNamePrefix = methodName.substringBefore('$') + '$' + // Module name can be different for internal functions during evaluation and compilation + val internalNameWithoutSuffix = internalNameWithoutModuleSuffix(methodName) + if (internalNameWithoutSuffix != null) { val internalMethods = _class.visibleMethods().filter { - it.name().startsWith(internalNamePrefix) && it.signature() == methodDesc.desc + val name = it.name() + name.startsWith(internalNameWithoutSuffix) && canBeMangledInternalName(name) && it.signature() == methodDesc.desc } if (!internalMethods.isEmpty()) {