[K/JS] Eliminate duplication of init block inside exported ES-classes ^KT-58246 Fixed
This commit is contained in:
+7
-5
@@ -67,12 +67,14 @@ class ES6ConstructorLowering(val context: JsIrBackendContext) : DeclarationTrans
|
|||||||
return runIf(isExported(context) && isPrimary) {
|
return runIf(isExported(context) && isPrimary) {
|
||||||
apply {
|
apply {
|
||||||
valueParameters = valueParameters.memoryOptimizedFilterNot { it.isBoxParameter }
|
valueParameters = valueParameters.memoryOptimizedFilterNot { it.isBoxParameter }
|
||||||
(body as? IrBlockBody)?.let {
|
body = (body as? IrBlockBody)?.let {
|
||||||
val selfReplacedConstructorCall = JsIrBuilder.buildCall(factoryFunction.symbol).apply {
|
context.irFactory.createBlockBody(it.startOffset, it.endOffset) {
|
||||||
valueParameters.forEachIndexed { i, it -> putValueArgument(i, JsIrBuilder.buildGetValue(it.symbol)) }
|
val selfReplacedConstructorCall = JsIrBuilder.buildCall(factoryFunction.symbol).apply {
|
||||||
dispatchReceiver = JsIrBuilder.buildCall(context.intrinsics.jsNewTarget)
|
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))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1848,6 +1848,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
public void testAllFilesPresentInExport() throws Exception {
|
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);
|
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
|
@Nested
|
||||||
@@ -2096,6 +2102,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportClassWithInternal.kt")
|
@TestMetadata("exportClassWithInternal.kt")
|
||||||
public void testExportClassWithInternal() throws Exception {
|
public void testExportClassWithInternal() throws Exception {
|
||||||
|
|||||||
+12
@@ -2189,6 +2189,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest {
|
|||||||
runTest("js/js.translator/testData/box/esModules/export/exportAllFile.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportEnumClass.kt")
|
@TestMetadata("exportEnumClass.kt")
|
||||||
public void testExportEnumClass() throws Exception {
|
public void testExportEnumClass() throws Exception {
|
||||||
@@ -2724,6 +2730,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest {
|
|||||||
runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportClassWithInternal.kt")
|
@TestMetadata("exportClassWithInternal.kt")
|
||||||
public void testExportClassWithInternal() throws Exception {
|
public void testExportClassWithInternal() throws Exception {
|
||||||
|
|||||||
+12
@@ -2295,6 +2295,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
|
|||||||
runTest("js/js.translator/testData/box/esModules/export/exportAllFile.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportEnumClass.kt")
|
@TestMetadata("exportEnumClass.kt")
|
||||||
public void testExportEnumClass() throws Exception {
|
public void testExportEnumClass() throws Exception {
|
||||||
@@ -2830,6 +2836,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
|
|||||||
runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportClassWithInternal.kt")
|
@TestMetadata("exportClassWithInternal.kt")
|
||||||
public void testExportClassWithInternal() throws Exception {
|
public void testExportClassWithInternal() throws Exception {
|
||||||
|
|||||||
+12
@@ -2189,6 +2189,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/esModules/export/exportAllFile.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportEnumClass.kt")
|
@TestMetadata("exportEnumClass.kt")
|
||||||
public void testExportEnumClass() throws Exception {
|
public void testExportEnumClass() throws Exception {
|
||||||
@@ -2724,6 +2730,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/export/exportClassPropertiesInDifferentCombinations.kt");
|
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
|
@Test
|
||||||
@TestMetadata("exportClassWithInternal.kt")
|
@TestMetadata("exportClassWithInternal.kt")
|
||||||
public void testExportClassWithInternal() throws Exception {
|
public void testExportClassWithInternal() throws Exception {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user