[K/JS] Rework ES modules part with squashed JsImport and right renaming strategy inside import/export statements

This commit is contained in:
Artem Kobzar
2023-03-16 10:28:39 +00:00
committed by Space Team
parent 3c0048bfd8
commit 948c511284
28 changed files with 382 additions and 257 deletions
@@ -15,14 +15,14 @@ import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity
import org.jetbrains.kotlin.ir.backend.js.ic.JsExecutableProducer
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsManglerDesc
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.IrModuleToJsTransformer
import org.jetbrains.kotlin.ir.backend.js.SourceMapsInfo
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CompilationOutputs
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.*
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImplForJsIC
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.util.irMessageLogger
import org.jetbrains.kotlin.js.backend.ast.ESM_EXTENSION
import org.jetbrains.kotlin.js.backend.ast.REGULAR_EXTENSION
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION
import org.jetbrains.kotlin.js.test.utils.extractTestPackage
@@ -37,13 +37,12 @@ import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsArtifactSimpleName
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.fileUtils.withReplacedExtensionOrNull
import java.io.File
const val REGULAR_EXTENSION = ".js"
const val ESM_EXTENSION = ".mjs"
class JsIrBackendFacade(
val testServices: TestServices,
private val firstTimeCompilation: Boolean
@@ -132,10 +131,10 @@ class JsIrBackendFacade(
val loweredIr = compileIr(
irModuleFragment.apply { resolveTestPathes() },
irModuleFragment.apply { resolveTestPaths() },
MainModule.Klib(inputArtifact.outputFile.absolutePath),
configuration,
dependencyModules.apply { forEach { it.resolveTestPathes() } },
dependencyModules.onEach { it.resolveTestPaths() },
emptyMap(),
irModuleFragment.irBuiltins,
symbolTable,
@@ -150,14 +149,10 @@ class JsIrBackendFacade(
granularity = granularity,
)
return loweredIr2JsArtifact(module, loweredIr, granularity)
return loweredIr2JsArtifact(module, loweredIr)
}
private fun loweredIr2JsArtifact(
module: TestModule,
loweredIr: LoweredIr,
granularity: JsGenerationGranularity,
): BinaryArtifacts.Js {
private fun loweredIr2JsArtifact(module: TestModule, loweredIr: LoweredIr): BinaryArtifacts.Js {
val mainArguments = JsEnvironmentConfigurator.getMainCallParametersForModule(module)
.run { if (shouldBeGenerated()) arguments() else null }
val runIrDce = JsEnvironmentConfigurationDirectives.RUN_IR_DCE in module.directives
@@ -172,10 +167,13 @@ class JsIrBackendFacade(
val transformer = IrModuleToJsTransformer(
loweredIr.context,
mainArguments,
moduleToName = JsIrModuleToPath(
testServices,
isEsModules && granularity != JsGenerationGranularity.WHOLE_PROGRAM
)
moduleToName = runIf(isEsModules) {
loweredIr.allModules.associateWith {
"./${getJsArtifactSimpleName(testServices, it.safeName)}_v5.mjs".run {
if (isWindows) minify() else this
}
}
} ?: emptyMap()
)
// If runIrDce then include DCE results
// If perModuleOnly then skip whole program
@@ -188,7 +186,7 @@ class JsIrBackendFacade(
return BinaryArtifacts.Js.JsIrArtifact(outputFile, compilationOut).dump(module)
}
private fun IrModuleFragment.resolveTestPathes() {
private fun IrModuleFragment.resolveTestPaths() {
JsIrPathReplacer(testServices).let {
files.forEach(it::lower)
}
@@ -274,7 +272,7 @@ class JsIrBackendFacade(
private fun CompilationOutputs.writeTo(outputFile: File, moduleId: String, moduleKind: ModuleKind) {
val allJsFiles = writeAll(outputFile.parentFile, outputFile.nameWithoutExtension, false, moduleId, moduleKind).filter {
it.extension == "js"
it.extension == "js" || it.extension == "mjs"
}
val mainModuleFile = allJsFiles.last()
@@ -296,12 +294,6 @@ class JsIrBackendFacade(
}
}
val ModuleKind.extension: String
get() = when (this) {
ModuleKind.ES -> ESM_EXTENSION
else -> REGULAR_EXTENSION
}
val RegisteredDirectives.moduleKind: ModuleKind
get() = get(JsEnvironmentConfigurationDirectives.MODULE_KIND).singleOrNull()
?: if (contains(JsEnvironmentConfigurationDirectives.ES_MODULES)) ModuleKind.ES else ModuleKind.PLAIN
@@ -311,15 +303,15 @@ val TestModule.kind: ModuleKind
fun String.augmentWithModuleName(moduleName: String): String {
val normalizedName = moduleName.run { if (isWindows) minify() else this }
val suffix = when {
endsWith(ESM_EXTENSION) -> ESM_EXTENSION
endsWith(REGULAR_EXTENSION) -> REGULAR_EXTENSION
else -> error("Unexpected file '$this' extension")
}
return if (normalizedName.isPath()) {
replaceAfterLast(File.separator, normalizedName.replace("./", ""))
return if (suffix == ESM_EXTENSION) {
replaceAfterLast(File.separator, normalizedName.replace("./", "")).removeSuffix(suffix) + suffix
} else {
val suffix = when {
endsWith(ESM_EXTENSION) -> ESM_EXTENSION
endsWith(REGULAR_EXTENSION) -> REGULAR_EXTENSION
else -> error("Unexpected file '$this' extension")
}
return removeSuffix("_v5$suffix") + "-${normalizedName}_v5$suffix"
}
}
@@ -1,35 +0,0 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.js.test.converters
import org.jetbrains.kotlin.cli.common.isWindows
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.safeName
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator.Companion.getJsArtifactSimpleName
import org.jetbrains.kotlin.utils.addToStdlib.runIf
private typealias K = IrModuleFragment
private typealias V = String
class JsIrModuleToPath(val testServices: TestServices, shouldProvidePaths: Boolean) : Map<K, V> {
override val size = if (!shouldProvidePaths) 0 else 1
override val entries = emptySet<Map.Entry<K, V>>()
override val keys = emptySet<K>()
override val values = emptyList<V>()
override fun isEmpty() = size == 0
override fun containsKey(key: K): Boolean = !isEmpty()
override fun containsValue(value: V): Boolean = !isEmpty()
override operator fun get(key: K): V? {
return runIf(!isEmpty()) {
"./${getJsArtifactSimpleName(testServices, key.safeName)}_v5.mjs".run {
if (isWindows) minify() else this
}
}
}
}
@@ -6,11 +6,11 @@
package org.jetbrains.kotlin.js.test.utils
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.TranslationMode
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.extension
import org.jetbrains.kotlin.js.JavaScript
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.js.test.JsAdditionalSourceProvider
import org.jetbrains.kotlin.js.test.converters.augmentWithModuleName
import org.jetbrains.kotlin.js.test.converters.extension
import org.jetbrains.kotlin.js.test.converters.kind
import org.jetbrains.kotlin.js.test.handlers.JsBoxRunner.Companion.TEST_FUNCTION
import org.jetbrains.kotlin.js.testOld.*
@@ -131,7 +131,7 @@ fun testWithModuleSystem(testServices: TestServices): Boolean {
val globalDirectives = testServices.moduleStructure.allDirectives
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(getMainModule(testServices))
val mainModuleKind = configuration[JSConfigurationKeys.MODULE_KIND]
return mainModuleKind != ModuleKind.PLAIN && NO_JS_MODULE_SYSTEM !in globalDirectives
return mainModuleKind != ModuleKind.PLAIN && mainModuleKind != ModuleKind.ES && NO_JS_MODULE_SYSTEM !in globalDirectives
}
fun getModeOutputFilePath(testServices: TestServices, module: TestModule, mode: TranslationMode): String {
@@ -8934,6 +8934,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
runTest("js/js.translator/testData/box/reflection/findAssociatedObject.kt");
}
@Test
@TestMetadata("findAssociatedObjectInSeparatedFile.kt")
public void testFindAssociatedObjectInSeparatedFile() throws Exception {
runTest("js/js.translator/testData/box/reflection/findAssociatedObjectInSeparatedFile.kt");
}
@Test
@TestMetadata("findAssociatedObject_oldBE.kt")
public void testFindAssociatedObject_oldBE() throws Exception {
@@ -2297,12 +2297,6 @@ 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 {
@@ -9844,6 +9838,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest {
runTest("js/js.translator/testData/box/reflection/findAssociatedObject.kt");
}
@Test
@TestMetadata("findAssociatedObjectInSeparatedFile.kt")
public void testFindAssociatedObjectInSeparatedFile() throws Exception {
runTest("js/js.translator/testData/box/reflection/findAssociatedObjectInSeparatedFile.kt");
}
@Test
@TestMetadata("findAssociatedObject_oldBE.kt")
public void testFindAssociatedObject_oldBE() throws Exception {
@@ -2403,12 +2403,6 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
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 {
@@ -9950,6 +9944,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
runTest("js/js.translator/testData/box/reflection/findAssociatedObject.kt");
}
@Test
@TestMetadata("findAssociatedObjectInSeparatedFile.kt")
public void testFindAssociatedObjectInSeparatedFile() throws Exception {
runTest("js/js.translator/testData/box/reflection/findAssociatedObjectInSeparatedFile.kt");
}
@Test
@TestMetadata("findAssociatedObject_oldBE.kt")
public void testFindAssociatedObject_oldBE() throws Exception {
@@ -2297,12 +2297,6 @@ 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 {
@@ -9844,6 +9838,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
runTest("js/js.translator/testData/box/reflection/findAssociatedObject.kt");
}
@Test
@TestMetadata("findAssociatedObjectInSeparatedFile.kt")
public void testFindAssociatedObjectInSeparatedFile() throws Exception {
runTest("js/js.translator/testData/box/reflection/findAssociatedObjectInSeparatedFile.kt");
}
@Test
@TestMetadata("findAssociatedObject_oldBE.kt")
public void testFindAssociatedObject_oldBE() throws Exception {