diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt index ada2ac95f7d..6816f94942a 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/HashCalculatorForIC.kt @@ -139,8 +139,9 @@ internal fun CrossModuleReferences.crossModuleReferencesHashForIC() = HashCalcul update(importedModule.relativeRequirePath ?: "") } - updateForEach(transitiveJsExportFrom) { exportFrom -> - update(exportFrom.toString()) + updateForEach(transitiveJsExportFrom) { transitiveExport -> + update(transitiveExport.internalName.toString()) + update(transitiveExport.externalName) } updateForEach(exports.keys.sorted()) { tag -> diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIrProgramFragment.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIrProgramFragment.kt index 4fd6c81cfcc..76208bf2079 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIrProgramFragment.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsIrProgramFragment.kt @@ -161,7 +161,7 @@ private class JsIrModuleCrossModuleReferecenceBuilder( } val transitiveExport = transitiveJsExportFrom.mapNotNull { - if (it.hasJsExports) import(it) else null + if (!it.hasJsExports) null else CrossModuleTransitiveExport(import(it), it.externalModuleName) } return CrossModuleReferences( moduleKind, @@ -190,10 +190,12 @@ private class JsIrModuleCrossModuleReferecenceBuilder( class CrossModuleImport(val exportedAs: String, val moduleExporter: JsName) +class CrossModuleTransitiveExport(val internalName: JsName, val externalName: String) + class CrossModuleReferences( val moduleKind: ModuleKind, val importedModules: List, // additional Kotlin imported modules - val transitiveJsExportFrom: List, // the list of modules which provide their js exports for transitive export + val transitiveJsExportFrom: List, // the list of modules which provide their js exports for transitive export val exports: Map, // tag -> index val imports: Map, // tag -> import statement ) { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/Merger.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/Merger.kt index 76c131b00d9..4107245ec59 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/Merger.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/Merger.kt @@ -173,10 +173,20 @@ class Merger( } private fun transitiveJsExport(): List { - val internalModuleName = ReservedJsNames.makeInternalModuleName() - val exporterName = ReservedJsNames.makeJsExporterName() - return crossModuleReferences.transitiveJsExportFrom.map { - JsInvocation(JsNameRef(exporterName, it.makeRef()), internalModuleName.makeRef()).makeStmt() + return if (isEsModules) { + crossModuleReferences.transitiveJsExportFrom.map { + JsExport(JsExport.Subject.All, it.externalName) + } + } else { + val internalModuleName = ReservedJsNames.makeInternalModuleName() + val exporterName = ReservedJsNames.makeJsExporterName() + + crossModuleReferences.transitiveJsExportFrom.map { + JsInvocation( + JsNameRef(exporterName, it.internalName.makeRef()), + internalModuleName.makeRef() + ).makeStmt() + } } } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/FirJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/FirJsBoxTestGenerated.java index 138ca2f4dd1..7a876389186 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/FirJsBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/FirJsBoxTestGenerated.java @@ -2367,6 +2367,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest { runTest("js/js.translator/testData/box/esModules/export/overriddenExternalMethodWithSameStableNameMethodInExportedFile.kt"); } + @Test + @TestMetadata("reexport.kt") + public void testReexport() throws Exception { + runTest("js/js.translator/testData/box/esModules/export/reexport.kt"); + } + @Test @TestMetadata("reservedModuleName.kt") public void testReservedModuleName() throws Exception { @@ -2920,6 +2926,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest { runTest("js/js.translator/testData/box/export/overridenMethod.kt"); } + @Test + @TestMetadata("reexport.kt") + public void testReexport() throws Exception { + runTest("js/js.translator/testData/box/export/reexport.kt"); + } + @Test @TestMetadata("reservedModuleName.kt") public void testReservedModuleName() 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 4ba2919d917..6e3f3d081c2 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 @@ -2367,6 +2367,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/esModules/export/overriddenExternalMethodWithSameStableNameMethodInExportedFile.kt"); } + @Test + @TestMetadata("reexport.kt") + public void testReexport() throws Exception { + runTest("js/js.translator/testData/box/esModules/export/reexport.kt"); + } + @Test @TestMetadata("reservedModuleName.kt") public void testReservedModuleName() throws Exception { @@ -2920,6 +2926,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/export/overridenMethod.kt"); } + @Test + @TestMetadata("reexport.kt") + public void testReexport() throws Exception { + runTest("js/js.translator/testData/box/export/reexport.kt"); + } + @Test @TestMetadata("reservedModuleName.kt") public void testReservedModuleName() throws Exception { diff --git a/js/js.translator/testData/box/esModules/export/reexport.kt b/js/js.translator/testData/box/esModules/export/reexport.kt new file mode 100644 index 00000000000..35a3f1f5ed0 --- /dev/null +++ b/js/js.translator/testData/box/esModules/export/reexport.kt @@ -0,0 +1,31 @@ +// IGNORE_FIR +// DONT_TARGET_EXACT_BACKEND: JS +// ES_MODULES +// EXPECTED_REACHABLE_NODES: 1283 + +// MODULE: lib1 +// FILE: lib1.kt +@JsExport +fun bar() = "O" + +// MODULE: lib2(lib1) +// FILE: lib2.kt + +@JsExport +fun baz() = "K" + +// MODULE: main(lib2) +// FILE: main.kt + +@JsExport +fun result(o: String, k: String) = o + k + +// FILE: entry.mjs +// ENTRY_ES_MODULE +import { bar, baz, result } from "./reexport_v5.mjs"; + +export function box() { + const o = bar(); + const k = baz(); + return result(o, k); +} \ No newline at end of file diff --git a/js/js.translator/testData/box/export/reexport.kt b/js/js.translator/testData/box/export/reexport.kt new file mode 100644 index 00000000000..5215cbc2db3 --- /dev/null +++ b/js/js.translator/testData/box/export/reexport.kt @@ -0,0 +1,30 @@ +// IGNORE_FIR +// DONT_TARGET_EXACT_BACKEND: JS +// EXPECTED_REACHABLE_NODES: 1283 +// RUN_PLAIN_BOX_FUNCTION +// INFER_MAIN_MODULE + +// MODULE: lib1 +// FILE: lib1.kt +@JsExport +fun bar() = "O" + +// MODULE: lib2(lib1) +// FILE: lib2.kt + +@JsExport +fun baz() = "K" + +// MODULE: main(lib2) +// FILE: main.kt + +@JsExport +fun result(o: String, k: String) = o + k + +// FILE: test.js + function box() { + const { bar, baz, result } = this.main; + const o = bar(); + const k = baz(); + return result(o, k); +} \ No newline at end of file