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
|
||||
|
||||
fun JsNode.resolveTemporaryNames() {
|
||||
val allNames = collectReferencedTemporaryNames(this)
|
||||
|
||||
val scopeTree = ScopeCollector().let {
|
||||
it.accept(this)
|
||||
it.scopeTree
|
||||
}
|
||||
|
||||
val renamings = scopeTree.resolveNames()
|
||||
val renamings = scopeTree.resolveNames(allNames)
|
||||
accept(object : RecursiveJsVisitor() {
|
||||
override fun visitElement(node: JsNode) {
|
||||
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>()
|
||||
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) }
|
||||
}
|
||||
this[scope]!!.forEach(::traverse)
|
||||
|
||||
@@ -25,8 +25,23 @@ import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
|
||||
fun collectFunctionReferencesInside(scope: JsNode): List<JsName> =
|
||||
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> {
|
||||
val references = IdentitySet<JsName>()
|
||||
val references = mutableSetOf<JsName>()
|
||||
|
||||
object : RecursiveJsVisitor() {
|
||||
override fun visitBreak(x: JsBreak) { }
|
||||
@@ -53,7 +68,7 @@ private fun collectReferencedNames(scope: JsNode): Set<JsName> {
|
||||
}
|
||||
|
||||
fun collectUsedNames(scope: JsNode): Set<JsName> {
|
||||
val references = IdentitySet<JsName>()
|
||||
val references = mutableSetOf<JsName>()
|
||||
|
||||
object : RecursiveJsVisitor() {
|
||||
override fun visitBreak(x: JsBreak) { }
|
||||
|
||||
Reference in New Issue
Block a user