diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsExecutableProducer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsExecutableProducer.kt index c7c175092d4..346450599e5 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsExecutableProducer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsExecutableProducer.kt @@ -29,7 +29,7 @@ class JsExecutableProducer( fun buildExecutable(granularity: JsGenerationGranularity, outJsProgram: Boolean) = when (granularity) { JsGenerationGranularity.WHOLE_PROGRAM -> buildSingleModuleExecutable(outJsProgram) - JsGenerationGranularity.PER_MODULE -> buildMultiArtifactExecutable(outJsProgram, JsPerModuleCache(caches)) + JsGenerationGranularity.PER_MODULE -> buildMultiArtifactExecutable(outJsProgram, JsPerModuleCache(moduleKind, caches)) JsGenerationGranularity.PER_FILE -> buildMultiArtifactExecutable(outJsProgram, JsPerFileCache(caches)) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsPerModuleCache.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsPerModuleCache.kt index 83999e9938f..1f8cbc9bcc0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsPerModuleCache.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/JsPerModuleCache.kt @@ -6,9 +6,13 @@ package org.jetbrains.kotlin.ir.backend.js.ic import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.* +import org.jetbrains.kotlin.serialization.js.ModuleKind import java.io.File -class JsPerModuleCache(private val moduleArtifacts: List) : JsMultiArtifactCache() { +class JsPerModuleCache( + private val moduleKind: ModuleKind, + private val moduleArtifacts: List +) : JsMultiArtifactCache() { companion object { private const val JS_MODULE_HEADER = "js.module.header.bin" private const val CACHED_MODULE_JS = "module.js" @@ -73,8 +77,15 @@ class JsPerModuleCache(private val moduleArtifacts: List) : JsMu } ?: compilationOutputs override fun loadProgramHeadersFromCache(): List { + val mainModule = moduleArtifacts.last() return moduleArtifacts.map { artifact -> - fun loadModuleInfo() = CachedModuleInfo(artifact, artifact.loadJsIrModule().makeModuleHeader()) + fun loadModuleInfo() = CachedModuleInfo( + artifact, + artifact + .loadJsIrModule(mainModule.moduleSafeName.takeIf { moduleKind !== ModuleKind.ES && artifact !== mainModule }) + .makeModuleHeader() + ) + val actualInfo = when { artifact.forceRebuildJs -> loadModuleInfo() artifact.fileArtifacts.any { it.isModified() } -> loadModuleInfo() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ModuleArtifact.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ModuleArtifact.kt index 8c108bf77f2..a85fd497332 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ModuleArtifact.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/ModuleArtifact.kt @@ -32,11 +32,11 @@ class ModuleArtifact( val moduleSafeName = moduleName.safeModuleName val moduleExternalName = externalModuleName ?: moduleSafeName - fun loadJsIrModule(): JsIrModule { + fun loadJsIrModule(reexportedInModuleWithName: String? = null): JsIrModule { val fragments = fileArtifacts.sortedBy { it.srcFilePath }.flatMap { val fragments = it.loadJsIrFragments() listOfNotNull(fragments?.mainFragment, fragments?.exportFragment) } - return JsIrModule(moduleSafeName, moduleExternalName, fragments) + return JsIrModule(moduleSafeName, moduleExternalName, fragments, reexportedInModuleWithName) } } 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 1fa4ea09d90..7c0e32dbd4e 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 @@ -313,6 +313,12 @@ public class JsFirInvalidationPerFileTestGenerated extends AbstractJsFirInvalida runTest("js/js.translator/testData/incremental/invalidation/jsExport/"); } + @Test + @TestMetadata("jsExportReexport") + public void testJsExportReexport() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsExportReexport/"); + } + @Test @TestMetadata("jsExportWithMultipleFiles") public void testJsExportWithMultipleFiles() 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 e1e6b0a0420..08847911d62 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 @@ -313,6 +313,12 @@ public class JsFirInvalidationPerModuleTestGenerated extends AbstractJsFirInvali runTest("js/js.translator/testData/incremental/invalidation/jsExport/"); } + @Test + @TestMetadata("jsExportReexport") + public void testJsExportReexport() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsExportReexport/"); + } + @Test @TestMetadata("jsExportWithMultipleFiles") public void testJsExportWithMultipleFiles() 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 c3b3cfe81f6..afd90b7259c 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 @@ -313,6 +313,12 @@ public class JsIrES6InvalidationPerFileTestGenerated extends AbstractJsIrES6Inva runTest("js/js.translator/testData/incremental/invalidation/jsExport/"); } + @Test + @TestMetadata("jsExportReexport") + public void testJsExportReexport() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsExportReexport/"); + } + @Test @TestMetadata("jsExportWithMultipleFiles") public void testJsExportWithMultipleFiles() 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 ee29004199b..d4e0b2ca2c0 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 @@ -313,6 +313,12 @@ public class JsIrES6InvalidationPerModuleTestGenerated extends AbstractJsIrES6In runTest("js/js.translator/testData/incremental/invalidation/jsExport/"); } + @Test + @TestMetadata("jsExportReexport") + public void testJsExportReexport() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsExportReexport/"); + } + @Test @TestMetadata("jsExportWithMultipleFiles") public void testJsExportWithMultipleFiles() 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 c552c799c30..e505aae4ddb 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 @@ -313,6 +313,12 @@ public class JsIrInvalidationPerFileTestGenerated extends AbstractJsIrInvalidati runTest("js/js.translator/testData/incremental/invalidation/jsExport/"); } + @Test + @TestMetadata("jsExportReexport") + public void testJsExportReexport() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsExportReexport/"); + } + @Test @TestMetadata("jsExportWithMultipleFiles") public void testJsExportWithMultipleFiles() 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 98d55368c57..040ef3b1fc5 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 @@ -313,6 +313,12 @@ public class JsIrInvalidationPerModuleTestGenerated extends AbstractJsIrInvalida runTest("js/js.translator/testData/incremental/invalidation/jsExport/"); } + @Test + @TestMetadata("jsExportReexport") + public void testJsExportReexport() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/jsExportReexport/"); + } + @Test @TestMetadata("jsExportWithMultipleFiles") public void testJsExportWithMultipleFiles() throws Exception { diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.0.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.0.kt new file mode 100644 index 00000000000..d794e64f297 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.0.kt @@ -0,0 +1,2 @@ +inline fun foo() = 77 +fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.1.kt new file mode 100644 index 00000000000..a0ef41311f5 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.1.kt @@ -0,0 +1,2 @@ +@JsExport inline fun foo() = 77 +fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.2.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.2.kt new file mode 100644 index 00000000000..82d4868a2e6 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.2.kt @@ -0,0 +1,2 @@ +@JsName("bar") @JsExport inline fun foo() = 77 +fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.3.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.3.kt new file mode 100644 index 00000000000..f89192dfaeb --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.3.kt @@ -0,0 +1,2 @@ +@JsName("baz") @JsExport inline fun foo() = 77 +fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.4.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.4.kt new file mode 100644 index 00000000000..4c8ec3e246c --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.4.kt @@ -0,0 +1,2 @@ +@JsName("baz") @JsExport inline fun foo() = 77 +@JsExport fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.5.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.5.kt new file mode 100644 index 00000000000..a0436163b3d --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.5.kt @@ -0,0 +1,2 @@ +@JsName("baz") @JsExport inline fun foo() = 77 +@JsName("gaz77") @JsExport fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.6.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.6.kt new file mode 100644 index 00000000000..64e06a6f9a2 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/l1.6.kt @@ -0,0 +1,2 @@ +@JsName("baz") @JsExport inline fun foo() = 77 +@JsName("gaz99") @JsExport fun gaz() = 99 diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/module.info b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/module.info new file mode 100644 index 00000000000..68c1c49f240 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/lib1/module.info @@ -0,0 +1,28 @@ +STEP 0: + modifications: + U : l1.0.kt -> l1.kt + added file: l1.kt +STEP 1: + modifications: + U : l1.1.kt -> l1.kt + modified ir: l1.kt +STEP 2: + modifications: + U : l1.2.kt -> l1.kt + modified ir: l1.kt +STEP 3: + modifications: + U : l1.3.kt -> l1.kt + modified ir: l1.kt +STEP 4: + modifications: + U : l1.4.kt -> l1.kt + modified ir: l1.kt +STEP 5: + modifications: + U : l1.5.kt -> l1.kt + modified ir: l1.kt +STEP 6: + modifications: + U : l1.6.kt -> l1.kt + modified ir: l1.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/main/m.kt b/js/js.translator/testData/incremental/invalidation/jsExportReexport/main/m.kt new file mode 100644 index 00000000000..2a1cf61ad4e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/main/m.kt @@ -0,0 +1,8 @@ +@JsModule("test") +external fun test(step: Int): String + +fun box(step: Int): String { + if (foo() != 77) return "Fail foo" + if (gaz() != 99) return "Fail gaz" + return test(step) +} diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/main/module.info b/js/js.translator/testData/incremental/invalidation/jsExportReexport/main/module.info new file mode 100644 index 00000000000..4885e35b738 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/main/module.info @@ -0,0 +1,6 @@ +STEP 0: + dependencies: lib1 + added file: m.kt +STEP 1..6: + dependencies: lib1 + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/project.info b/js/js.translator/testData/incremental/invalidation/jsExportReexport/project.info new file mode 100644 index 00000000000..600f54081de --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/project.info @@ -0,0 +1,21 @@ +IGNORE_PER_FILE: true +MODULE_KIND: commonjs + +MODULES: lib1, main + +STEP 0: + libs: lib1, main + dirty js modules: lib1, main + dirty js files: lib1/l1, main/m, main/m.export, main +STEP 1: + libs: lib1, main + dirty js modules: lib1, main + dirty js files: lib1/l1, lib1/l1.export, lib1, main/m +STEP 2..3: + libs: lib1, main + dirty js modules: lib1, main + dirty js files: lib1/l1, lib1/l1.export, main/m +STEP 4..6: + libs: lib1, main + dirty js modules: lib1, main + dirty js files: lib1/l1, lib1/l1.export, main/m \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/jsExportReexport/test.js b/js/js.translator/testData/incremental/invalidation/jsExportReexport/test.js new file mode 100644 index 00000000000..6945bdee194 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/jsExportReexport/test.js @@ -0,0 +1,34 @@ +module.exports = function (step) { + const lib1 = require("./main.js") + + let result; + switch (step) { + case 0: return "OK" + case 1: + result = lib1.foo() + return result === 77 ? "OK" : `Fail 1: Expect 77 but got ${result}` + case 2: + result = lib1.bar() + return result === 77 ? "OK" : `Fail 2: Expect 77 but got ${result}` + case 3: + result = lib1.baz() + return result === 77 ? "OK" : `Fail 3: Expect 77 but got ${result}` + case 4: + result = lib1.baz() + if (result !== 77) return `Fail 4: Expect 77 but got ${result}` + result = lib1.gaz() + return result === 99 ? "OK" : `Fail 4: Expect 99 but got ${result}` + case 5: + result = lib1.baz() + if (result !== 77) return `Fail 5: Expect 77 but got ${result}` + result = lib1.gaz77() + return result === 99 ? "OK" : `Fail 5: Expect 99 but got ${result}` + case 6: + result = lib1.baz() + if (result !== 77) return `Fail 6: Expect 77 but got ${result}` + result = lib1.gaz99() + return result === 99 ? "OK" : `Fail 6: Expect 99 but got ${result}` + } + + return "OK" +} \ No newline at end of file