From cb2e68feced642a5888dd890da2c49a0ac1f04c6 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 9 Aug 2019 18:15:09 +0200 Subject: [PATCH] JVM IR: skip temporary variables in InventNamesForLocalClasses --- .../backend/jvm/lower/InventNamesForLocalClasses.kt | 9 +++++++++ .../box/ir/anonymousObjectInForLoopIteratorAndBody.kt | 10 ++++++++++ .../codegen/box/ir/anonymousObjectInsideElvis.kt | 3 +++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 10 ++++++++++ .../kotlin/codegen/LightAnalysisModeTestGenerated.java | 10 ++++++++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 10 ++++++++++ .../test/ir/semantics/IrJsCodegenBoxTestGenerated.java | 10 ++++++++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 10 ++++++++++ 8 files changed, 72 insertions(+) create mode 100644 compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt create mode 100644 compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt index 04f816fab6c..1c1fdfac96d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InventNamesForLocalClasses.kt @@ -88,6 +88,15 @@ class InventNamesForLocalClasses(private val context: JvmBackendContext) : FileL return } + // We explicitly skip temporary variables (such as a for loop iterator, or a temporary value for an elvis operator) + // because they are not present in the original source code and their names should not affect names of local entities. + if (declaration.origin == IrDeclarationOrigin.FOR_LOOP_ITERATOR || + declaration.origin == IrDeclarationOrigin.IR_TEMPORARY_VARIABLE + ) { + declaration.acceptChildren(this, data) + return + } + val enclosingName = data.enclosingName val simpleName = declaration.name.asString() diff --git a/compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt b/compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt new file mode 100644 index 00000000000..ec7c2b79840 --- /dev/null +++ b/compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt @@ -0,0 +1,10 @@ +// WITH_RUNTIME +// KJS_WITH_FULL_RUNTIME + +fun box(): String { + var result = "" + for (x in listOf('O', 'A', 'K').filter { it > 'D' }) { + result += object { fun run() = x }.run() + } + return result +} diff --git a/compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt b/compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt new file mode 100644 index 00000000000..3d6c72d17b2 --- /dev/null +++ b/compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt @@ -0,0 +1,3 @@ +fun box(): String { + return (object { val r = "OK" } ?: null)!!.r +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 0ce793e1b96..e3f8d106c15 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -13789,6 +13789,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/ir"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("anonymousObjectInForLoopIteratorAndBody.kt") + public void testAnonymousObjectInForLoopIteratorAndBody() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt"); + } + + @TestMetadata("anonymousObjectInsideElvis.kt") + public void testAnonymousObjectInsideElvis() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt"); + } + @TestMetadata("classInitializers.kt") public void testClassInitializers() throws Exception { runTest("compiler/testData/codegen/box/ir/classInitializers.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index f7dbf7d5973..942803e1de6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -13789,6 +13789,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/ir"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("anonymousObjectInForLoopIteratorAndBody.kt") + public void testAnonymousObjectInForLoopIteratorAndBody() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt"); + } + + @TestMetadata("anonymousObjectInsideElvis.kt") + public void testAnonymousObjectInsideElvis() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt"); + } + @TestMetadata("classInitializers.kt") public void testClassInitializers() throws Exception { runTest("compiler/testData/codegen/box/ir/classInitializers.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index fb6cef019fb..d7e0fa7f1af 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -12674,6 +12674,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/ir"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true); } + @TestMetadata("anonymousObjectInForLoopIteratorAndBody.kt") + public void testAnonymousObjectInForLoopIteratorAndBody() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt"); + } + + @TestMetadata("anonymousObjectInsideElvis.kt") + public void testAnonymousObjectInsideElvis() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt"); + } + @TestMetadata("classInitializers.kt") public void testClassInitializers() throws Exception { runTest("compiler/testData/codegen/box/ir/classInitializers.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 2a27b427eb3..098bec3d0c7 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -11014,6 +11014,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/ir"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true); } + @TestMetadata("anonymousObjectInForLoopIteratorAndBody.kt") + public void testAnonymousObjectInForLoopIteratorAndBody() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt"); + } + + @TestMetadata("anonymousObjectInsideElvis.kt") + public void testAnonymousObjectInsideElvis() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt"); + } + @TestMetadata("classInitializers.kt") public void testClassInitializers() throws Exception { runTest("compiler/testData/codegen/box/ir/classInitializers.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 8a94906af44..eee46852b9a 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -12169,6 +12169,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/ir"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("anonymousObjectInForLoopIteratorAndBody.kt") + public void testAnonymousObjectInForLoopIteratorAndBody() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInForLoopIteratorAndBody.kt"); + } + + @TestMetadata("anonymousObjectInsideElvis.kt") + public void testAnonymousObjectInsideElvis() throws Exception { + runTest("compiler/testData/codegen/box/ir/anonymousObjectInsideElvis.kt"); + } + @TestMetadata("classInitializers.kt") public void testClassInitializers() throws Exception { runTest("compiler/testData/codegen/box/ir/classInitializers.kt");