diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt index bcdb2f851eb..e2bf6d8de6f 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/ES6ConstructorLowering.kt @@ -67,12 +67,14 @@ class ES6ConstructorLowering(val context: JsIrBackendContext) : DeclarationTrans return runIf(isExported(context) && isPrimary) { apply { valueParameters = valueParameters.memoryOptimizedFilterNot { it.isBoxParameter } - (body as? IrBlockBody)?.let { - val selfReplacedConstructorCall = JsIrBuilder.buildCall(factoryFunction.symbol).apply { - valueParameters.forEachIndexed { i, it -> putValueArgument(i, JsIrBuilder.buildGetValue(it.symbol)) } - dispatchReceiver = JsIrBuilder.buildCall(context.intrinsics.jsNewTarget) + body = (body as? IrBlockBody)?.let { + context.irFactory.createBlockBody(it.startOffset, it.endOffset) { + val selfReplacedConstructorCall = JsIrBuilder.buildCall(factoryFunction.symbol).apply { + valueParameters.forEachIndexed { i, it -> putValueArgument(i, JsIrBuilder.buildGetValue(it.symbol)) } + dispatchReceiver = JsIrBuilder.buildCall(context.intrinsics.jsNewTarget) + } + statements.add(JsIrBuilder.buildReturn(symbol, selfReplacedConstructorCall, returnType)) } - it.statements.add(JsIrBuilder.buildReturn(symbol, selfReplacedConstructorCall, returnType)) } } } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java index aa5965d6189..531473e355e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java @@ -1848,6 +1848,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { public void testAllFilesPresentInExport() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("js/js.translator/testData/box/esModules/export"), Pattern.compile("^([^_](.+))\\.kt$"), null, TargetBackend.JS, true); } + + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt"); + } } @Nested @@ -2096,6 +2102,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportClassWithInternal.kt") public void testExportClassWithInternal() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java index 22b8a00f64e..4219282220c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java @@ -2189,6 +2189,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest { runTest("js/js.translator/testData/box/esModules/export/exportAllFile.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportEnumClass.kt") public void testExportEnumClass() throws Exception { @@ -2724,6 +2730,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest { runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportClassWithInternal.kt") public void testExportClassWithInternal() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java index 1c8e25e6ae3..367f007c24a 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java @@ -2295,6 +2295,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/esModules/export/exportAllFile.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportEnumClass.kt") public void testExportEnumClass() throws Exception { @@ -2830,6 +2836,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportClassWithInternal.kt") public void testExportClassWithInternal() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java index 7a5926e3127..a61b97af8b9 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java @@ -2189,6 +2189,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/esModules/export/exportAllFile.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportEnumClass.kt") public void testExportEnumClass() throws Exception { @@ -2724,6 +2730,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt"); } + @Test + @TestMetadata("exportClassWithInitBlock.kt") + public void testExportClassWithInitBlock() throws Exception { + runTest("js/js.translator/testData/box/export/exportClassWithInitBlock.kt"); + } + @Test @TestMetadata("exportClassWithInternal.kt") public void testExportClassWithInternal() throws Exception { diff --git a/js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt b/js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt new file mode 100644 index 00000000000..ec52d69404e --- /dev/null +++ b/js/js.translator/testData/box/esModules/export/exportClassWithInitBlock.kt @@ -0,0 +1,30 @@ +// EXPECTED_REACHABLE_NODES: 1252 +// IGNORE_BACKEND: JS +// RUN_PLAIN_BOX_FUNCTION +// INFER_MAIN_MODULE +// ES_MODULES + +// KT-58246 +// MODULE: lib +// FILE: lib.kt +@JsExport +var result = 0 + +@JsExport +class Test { + init { + result += 1 + } +} + +// FILE: entry.mjs +// ENTRY_ES_MODULE +import { result, Test } from "./exportClassWithInitBlock-lib_v5.mjs"; + +export function box() { + new Test() + + if (result.get() != 1) return "fail: init block didn't call or called more than 1 time" + + return "OK" +} diff --git a/js/js.translator/testData/box/export/exportClassWithInitBlock.kt b/js/js.translator/testData/box/export/exportClassWithInitBlock.kt new file mode 100644 index 00000000000..c9e8f368bda --- /dev/null +++ b/js/js.translator/testData/box/export/exportClassWithInitBlock.kt @@ -0,0 +1,26 @@ +// EXPECTED_REACHABLE_NODES: 1252 +// IGNORE_BACKEND: JS +// RUN_PLAIN_BOX_FUNCTION +// INFER_MAIN_MODULE + +// KT-58246 +// MODULE: lib +// FILE: lib.kt +@JsExport +var result = 0 + +@JsExport +class Test { + init { + result += 1 + } +} + +// FILE: test.js +function box() { + new this.lib.Test() + + if (this.lib.result != 1) return "fail (called " + result + " times): init block didn't call or called more than 1 time" + + return "OK" +}