diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt index 7184b8204f6..69e49c44715 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt @@ -96,7 +96,8 @@ class IrModuleToJsTransformer( others, exportedModule, namer, - refInfo + refInfo, + generateMainCall = true ) val dependencies = others.mapIndexed { index, module -> @@ -109,7 +110,8 @@ class IrModuleToJsTransformer( others.drop(index + 1), ExportedModule(moduleName, exportedModule.moduleKind, exportedDeclarations), namer, - refInfo + refInfo, + generateMainCall = false ) }.reversed() @@ -130,7 +132,8 @@ class IrModuleToJsTransformer( dependencies: Iterable, exportedModule: ExportedModule, namer: NameTables, - refInfo: CrossModuleReferenceInfo + refInfo: CrossModuleReferenceInfo, + generateMainCall: Boolean = true ): CompilationOutputs { val nameGenerator = refInfo.withReferenceTracking( @@ -161,8 +164,6 @@ class IrModuleToJsTransformer( val globalNames = NameTable(namer.globalNames) val exportStatements = ExportModelToJsStatements(internalModuleName, nameGenerator, { globalNames.declareFreshName(it, it)}).generateModuleExport(exportedModule) - val callToMain = generateCallToMain(modules, rootContext) - val (crossModuleImports, importedKotlinModules) = generateCrossModuleImports(nameGenerator, modules, dependencies, { JsName(sanitizeName(it)) }) val crossModuleExports = generateCrossModuleExports(modules, refInfo, internalModuleName) @@ -181,7 +182,9 @@ class IrModuleToJsTransformer( statements.addWithComment("block: imports", importStatements + crossModuleImports) statements += moduleBody statements.addWithComment("block: exports", exportStatements + crossModuleExports) - statements += callToMain + if (generateMainCall) { + statements += generateCallToMain(modules, rootContext) + } statements += JsReturn(internalModuleName.makeRef()) } } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java index f8b5b8e2818..021d11d45d3 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java @@ -880,6 +880,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/crossModuleRefIR/objectIsObject.kt"); } + @TestMetadata("onlyMainModuleCall.kt") + public void testOnlyMainModuleCall() throws Exception { + runTest("js/js.translator/testData/box/crossModuleRefIR/onlyMainModuleCall.kt"); + } + @TestMetadata("topLevelExtension.kt") public void testTopLevelExtension() throws Exception { runTest("js/js.translator/testData/box/crossModuleRefIR/topLevelExtension.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 7d9e7dc1879..c205a5286f4 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -880,6 +880,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/crossModuleRefIR/objectIsObject.kt"); } + @TestMetadata("onlyMainModuleCall.kt") + public void testOnlyMainModuleCall() throws Exception { + runTest("js/js.translator/testData/box/crossModuleRefIR/onlyMainModuleCall.kt"); + } + @TestMetadata("topLevelExtension.kt") public void testTopLevelExtension() throws Exception { runTest("js/js.translator/testData/box/crossModuleRefIR/topLevelExtension.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 168a68e795b..c945a85e90b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -880,6 +880,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/crossModuleRefIR/objectIsObject.kt"); } + @TestMetadata("onlyMainModuleCall.kt") + public void testOnlyMainModuleCall() throws Exception { + runTest("js/js.translator/testData/box/crossModuleRefIR/onlyMainModuleCall.kt"); + } + @TestMetadata("topLevelExtension.kt") public void testTopLevelExtension() throws Exception { runTest("js/js.translator/testData/box/crossModuleRefIR/topLevelExtension.kt"); diff --git a/js/js.translator/testData/box/crossModuleRefIR/onlyMainModuleCall.kt b/js/js.translator/testData/box/crossModuleRefIR/onlyMainModuleCall.kt new file mode 100644 index 00000000000..3b1bc911729 --- /dev/null +++ b/js/js.translator/testData/box/crossModuleRefIR/onlyMainModuleCall.kt @@ -0,0 +1,30 @@ +// IGNORE_BACKEND: JS +// SPLIT_PER_MODULE +// CALL_MAIN +// MODULE: lib +// FILE: lib.kt + +package lib + +var log: String = "" + +val hack = ::main + +fun main() { + log += "fail" +} + +// MODULE: main(lib) +// FILE: main.kt + +package main + +import lib.* + +fun main() { + log += "OK" +} + +fun box(): String { + return log +} \ No newline at end of file