diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index 60e223d180a..d5ac3bf6424 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -157,6 +157,9 @@ class K2JSCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xir-per-module", description = "Splits generated .js per-module") var irPerModule: Boolean by FreezableVar(false) + @Argument(value = "-Xir-per-module-prefix", description = "Adds a custom prefix to the splitted js files") + var irPerModulePrefix: String? by NullableStringFreezableVar(null) + @Argument( value = "-Xinclude", valueDescription = "", diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index 4ffae7ad7c4..953acb6af51 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -274,6 +274,7 @@ class K2JsIrCompiler : CLICompiler() { relativeRequirePath = true, propertyLazyInitialization = arguments.irPropertyLazyInitialization, legacyPropertyAccess = arguments.irLegacyPropertyAccess, + irPerModulePrefix = arguments.irPerModulePrefix ) val jsCode = if (arguments.irDce && !arguments.irDceDriven) compiledModule.dceJsCode!! else compiledModule.jsCode!! diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index c6e5ff00864..4d2c1a51663 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -53,6 +53,7 @@ fun compile( relativeRequirePath: Boolean = false, propertyLazyInitialization: Boolean, legacyPropertyAccess: Boolean = false, + irPerModulePrefix: String? = null, ): CompilerResult { val (moduleFragment: IrModuleFragment, dependencyModules, irBuiltIns, symbolTable, deserializer, moduleToName) = loadIr(project, mainModule, analyzer, configuration, allDependencies, friendDependencies, irFactory) @@ -111,6 +112,7 @@ fun compile( multiModule = multiModule, relativeRequirePath = relativeRequirePath, moduleToName = moduleToName, + irPerModulePrefix = irPerModulePrefix, ) return transformer.generateModule(allModules) } else { @@ -123,6 +125,7 @@ fun compile( multiModule = multiModule, relativeRequirePath = relativeRequirePath, moduleToName = moduleToName, + irPerModulePrefix = irPerModulePrefix, ) return transformer.generateModule(allModules) } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt index 455ff4fb085..dca47a9a37b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt @@ -32,7 +32,8 @@ class IrModuleToJsTransformer( private val dceJs: Boolean = false, private val multiModule: Boolean = false, private val relativeRequirePath: Boolean = false, - private val moduleToName: Map = emptyMap() + private val moduleToName: Map = emptyMap(), + private val irPerModulePrefix: String? = null, ) { private val generateRegionComments = backendContext.configuration.getBoolean(JSConfigurationKeys.GENERATE_REGION_COMMENTS) @@ -92,7 +93,7 @@ class IrModuleToJsTransformer( ) val dependencies = others.mapIndexed { index, module -> - val moduleName = moduleToName[module] ?: sanitizeName(module.safeName) + val moduleName = module.externalModuleName() val exportedDeclarations = ExportModelGenerator(backendContext).let { module.files.flatMap { file -> it.generateExport(file) } } @@ -191,6 +192,10 @@ class IrModuleToJsTransformer( return program.toString() } + private fun IrModuleFragment.externalModuleName(): String { + return (irPerModulePrefix ?: "") + (moduleToName[this] ?: sanitizeName(safeName)) + } + private fun generateCrossModuleImports( namerWithImports: IrNamerWithImports, currentModules: Iterable, @@ -207,7 +212,7 @@ class IrModuleToJsTransformer( } val moduleName = declareFreshGlobal(module.safeName) - modules += JsImportedModule(moduleToName[module] ?: moduleName.ident, moduleName, moduleName.makeRef(), relativeRequirePath) + modules += JsImportedModule(module.externalModuleName(), moduleName, moduleName.makeRef(), relativeRequirePath) names.forEach { imports += JsVars(JsVars.JsVar(JsName(it), JsNameRef(it, JsNameRef("\$crossModule\$", moduleName.makeRef()))))