JS: switch off inlined local declaration deduplication (KT-30877 fixed)
(cherry picked from commit 681e8dd9682afdea822af8e0ad76c9242831e639)
This commit is contained in:
@@ -29,8 +29,6 @@ sealed class InliningScope {
|
|||||||
|
|
||||||
protected abstract fun addImport(tag: String, vars: JsVars)
|
protected abstract fun addImport(tag: String, vars: JsVars)
|
||||||
|
|
||||||
protected open fun addLocalDeclarationBinding(inlineFunctionTag: String, name: JsName, index: Int) {}
|
|
||||||
|
|
||||||
protected open fun preprocess(statement: JsStatement) {}
|
protected open fun preprocess(statement: JsStatement) {}
|
||||||
|
|
||||||
private val publicFunctionCache = mutableMapOf<String, JsFunction>()
|
private val publicFunctionCache = mutableMapOf<String, JsFunction>()
|
||||||
@@ -82,26 +80,16 @@ sealed class InliningScope {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val localDeclarations = mutableListOf<JsName>()
|
|
||||||
|
|
||||||
copiedStatements.asSequence()
|
copiedStatements.asSequence()
|
||||||
.flatMap { node -> collectDefinedNamesInAllScopes(node).asSequence() }
|
.flatMap { node -> collectDefinedNamesInAllScopes(node).asSequence() }
|
||||||
.filter { name -> !newReplacements.containsKey(name) }
|
.filter { name -> !newReplacements.containsKey(name) }
|
||||||
.forEach { name ->
|
.forEach { name ->
|
||||||
val alias = JsScope.declareTemporaryName(name.ident)
|
val alias = JsScope.declareTemporaryName(name.ident)
|
||||||
alias.copyMetadataFrom(name)
|
alias.copyMetadataFrom(name)
|
||||||
localDeclarations += alias
|
|
||||||
val replacement = JsAstUtils.pureFqn(alias, null)
|
val replacement = JsAstUtils.pureFqn(alias, null)
|
||||||
newReplacements[name] = replacement
|
newReplacements[name] = replacement
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add local declarations to the name bindings in order to correctly rename usages of the same imported local declaraions
|
|
||||||
definition.tag?.let { tag ->
|
|
||||||
localDeclarations.forEachIndexed { index, name ->
|
|
||||||
addLocalDeclarationBinding(tag, name, index)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply renaming and restore the static ref links
|
// Apply renaming and restore the static ref links
|
||||||
JsBlock(copiedStatements).let {
|
JsBlock(copiedStatements).let {
|
||||||
replaceNames(it, newReplacements)
|
replaceNames(it, newReplacements)
|
||||||
@@ -189,10 +177,6 @@ class ImportIntoFragmentInliningScope private constructor(
|
|||||||
addNameBinding(name, tag)
|
addNameBinding(name, tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun addLocalDeclarationBinding(inlineFunctionTag: String, name: JsName, index: Int) {
|
|
||||||
addNameBinding(name, "\$local:$inlineFunctionTag:$index")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addInlinedDeclaration(tag: String?, declaration: JsStatement) {
|
override fun addInlinedDeclaration(tag: String?, declaration: JsStatement) {
|
||||||
if (tag != null) {
|
if (tag != null) {
|
||||||
fragment.inlinedLocalDeclarations.computeIfAbsent(tag) { JsGlobalBlock() }.statements.add(declaration)
|
fragment.inlinedLocalDeclarations.computeIfAbsent(tag) { JsGlobalBlock() }.statements.add(declaration)
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ class Merger(
|
|||||||
return rootNode
|
return rootNode
|
||||||
}
|
}
|
||||||
|
|
||||||
private val importedFunctionWrappers = mutableMapOf<String, JsGlobalBlock>()
|
private val additionalFakeOverrides = mutableListOf<JsStatement>()
|
||||||
|
|
||||||
private fun mergeNames() {
|
private fun mergeNames() {
|
||||||
for (fragment in fragments) {
|
for (fragment in fragments) {
|
||||||
@@ -204,15 +204,23 @@ class Merger(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fragment.inlinedLocalDeclarations.forEach { (_, imports) ->
|
||||||
|
imports.statements.forEach { s ->
|
||||||
|
if (s.isFakeOverrideAssignment()) {
|
||||||
|
additionalFakeOverrides += s
|
||||||
|
} else {
|
||||||
|
declarationBlock.statements += s
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
declarationBlock.statements += fragment.declarationBlock
|
declarationBlock.statements += fragment.declarationBlock
|
||||||
initializerBlock.statements += fragment.initializerBlock
|
initializerBlock.statements += fragment.initializerBlock
|
||||||
fragment.tryUpdateTests()
|
fragment.tryUpdateTests()
|
||||||
fragment.tryUpdateMain()
|
fragment.tryUpdateMain()
|
||||||
addExportStatements(fragment)
|
addExportStatements(fragment)
|
||||||
|
|
||||||
fragment.inlinedLocalDeclarations.forEach { (tag, imports) ->
|
|
||||||
importedFunctionWrappers.putIfAbsent(tag, imports)
|
|
||||||
}
|
|
||||||
|
|
||||||
classes += fragment.classes
|
classes += fragment.classes
|
||||||
}
|
}
|
||||||
@@ -241,18 +249,6 @@ class Merger(
|
|||||||
this += importBlock.statements
|
this += importBlock.statements
|
||||||
addClassPrototypes(this)
|
addClassPrototypes(this)
|
||||||
|
|
||||||
// TODO better placing?
|
|
||||||
val additionalFakeOverrides = mutableListOf<JsStatement>()
|
|
||||||
importedFunctionWrappers.values.forEach { block ->
|
|
||||||
block.statements.forEach { s ->
|
|
||||||
if (s.isFakeOverrideAssignment()) {
|
|
||||||
additionalFakeOverrides += s
|
|
||||||
} else {
|
|
||||||
this += s
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this += declarationBlock.statements
|
this += declarationBlock.statements
|
||||||
this += exportBlock.statements
|
this += exportBlock.statements
|
||||||
addClassPostDeclarations(this)
|
addClassPostDeclarations(this)
|
||||||
|
|||||||
Reference in New Issue
Block a user