diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt index 05d9c8a654e..a26dcdbc7ff 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/Utils.kt @@ -216,4 +216,17 @@ internal fun IrType.isTypeParameter() = classifierOrNull is IrTypeParameterSymbo internal fun IrType.isInterface() = classOrNull?.owner?.kind == ClassKind.INTERFACE -internal fun IrType.isThrowable() = this.getClass()?.fqNameWhenAvailable?.asString() == "kotlin.Throwable" \ No newline at end of file +internal fun IrType.isThrowable() = this.getClass()?.fqNameWhenAvailable?.asString() == "kotlin.Throwable" + +fun IrClass.internalName(): String { + val internalName = StringBuilder(this.name.asString()) + generateSequence(this as? IrDeclarationParent) { (it as? IrDeclaration)?.parent } + .drop(1) + .forEach { + when (it) { + is IrClass -> internalName.insert(0, it.name.asString() + "$") + is IrPackageFragment -> it.fqName.asString().takeIf { it.isNotEmpty() }?.let { internalName.insert(0, "$it.") } + } + } + return internalName.toString() +} \ No newline at end of file diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt index 287b33ec83d..78a80b2d8ff 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/builtins/IrBuiltInsMapGenerated.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.ir.interpreter.builtins +import org.jetbrains.kotlin.ir.interpreter.internalName import org.jetbrains.kotlin.ir.interpreter.state.* /** This file is generated by org.jetbrains.kotlin.backend.common.interpreter.builtins.GenerateBuiltInsMap.generateMap(). DO NOT MODIFY MANUALLY */ @@ -471,7 +472,7 @@ val ternaryFunctions = mapOf this.toString() - is State -> "${this.irClass.name}@" + System.identityHashCode(this).toString(16).padStart(8, '0') + is State -> "${this.irClass.internalName()}@" + System.identityHashCode(this).toString(16).padStart(8, '0') else -> this.toString().replaceAfter("@", System.identityHashCode(this).toString(16).padStart(8, '0')) } } diff --git a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt index e774ead9f94..6c0d42ba554 100644 --- a/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt +++ b/compiler/ir/ir.interpreter/src/org/jetbrains/kotlin/ir/interpreter/state/Wrapper.kt @@ -138,22 +138,10 @@ internal class Wrapper(val value: Any, override val irClass: IrClass) : Complex( owner.hasAnnotation(evaluateIntrinsicAnnotation) -> Class.forName(owner!!.getEvaluateIntrinsicValue()) fqName == null -> Any::class.java // null if this.isTypeParameter() - else -> Class.forName(fqName.replaceDotWithDollarForInnerClasses()) + else -> Class.forName(owner.internalName()) } } - private fun String.replaceDotWithDollarForInnerClasses(): String? { - // TODO come up with something better - val names = this.split(".") - val result = StringBuilder() - for (i in 0 until (names.size - 1)) { - result.append(names[i]) - if (names[i][0].isUpperCase() && names[i + 1][0].isUpperCase()) result.append("$") else result.append(".") - } - result.append(names.last()) - return result.toString() - } - private fun IrFunction.getOriginalOverriddenSymbols(): MutableList { val overriddenSymbols = mutableListOf() if (this is IrFunctionImpl) { diff --git a/generators/evaluate/GenerateBuiltInsMap.kt b/generators/evaluate/GenerateBuiltInsMap.kt index 48f576aba1a..f2d76f854ad 100644 --- a/generators/evaluate/GenerateBuiltInsMap.kt +++ b/generators/evaluate/GenerateBuiltInsMap.kt @@ -26,6 +26,7 @@ fun generateMap(irBuiltIns: IrBuiltIns): String { p.println(File("license/COPYRIGHT.txt").readText()) p.println("package org.jetbrains.kotlin.ir.interpreter.builtins") p.println() + p.println("import org.jetbrains.kotlin.ir.interpreter.internalName") p.println("import org.jetbrains.kotlin.ir.interpreter.state.*") p.println() p.println("/** This file is generated by org.jetbrains.kotlin.backend.common.interpreter.builtins.GenerateBuiltInsMap.generateMap(). DO NOT MODIFY MANUALLY */") @@ -58,7 +59,7 @@ fun generateMap(irBuiltIns: IrBuiltIns): String { private fun Any.defaultToString(): String { return when (this) { is Lambda -> this.toString() - is State -> "${'$'}{this.irClass.name}@" + System.identityHashCode(this).toString(16).padStart(8, '0') + is State -> "${'$'}{this.irClass.internalName()}@" + System.identityHashCode(this).toString(16).padStart(8, '0') else -> this.toString().replaceAfter("@", System.identityHashCode(this).toString(16).padStart(8, '0')) } }