[JS IR] Fix cross-module import/export in case per-module splitting

This commit is contained in:
Anton Bannykh
2020-08-20 17:05:11 +03:00
committed by Roman Artemev
parent 8d61e9ba21
commit 136d86e552
2 changed files with 10 additions and 10 deletions
@@ -8,17 +8,16 @@ package org.jetbrains.kotlin.ir.backend.js.export
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsAstUtils import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsAstUtils
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.defineProperty import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.defineProperty
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.jsAssignment import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.jsAssignment
import org.jetbrains.kotlin.ir.backend.js.utils.NameTable import org.jetbrains.kotlin.ir.backend.js.utils.IrNamer
import org.jetbrains.kotlin.ir.backend.js.utils.NameTables
import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.backend.ast.*
class ExportModelToJsStatements( class ExportModelToJsStatements(
private val internalModuleName: JsName, private val internalModuleName: JsName,
private val nameTables: NameTables private val namer: IrNamer,
private val declareNewNamespace: (String) -> String
) { ) {
private val namespaceToRefMap = mutableMapOf<String, JsNameRef>() private val namespaceToRefMap = mutableMapOf<String, JsNameRef>()
private val globalNames = NameTable<String>(nameTables.globalNames)
fun generateModuleExport(module: ExportedModule): List<JsStatement> { fun generateModuleExport(module: ExportedModule): List<JsStatement> {
return module.declarations.flatMap { generateDeclarationExport(it, JsNameRef(internalModuleName)) } return module.declarations.flatMap { generateDeclarationExport(it, JsNameRef(internalModuleName)) }
@@ -34,7 +33,7 @@ class ExportModelToJsStatements(
for (element in elements) { for (element in elements) {
val newNamespace = "$currentNamespace$$element" val newNamespace = "$currentNamespace$$element"
val newNameSpaceRef = namespaceToRefMap.getOrPut(newNamespace) { val newNameSpaceRef = namespaceToRefMap.getOrPut(newNamespace) {
val varName = globalNames.declareFreshName(newNamespace, newNamespace) val varName = declareNewNamespace(newNamespace)
val varRef = JsNameRef(varName) val varRef = JsNameRef(varName)
val namespaceRef = JsNameRef(element, currentRef) val namespaceRef = JsNameRef(element, currentRef)
statements += JsVars( statements += JsVars(
@@ -60,7 +59,7 @@ class ExportModelToJsStatements(
listOf( listOf(
jsAssignment( jsAssignment(
JsNameRef(declaration.name, namespace), JsNameRef(declaration.name, namespace),
JsNameRef(nameTables.getNameForStaticDeclaration(declaration.ir)) JsNameRef(namer.getNameForStaticDeclaration(declaration.ir))
).makeStmt() ).makeStmt()
) )
} }
@@ -68,8 +67,8 @@ class ExportModelToJsStatements(
is ExportedConstructor -> emptyList() is ExportedConstructor -> emptyList()
is ExportedProperty -> { is ExportedProperty -> {
val getter = declaration.irGetter?.let { JsNameRef(nameTables.getNameForStaticDeclaration(it)) } val getter = declaration.irGetter?.let { JsNameRef(namer.getNameForStaticDeclaration(it)) }
val setter = declaration.irSetter?.let { JsNameRef(nameTables.getNameForStaticDeclaration(it)) } val setter = declaration.irSetter?.let { JsNameRef(namer.getNameForStaticDeclaration(it)) }
listOf(defineProperty(namespace, declaration.name, getter, setter).makeStmt()) listOf(defineProperty(namespace, declaration.name, getter, setter).makeStmt())
} }
@@ -81,7 +80,7 @@ class ExportModelToJsStatements(
val klassExport = jsAssignment( val klassExport = jsAssignment(
newNameSpace, newNameSpace,
JsNameRef( JsNameRef(
nameTables.getNameForStaticDeclaration( namer.getNameForStaticDeclaration(
declaration.ir declaration.ir
) )
) )
@@ -149,7 +149,8 @@ class IrModuleToJsTransformer(
val moduleBody = generateModuleBody(modules, rootContext) val moduleBody = generateModuleBody(modules, rootContext)
val internalModuleName = JsName("_") val internalModuleName = JsName("_")
val exportStatements = ExportModelToJsStatements(internalModuleName, namer).generateModuleExport(exportedModule) val globalNames = NameTable<String>(namer.globalNames)
val exportStatements = ExportModelToJsStatements(internalModuleName, nameGenerator, { globalNames.declareFreshName(it, it)}).generateModuleExport(exportedModule)
val callToMain = generateCallToMain(modules, rootContext) val callToMain = generateCallToMain(modules, rootContext)