From eed994f1fe08a77d0f4401090f55f08a188dc183 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 27 Jul 2022 23:36:27 +0200 Subject: [PATCH] [Gradle, JS] Correct require relative path --- .../irToJs/IrModuleToJsTransformer.kt | 2 +- .../irToJs/JsIrProgramFragment.kt | 25 ++++++++++++++++++- .../kotlin/js/backend/ast/JsImportedModule.kt | 4 +-- 3 files changed, 27 insertions(+), 4 deletions(-) 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 4d42c329696..dc49c491c2f 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 @@ -253,7 +253,7 @@ class IrModuleToJsTransformer( } val moduleName = declareFreshGlobal(module.safeName) - modules += JsImportedModule(module.externalModuleName(), moduleName, null, relativeRequirePath) + modules += JsImportedModule(module.externalModuleName(), moduleName, null, null) names.forEach { imports += JsVars(JsVars.JsVar(JsName(it, false), JsNameRef(it, ReservedJsNames.makeCrossModuleNameRef(moduleName)))) 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 98e91db93f4..fd886263a85 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs import org.jetbrains.kotlin.ir.backend.js.utils.toJsIdentifier import org.jetbrains.kotlin.js.backend.ast.* +import java.io.File class JsIrProgramFragment(val packageFqn: String) { val nameBindings = mutableMapOf() @@ -128,7 +129,14 @@ private class JsIrModuleCrossModuleReferecenceBuilder(val header: JsIrModuleHead fun import(moduleHeader: JsIrModuleHeader): JsName { return importedModules.getOrPut(moduleHeader) { val jsModuleName = JsName(moduleHeader.moduleName, false) - JsImportedModule(moduleHeader.externalModuleName, jsModuleName, null, relativeRequirePath) + val relativeRequirePath = relativeRequirePath(moduleHeader) + + JsImportedModule( + moduleHeader.externalModuleName, + jsModuleName, + null, + relativeRequirePath + ) }.internalName } @@ -149,6 +157,21 @@ private class JsIrModuleCrossModuleReferecenceBuilder(val header: JsIrModuleHead } return CrossModuleReferences(importedModules.values.toList(), transitiveExport, exportNames, resultImports) } + + private fun relativeRequirePath(moduleHeader: JsIrModuleHeader): String? { + if (!this.relativeRequirePath) return null + + val parentMain = File(header.externalModuleName).parentFile + + if (parentMain == null) return "./${moduleHeader.externalModuleName}" + + val relativePath = File(moduleHeader.externalModuleName) + .toRelativeString(parentMain) + .replace(File.separator, "/") + + return relativePath.takeIf { it.startsWith("../") } + ?: "./$relativePath" + } } class CrossModuleImport(val exportedAs: String, val moduleExporter: JsName) diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsImportedModule.kt b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsImportedModule.kt index d6ba419530a..417291a97f2 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsImportedModule.kt +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsImportedModule.kt @@ -21,12 +21,12 @@ class JsImportedModule @JvmOverloads constructor( val externalName: String, var internalName: JsName, val plainReference: JsExpression?, - val relativeRequirePath: Boolean = false + val relativeRequirePath: String? = null ) { val key = JsImportedModuleKey(externalName, plainReference?.toString()) } val JsImportedModule.requireName: String - get() = if (relativeRequirePath) "./$externalName.js" else externalName + get() = relativeRequirePath?.let { "$it.js" } ?: externalName data class JsImportedModuleKey(val baseName: String, val plainName: String?) \ No newline at end of file