diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt index 6150bc10b87..168cad51cbf 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt @@ -90,6 +90,7 @@ class JsNameLinkingNamer( else -> JsImport.Target.Default(nameRef) } imports[this] = JsImport(jsModule, importSubject) + nameMap[this] = name } else { importedModules += JsImportedModule(jsModule, name, nameRef) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/serialization/JsIrAstSerializer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/serialization/JsIrAstSerializer.kt index 8adf0a21869..e88b14139ae 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/serialization/JsIrAstSerializer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/serialization/JsIrAstSerializer.kt @@ -97,7 +97,7 @@ private class JsIrAstSerializer { } fun append(fragment: JsIrProgramFragment): JsIrAstSerializer { - importedNames += fragment.imports.map { fragment.nameBindings[it.key]!! } + importedNames += fragment.imports.map { fragment.nameBindings[it.key] ?: error("No binding for tag ${it.key}") } fragmentSerializer.writeFragment(fragment) return this } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerFileTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerFileTestGenerated.java index 33023fc1745..1fa4ea09d90 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerFileTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerFileTestGenerated.java @@ -325,6 +325,12 @@ public class JsFirInvalidationPerFileTestGenerated extends AbstractJsFirInvalida runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/"); } + @Test + @TestMetadata("jsModuleAnnotationOnObjectWithUsage") + public void testJsModuleAnnotationOnObjectWithUsage() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/"); + } + @Test @TestMetadata("languageVersionSettings") public void testLanguageVersionSettings() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerModuleTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerModuleTestGenerated.java index 69123b7fc36..e1e6b0a0420 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerModuleTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsFirInvalidationPerModuleTestGenerated.java @@ -325,6 +325,12 @@ public class JsFirInvalidationPerModuleTestGenerated extends AbstractJsFirInvali runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/"); } + @Test + @TestMetadata("jsModuleAnnotationOnObjectWithUsage") + public void testJsModuleAnnotationOnObjectWithUsage() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/"); + } + @Test @TestMetadata("languageVersionSettings") public void testLanguageVersionSettings() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerFileTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerFileTestGenerated.java index b9c62749ee5..c3b3cfe81f6 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerFileTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerFileTestGenerated.java @@ -325,6 +325,12 @@ public class JsIrES6InvalidationPerFileTestGenerated extends AbstractJsIrES6Inva runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/"); } + @Test + @TestMetadata("jsModuleAnnotationOnObjectWithUsage") + public void testJsModuleAnnotationOnObjectWithUsage() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/"); + } + @Test @TestMetadata("languageVersionSettings") public void testLanguageVersionSettings() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerModuleTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerModuleTestGenerated.java index 983139d5375..ee29004199b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerModuleTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrES6InvalidationPerModuleTestGenerated.java @@ -325,6 +325,12 @@ public class JsIrES6InvalidationPerModuleTestGenerated extends AbstractJsIrES6In runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/"); } + @Test + @TestMetadata("jsModuleAnnotationOnObjectWithUsage") + public void testJsModuleAnnotationOnObjectWithUsage() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/"); + } + @Test @TestMetadata("languageVersionSettings") public void testLanguageVersionSettings() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerFileTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerFileTestGenerated.java index 8abcee275ea..c552c799c30 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerFileTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerFileTestGenerated.java @@ -325,6 +325,12 @@ public class JsIrInvalidationPerFileTestGenerated extends AbstractJsIrInvalidati runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/"); } + @Test + @TestMetadata("jsModuleAnnotationOnObjectWithUsage") + public void testJsModuleAnnotationOnObjectWithUsage() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/"); + } + @Test @TestMetadata("languageVersionSettings") public void testLanguageVersionSettings() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerModuleTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerModuleTestGenerated.java index 906eada32f3..98d55368c57 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerModuleTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/JsIrInvalidationPerModuleTestGenerated.java @@ -325,6 +325,12 @@ public class JsIrInvalidationPerModuleTestGenerated extends AbstractJsIrInvalida runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotation/"); } + @Test + @TestMetadata("jsModuleAnnotationOnObjectWithUsage") + public void testJsModuleAnnotationOnObjectWithUsage() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/"); + } + @Test @TestMetadata("languageVersionSettings") public void testLanguageVersionSettings() throws Exception { diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/ObjectB.0.kt b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/ObjectB.0.kt new file mode 100644 index 00000000000..34b4a18f6ef --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/ObjectB.0.kt @@ -0,0 +1,3 @@ +external object ObjectB { + fun getResult(): String +} \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/ObjectB.1.kt b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/ObjectB.1.kt new file mode 100644 index 00000000000..5d63fcb5279 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/ObjectB.1.kt @@ -0,0 +1,5 @@ +@JsNonModule +@JsModule("../third-party-lib.mjs") +external object ObjectB { + fun getResult(): String +} diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/module.info b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/module.info new file mode 100644 index 00000000000..ad5aea93b97 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/lib1/module.info @@ -0,0 +1,8 @@ +STEP 0: + modifications: + U : ObjectB.0.kt -> ObjectB.kt + added file: ObjectB.kt +STEP 1: + modifications: + U : ObjectB.1.kt -> ObjectB.kt + modified ir: ObjectB.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/main/m.kt b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/main/m.kt new file mode 100644 index 00000000000..447faca2a2b --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/main/m.kt @@ -0,0 +1,9 @@ +@OptIn(kotlin.ExperimentalStdlibApi::class) +@EagerInitialization +val initJsObject = js(""" + globalThis.ObjectB = { getResult: function() { return "OK" } } +""") + +fun box(stepId: Int): String { + return ObjectB.getResult() +} \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/main/module.info b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/main/module.info new file mode 100644 index 00000000000..40f51a44840 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/main/module.info @@ -0,0 +1,6 @@ +STEP 0: + dependencies: lib1 + added file: m.kt +STEP 1: + dependencies: lib1 + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/project.info b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/project.info new file mode 100644 index 00000000000..15277dfe657 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/project.info @@ -0,0 +1,12 @@ +MODULES: lib1, main +MODULE_KIND: es +IGNORE_PER_MODULE: true + +STEP 0: + libs: lib1, main + dirty js modules: lib1, main + dirty js files: lib1/ObjectB, main/m, main/m.export, main +STEP 1: + libs: lib1, main + dirty js modules: lib1, main + dirty js files: lib1/ObjectB, main/m diff --git a/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/third-party-lib.mjs b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/third-party-lib.mjs new file mode 100644 index 00000000000..fe0fcceb30b --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsModuleAnnotationOnObjectWithUsage/third-party-lib.mjs @@ -0,0 +1,3 @@ +export function getResult() { + return "OK" +} \ No newline at end of file