[Gradle, JS] Correct require relative path

This commit is contained in:
Ilya Goncharov
2022-07-27 23:36:27 +02:00
committed by teamcity
parent 642fae1a5b
commit eed994f1fe
3 changed files with 27 additions and 4 deletions
@@ -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))))
@@ -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<String, JsName>()
@@ -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)
@@ -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?)