JS: don't resolve unused temporaries
This commit is contained in:
@@ -39,12 +39,14 @@ import com.google.dart.compiler.backend.js.ast.metadata.suspendObjectRef
|
|||||||
import org.jetbrains.kotlin.js.inline.util.collectReferencedTemporaryNames
|
import org.jetbrains.kotlin.js.inline.util.collectReferencedTemporaryNames
|
||||||
|
|
||||||
fun JsNode.resolveTemporaryNames() {
|
fun JsNode.resolveTemporaryNames() {
|
||||||
|
val allNames = collectReferencedTemporaryNames(this)
|
||||||
|
|
||||||
val scopeTree = ScopeCollector().let {
|
val scopeTree = ScopeCollector().let {
|
||||||
it.accept(this)
|
it.accept(this)
|
||||||
it.scopeTree
|
it.scopeTree
|
||||||
}
|
}
|
||||||
|
|
||||||
val renamings = scopeTree.resolveNames()
|
val renamings = scopeTree.resolveNames(allNames)
|
||||||
accept(object : RecursiveJsVisitor() {
|
accept(object : RecursiveJsVisitor() {
|
||||||
override fun visitElement(node: JsNode) {
|
override fun visitElement(node: JsNode) {
|
||||||
super.visitElement(node)
|
super.visitElement(node)
|
||||||
@@ -65,10 +67,10 @@ fun JsNode.resolveTemporaryNames() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Map<JsScope, Set<JsScope>>.resolveNames(): Map<JsName, JsName> {
|
private fun Map<JsScope, Set<JsScope>>.resolveNames(knownNames: Set<JsName>): Map<JsName, JsName> {
|
||||||
val replacements = mutableMapOf<JsName, JsName>()
|
val replacements = mutableMapOf<JsName, JsName>()
|
||||||
fun traverse(scope: JsScope) {
|
fun traverse(scope: JsScope) {
|
||||||
for (temporaryName in scope.temporaryNames.sortedBy { it.ordinal }) {
|
for (temporaryName in scope.temporaryNames.filter { it in knownNames }.sortedBy { it.ordinal }) {
|
||||||
replacements[temporaryName] = scope.declareFreshName(temporaryName.ident).apply { copyMetadataFrom(temporaryName) }
|
replacements[temporaryName] = scope.declareFreshName(temporaryName.ident).apply { copyMetadataFrom(temporaryName) }
|
||||||
}
|
}
|
||||||
this[scope]!!.forEach(::traverse)
|
this[scope]!!.forEach(::traverse)
|
||||||
|
|||||||
@@ -25,8 +25,23 @@ import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
|
|||||||
fun collectFunctionReferencesInside(scope: JsNode): List<JsName> =
|
fun collectFunctionReferencesInside(scope: JsNode): List<JsName> =
|
||||||
collectReferencedNames(scope).filter { it.staticRef is JsFunction }
|
collectReferencedNames(scope).filter { it.staticRef is JsFunction }
|
||||||
|
|
||||||
|
fun collectReferencedTemporaryNames(scope: JsNode): Set<JsName> {
|
||||||
|
val references = mutableSetOf<JsName>()
|
||||||
|
|
||||||
|
object : RecursiveJsVisitor() {
|
||||||
|
override fun visitElement(node: JsNode) {
|
||||||
|
if (node is HasName) {
|
||||||
|
node.name?.let { references += it }
|
||||||
|
}
|
||||||
|
super.visitElement(node)
|
||||||
|
}
|
||||||
|
}.accept(scope)
|
||||||
|
|
||||||
|
return references
|
||||||
|
}
|
||||||
|
|
||||||
private fun collectReferencedNames(scope: JsNode): Set<JsName> {
|
private fun collectReferencedNames(scope: JsNode): Set<JsName> {
|
||||||
val references = IdentitySet<JsName>()
|
val references = mutableSetOf<JsName>()
|
||||||
|
|
||||||
object : RecursiveJsVisitor() {
|
object : RecursiveJsVisitor() {
|
||||||
override fun visitBreak(x: JsBreak) { }
|
override fun visitBreak(x: JsBreak) { }
|
||||||
@@ -53,7 +68,7 @@ private fun collectReferencedNames(scope: JsNode): Set<JsName> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun collectUsedNames(scope: JsNode): Set<JsName> {
|
fun collectUsedNames(scope: JsNode): Set<JsName> {
|
||||||
val references = IdentitySet<JsName>()
|
val references = mutableSetOf<JsName>()
|
||||||
|
|
||||||
object : RecursiveJsVisitor() {
|
object : RecursiveJsVisitor() {
|
||||||
override fun visitBreak(x: JsBreak) { }
|
override fun visitBreak(x: JsBreak) { }
|
||||||
|
|||||||
Reference in New Issue
Block a user