diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java index 81824f12754..96944548a00 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/AnonymousObjectTransformer.java @@ -222,7 +222,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer subGenerators = new HashMap(); - public NameGenerator(String onwerMethod) { - this.ownerMethod = onwerMethod; + public NameGenerator(String generatorClass) { + this.generatorClass = generatorClass; } - public String genLambdaClassName() { - return ownerMethod + "$" + nextLambdaIndex++; + public String getGeneratorClass() { + return generatorClass; } - public String genWhenClassNamePrefix() { - return ownerMethod + "$" + nextWhenIndex++; + private String genLambdaClassName() { + return generatorClass + "$" + nextLambdaIndex++; + } + + private String genWhenClassName(@NotNull String original) { + return generatorClass + "$" + nextWhenIndex++ + WhenMappingTransformationInfo.TRANSFORMED_WHEN_MAPPING_MARKER + original; } public NameGenerator subGenerator(String inliningMethod) { NameGenerator generator = subGenerators.get(inliningMethod); if (generator == null) { - generator = new NameGenerator(ownerMethod+ "$" + inliningMethod); + generator = new NameGenerator(generatorClass + "$" + inliningMethod); subGenerators.put(inliningMethod, generator); } return generator; } + + @NotNull + public NameGenerator subGenerator(boolean lambdaNoWhen, @Nullable String nameSuffix) { + String generatorClass = lambdaNoWhen ? genLambdaClassName() : genWhenClassName(nameSuffix); + assert !subGenerators.containsKey(generatorClass) : "Name generator for regenerated class should be unique: " + generatorClass; + NameGenerator generator = new NameGenerator(generatorClass); + subGenerators.put(generatorClass, generator); + return generator; + } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt index b2d27a7340c..49dd41e5bb1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/TransformationInfo.kt @@ -22,6 +22,9 @@ interface TransformationInfo { val oldClassName: String val newClassName: String + get() = nameGenerator.generatorClass + + val nameGenerator: NameGenerator fun shouldRegenerate(sameModule: Boolean): Boolean @@ -32,13 +35,13 @@ interface TransformationInfo { class WhenMappingTransformationInfo( override val oldClassName: String, - val nameGenerator: NameGenerator, + parentNameGenerator: NameGenerator, val alreadyRegenerated: Boolean, val fieldNode: FieldInsnNode ) : TransformationInfo { - override val newClassName by lazy { - nameGenerator.genWhenClassNamePrefix() + TRANSFORMED_WHEN_MAPPING_MARKER + - oldClassName.substringAfterLast("/").substringAfterLast(TRANSFORMED_WHEN_MAPPING_MARKER) + + override val nameGenerator by lazy { + parentNameGenerator.subGenerator(false, oldClassName.substringAfterLast("/").substringAfterLast(TRANSFORMED_WHEN_MAPPING_MARKER)) } override fun shouldRegenerate(sameModule: Boolean): Boolean = !alreadyRegenerated && !sameModule @@ -61,10 +64,11 @@ class AnonymousObjectTransformationInfo internal constructor( private val alreadyRegenerated: Boolean, val constructorDesc: String?, private val isStaticOrigin: Boolean, - nameGenerator: NameGenerator + parentNameGenerator: NameGenerator ) : TransformationInfo { - override val newClassName: String by lazy { - nameGenerator.genLambdaClassName() + + override val nameGenerator by lazy { + parentNameGenerator.subGenerator(true, null) } lateinit var newConstructorDescriptor: String diff --git a/compiler/testData/codegen/boxInline/anonymousObject/kt13133.kt b/compiler/testData/codegen/boxInline/anonymousObject/kt13133.kt new file mode 100644 index 00000000000..bfcaa823c3f --- /dev/null +++ b/compiler/testData/codegen/boxInline/anonymousObject/kt13133.kt @@ -0,0 +1,33 @@ +// WITH_REFLECT +// FILE: 1.kt + +package test + +inline fun inf(crossinline cif: Any.() -> String): () -> String { + return { + object : () -> String { + override fun invoke() = cif() + } + }() +} +// FILE: 2.kt + +import test.* + +fun box(): String { + val simpleName = inf { + javaClass.simpleName + }() + + if (simpleName != "" ) return "fail 1: $simpleName" + + val name = inf { + javaClass.name + }() + + if (name != "_2Kt\$box$\$inlined\$inf$2$1" ) return "fail 2: $name" + + + return "OK" +} + diff --git a/compiler/testData/codegen/boxInline/enclosingInfo/inlineChain2.kt b/compiler/testData/codegen/boxInline/enclosingInfo/inlineChain2.kt index a2e14658405..503dc75856c 100644 --- a/compiler/testData/codegen/boxInline/enclosingInfo/inlineChain2.kt +++ b/compiler/testData/codegen/boxInline/enclosingInfo/inlineChain2.kt @@ -31,7 +31,7 @@ fun box(): String { if (enclosingMethod?.name != "invoke") return "fail 1: ${enclosingMethod?.name}" enclosingClass = res2.javaClass.enclosingClass - if (enclosingClass?.name != "_2Kt\$box$\$inlined\$call\$lambda\$lambda$2") return "fail 2: ${enclosingClass?.name}" + if (enclosingClass?.name != "_2Kt\$box$\$inlined\$call$2\$lambda$1") return "fail 2: ${enclosingClass?.name}" return res2() } diff --git a/compiler/testData/codegen/boxInline/innerClasses/kt10259.kt b/compiler/testData/codegen/boxInline/innerClasses/kt10259.kt index 6be1923c15e..87fc4d4125f 100644 --- a/compiler/testData/codegen/boxInline/innerClasses/kt10259.kt +++ b/compiler/testData/codegen/boxInline/innerClasses/kt10259.kt @@ -26,7 +26,7 @@ fun box(): String { } if (encl1 != "_2Kt\$box\$\$inlined\$test\$lambda$1") return "fail 1: $encl1" - if (encl2 != "_2Kt\$box\$\$inlined\$test\$lambda\$lambda$2") return "fail 2: $encl2" + if (encl2 != "_2Kt\$box\$\$inlined\$test\$lambda$1$2") return "fail 2: $encl2" return "OK" } diff --git a/compiler/testData/codegen/bytecodeText/kt10259.kt b/compiler/testData/codegen/bytecodeText/kt10259.kt index bf6b46da44e..ef8b6371351 100644 --- a/compiler/testData/codegen/bytecodeText/kt10259.kt +++ b/compiler/testData/codegen/bytecodeText/kt10259.kt @@ -17,6 +17,6 @@ inline fun test(s: () -> Unit) { s() } -// 2 INNERCLASS Kt10259Kt\$box\$\$inlined\$test\$lambda\$1 -// 2 INNERCLASS Kt10259Kt\$box\$\$inlined\$test\$lambda\$lambda\$1 +// 2 INNERCLASS Kt10259Kt\$box\$\$inlined\$test\$lambda\$1\s +// 2 INNERCLASS Kt10259Kt\$box\$\$inlined\$test\$lambda\$1\$1 // 4 INNERCLASS \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/kt10259_2.kt b/compiler/testData/codegen/bytecodeText/kt10259_2.kt index c0fe532acaf..a7bf15def8d 100644 --- a/compiler/testData/codegen/bytecodeText/kt10259_2.kt +++ b/compiler/testData/codegen/bytecodeText/kt10259_2.kt @@ -17,6 +17,6 @@ inline fun test(crossinline s: () -> Unit) { // 3 INNERCLASS Kt10259_2Kt\$test\$1 null // 2 INNERCLASS Kt10259_2Kt\$test\$1\$1 -// 2 INNERCLASS Kt10259_2Kt\$box\$\$inlined\$test\$1 -// 2 INNERCLASS Kt10259_2Kt\$box\$\$inlined\$test\$lambda\$1 +// 2 INNERCLASS Kt10259_2Kt\$box\$\$inlined\$test\$1\s +// 2 INNERCLASS Kt10259_2Kt\$box\$\$inlined\$test\$1\$1 // 9 INNERCLASS \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/kt10259_3.kt b/compiler/testData/codegen/bytecodeText/kt10259_3.kt index 95410821b76..dd9c8669802 100644 --- a/compiler/testData/codegen/bytecodeText/kt10259_3.kt +++ b/compiler/testData/codegen/bytecodeText/kt10259_3.kt @@ -21,9 +21,9 @@ inline fun test(crossinline s: () -> Unit) { // 3 INNERCLASS Kt10259_3Kt\$test\$1 null // 2 INNERCLASS Kt10259_3Kt\$test\$1\$1 -// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$1 -// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$lambda\$1 +// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$1\s +// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$1\$1\s // inlined: -// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$lambda\$lambda\$lambda\$1 -// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$lambda\$lambda\$lambda\$lambda\$1 +// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$1\$1\$lambda\$1\s +// 2 INNERCLASS Kt10259_3Kt\$box\$\$inlined\$test\$1\$1\$lambda\$1\$1\s // 13 INNERCLASS \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java index 14c71da839c..1a11599e0e4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxInlineCodegenTestGenerated.java @@ -121,6 +121,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo doTest(fileName); } + @TestMetadata("kt13133.kt") + public void testKt13133() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt13133.kt"); + doTest(fileName); + } + @TestMetadata("kt6552.kt") public void testKt6552() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java index 9084c2dd852..f51e75f3cae 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstInlineKotlinTestGenerated.java @@ -121,6 +121,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi doTest(fileName); } + @TestMetadata("kt13133.kt") + public void testKt13133() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt13133.kt"); + doTest(fileName); + } + @TestMetadata("kt6552.kt") public void testKt6552() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/OuterClassGenTest.java b/compiler/tests/org/jetbrains/kotlin/codegen/OuterClassGenTest.java index d84f5a0a4a5..e28deb4d091 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/OuterClassGenTest.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/OuterClassGenTest.java @@ -113,7 +113,7 @@ public class OuterClassGenTest extends CodegenTestCase { doCustomTest("foo/Bar\\$objectInLambdaInlinedIntoObject\\$\\$inlined\\$inlineFoo\\$1", intoObjectInfo, "inlineObject"); OuterClassInfo objectInLambda = new OuterClassInfo("foo/Bar$objectInLambdaInlinedIntoObject$$inlined$inlineFoo$1", "run", "()V"); - doCustomTest("foo/Bar\\$objectInLambdaInlinedIntoObject\\$\\$inlined\\$inlineFoo\\$lambda\\$lambda\\$1", + doCustomTest("foo/Bar\\$objectInLambdaInlinedIntoObject\\$\\$inlined\\$inlineFoo\\$1\\$lambda\\$1", objectInLambda, "inlineObject"); } @@ -138,7 +138,7 @@ public class OuterClassGenTest extends CodegenTestCase { doCustomTest("foo/Bar\\$objectInLambdaInlinedIntoObject\\$\\$inlined\\$inlineFoo\\$1", intoObjectInfo, "inlineLambda"); OuterClassInfo objectInLambda = new OuterClassInfo("foo/Bar$objectInLambdaInlinedIntoObject$$inlined$inlineFoo$1", "invoke", "()V"); - doCustomTest("foo/Bar\\$objectInLambdaInlinedIntoObject\\$\\$inlined\\$inlineFoo\\$lambda\\$lambda\\$1", + doCustomTest("foo/Bar\\$objectInLambdaInlinedIntoObject\\$\\$inlined\\$inlineFoo\\$1\\$lambda\\$1", objectInLambda, "inlineLambda"); }