JS: do not create duplicate local variables for packages
This commit is contained in:
@@ -52,6 +52,8 @@ var JsInvocation.typeCheck: TypeCheck? by MetadataProperty(default = null)
|
|||||||
|
|
||||||
var JsInvocation.boxing: Boolean by MetadataProperty(default = false)
|
var JsInvocation.boxing: Boolean by MetadataProperty(default = false)
|
||||||
|
|
||||||
|
var JsVars.exportedPackage: String? by MetadataProperty(default = null)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* For function and lambda bodies indicates what declaration corresponds to.
|
* For function and lambda bodies indicates what declaration corresponds to.
|
||||||
* When absent (`null`) on body of a named function, this function is from external JS module.
|
* When absent (`null`) on body of a named function, this function is from external JS module.
|
||||||
|
|||||||
+3
-2
@@ -16,10 +16,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.js.translate.context
|
package org.jetbrains.kotlin.js.translate.context
|
||||||
|
|
||||||
import org.jetbrains.kotlin.js.backend.ast.metadata.staticRef
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable
|
import org.jetbrains.kotlin.descriptors.annotations.isInlineOnlyOrReifiable
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*
|
import org.jetbrains.kotlin.js.backend.ast.*
|
||||||
|
import org.jetbrains.kotlin.js.backend.ast.metadata.exportedPackage
|
||||||
|
import org.jetbrains.kotlin.js.backend.ast.metadata.staticRef
|
||||||
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
|
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils
|
||||||
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isLibraryObject
|
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isLibraryObject
|
||||||
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject
|
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject
|
||||||
@@ -137,7 +138,7 @@ internal class DeclarationExporter(val context: StaticContext) {
|
|||||||
val selfRef = JsNameRef(packageName.shortName().asString(), parentRef)
|
val selfRef = JsNameRef(packageName.shortName().asString(), parentRef)
|
||||||
val rhs = JsAstUtils.or(selfRef, assignment(selfRef.deepCopy(), JsObjectLiteral(false)))
|
val rhs = JsAstUtils.or(selfRef, assignment(selfRef.deepCopy(), JsObjectLiteral(false)))
|
||||||
|
|
||||||
statements.add(JsAstUtils.newVar(name, rhs))
|
statements.add(JsAstUtils.newVar(name, rhs).apply { exportedPackage = packageName.asString() })
|
||||||
}
|
}
|
||||||
return name.makeRef()
|
return name.makeRef()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.js.translate.general
|
|||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.js.backend.ast.*
|
import org.jetbrains.kotlin.js.backend.ast.*
|
||||||
import org.jetbrains.kotlin.js.backend.ast.metadata.coroutineMetadata
|
import org.jetbrains.kotlin.js.backend.ast.metadata.coroutineMetadata
|
||||||
|
import org.jetbrains.kotlin.js.backend.ast.metadata.exportedPackage
|
||||||
import org.jetbrains.kotlin.js.translate.context.Namer
|
import org.jetbrains.kotlin.js.translate.context.Namer
|
||||||
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
|
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
|
|||||||
private val declaredImports = mutableSetOf<String>()
|
private val declaredImports = mutableSetOf<String>()
|
||||||
private val classes = mutableMapOf<JsName, JsClassModel>()
|
private val classes = mutableMapOf<JsName, JsClassModel>()
|
||||||
private val importedModulesImpl = mutableListOf<JsImportedModule>()
|
private val importedModulesImpl = mutableListOf<JsImportedModule>()
|
||||||
|
private val exportedPackages = mutableMapOf<String, JsName>()
|
||||||
|
|
||||||
// Add declaration and initialization statements from program fragment to resulting single program
|
// Add declaration and initialization statements from program fragment to resulting single program
|
||||||
fun addFragment(fragment: JsProgramFragment) {
|
fun addFragment(fragment: JsProgramFragment) {
|
||||||
@@ -48,7 +50,7 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
|
|||||||
|
|
||||||
declarationBlock.statements += fragment.declarationBlock
|
declarationBlock.statements += fragment.declarationBlock
|
||||||
initializerBlock.statements += fragment.initializerBlock
|
initializerBlock.statements += fragment.initializerBlock
|
||||||
exportBlock.statements += fragment.exportBlock
|
addExportStatements(fragment)
|
||||||
|
|
||||||
classes += fragment.classes.values.map { cls ->
|
classes += fragment.classes.values.map { cls ->
|
||||||
val name = nameMap.rename(cls.name)
|
val name = nameMap.rename(cls.name)
|
||||||
@@ -89,6 +91,24 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
|
|||||||
return nameMap
|
return nameMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun addExportStatements(fragment: JsProgramFragment) {
|
||||||
|
val nameMap = mutableMapOf<JsName, JsName>()
|
||||||
|
for (statement in fragment.exportBlock.statements) {
|
||||||
|
if (statement is JsVars && statement.exportedPackage != null) {
|
||||||
|
val exportedPackage = statement.exportedPackage!!
|
||||||
|
val localName = statement.vars[0].name
|
||||||
|
if (exportedPackage in exportedPackages) {
|
||||||
|
nameMap[localName] = exportedPackages[exportedPackage]!!
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
exportedPackages[exportedPackage] = localName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exportBlock.statements += nameMap.rename(statement)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun Map<JsName, JsName>.rename(fragment: JsProgramFragment) {
|
private fun Map<JsName, JsName>.rename(fragment: JsProgramFragment) {
|
||||||
rename(fragment.declarationBlock)
|
rename(fragment.declarationBlock)
|
||||||
rename(fragment.exportBlock)
|
rename(fragment.exportBlock)
|
||||||
|
|||||||
Reference in New Issue
Block a user