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 9c961b5b190..324c38c8fcc 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 @@ -99,8 +99,11 @@ private class JsIrModuleCrossModuleReferecenceBuilder(val module: JsIrModule, va val tagToName = module.fragments.flatMap { it.nameBindings.entries }.associate { it.key to it.value } val resultImports = imports.associate { - val tag = it.tag + require(it.module::exportNames.isInitialized) { + // This situation appears in case of a dependent module redefine a symbol (function) from their dependency + "Cross module dependency resolution failed due to symbol '${tag.takeWhile { c -> c != '|' }}' redefinition" + } val exportedAs = it.module.exportNames[tag]!! val importedAs = tagToName[tag]!! val moduleName = it.module.module.import() 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 ce6d51c3fb7..6f5d7143361 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 @@ -6922,6 +6922,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/multiModule/samePackageNames.kt"); } + @Test + @TestMetadata("symbolRedeclaration.kt") + public void testSymbolRedeclaration() throws Exception { + runTest("js/js.translator/testData/box/multiModule/symbolRedeclaration.kt"); + } + @Test @TestMetadata("useElementsFromDefaultPackageInAnotherModule.kt") public void testUseElementsFromDefaultPackageInAnotherModule() 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 01efaa5e10d..a13422ea65b 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 @@ -7306,6 +7306,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/multiModule/samePackageNames.kt"); } + @Test + @TestMetadata("symbolRedeclaration.kt") + public void testSymbolRedeclaration() throws Exception { + runTest("js/js.translator/testData/box/multiModule/symbolRedeclaration.kt"); + } + @Test @TestMetadata("useElementsFromDefaultPackageInAnotherModule.kt") public void testUseElementsFromDefaultPackageInAnotherModule() throws Exception { diff --git a/js/js.translator/testData/box/multiModule/symbolRedeclaration.kt b/js/js.translator/testData/box/multiModule/symbolRedeclaration.kt new file mode 100644 index 00000000000..7867e43ff22 --- /dev/null +++ b/js/js.translator/testData/box/multiModule/symbolRedeclaration.kt @@ -0,0 +1,24 @@ +// IGNORE_BACKEND: JS_IR + +// MODULE: AT +// FILE: at.kt +package foo + +fun redeclaredFunction(): String = "OK" + +// MODULE: A(AT) +// FILE: a.kt +package foo + +fun userFunction(): String = redeclaredFunction() + +// MODULE: main(A) +// FILE: main.kt +package foo + +fun redeclaredFunction(): String = "Fail" + +fun box(): String { + assertEquals(redeclaredFunction(), "Fail") + return userFunction() +}