From d6bc309c9405e32f9efaf91cd0283c0b55744739 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 9 Nov 2020 15:30:37 +0300 Subject: [PATCH] [JS IR] Eager initialisation for all pure properties ^KT-43222 fixed --- .../js/lower/PropertyLazyInitLowering.kt | 9 ++++++++- .../box/properties/lazyInitializationPure.kt | 18 ++++++++++++++++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/properties/lazyInitializationPure.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt index d35ee5020aa..92b60ceeb3f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/PropertyLazyInitLowering.kt @@ -40,7 +40,14 @@ class PropertyLazyInitLowering(private val context: JsIrBackendContext) : FileLo val fieldToInitializer = calculateFieldToExpression( functions - ).onEach { it.key.initializer = null } + ) + + val allPropertyInitializersPure = fieldToInitializer + .all { it.value.isPure(anyVariable = true) } + + if (allPropertyInitializersPure) return + + fieldToInitializer.onEach { it.key.initializer = null } if (fieldToInitializer.isEmpty()) return diff --git a/compiler/testData/codegen/box/properties/lazyInitializationPure.kt b/compiler/testData/codegen/box/properties/lazyInitializationPure.kt new file mode 100644 index 00000000000..b08db6acaca --- /dev/null +++ b/compiler/testData/codegen/box/properties/lazyInitializationPure.kt @@ -0,0 +1,18 @@ +// TARGET_BACKEND: JS_IR + +// FILE: A.kt + +val a = "A" + +// FILE: B.kt +val b = "B".apply {} + +val c = "C" + +// FILE: main.kt + +fun box(): String { + return if (js("a") == "A" && js("typeof b") == "undefined" && js("typeof c") == "undefined") + "OK" + else "fail" +} \ No newline at end of file diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index af5fc5832c2..c18bbfc6bb2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -17634,6 +17634,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); } + @TestMetadata("lazyInitializationPure.kt") + public void testLazyInitializationPure() throws Exception { + runTest("compiler/testData/codegen/box/properties/lazyInitializationPure.kt"); + } + @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.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 79efbd55ec9..c1200b0aa20 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 @@ -17634,6 +17634,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/properties/lazyInitialization.kt"); } + @TestMetadata("lazyInitializationPure.kt") + public void testLazyInitializationPure() throws Exception { + runTest("compiler/testData/codegen/box/properties/lazyInitializationPure.kt"); + } + @TestMetadata("primitiveOverrideDefaultAccessor.kt") public void testPrimitiveOverrideDefaultAccessor() throws Exception { runTest("compiler/testData/codegen/box/properties/primitiveOverrideDefaultAccessor.kt");