From d9e0e9f0b39ef48ff9ebeb51b8db22e789dd4a35 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 24 Nov 2016 14:06:28 +0300 Subject: [PATCH] JS: don't resolve unused temporaries --- .../js/inline/clean/resolveTemporaryNames.kt | 8 +++++--- .../kotlin/js/inline/util/collectUtils.kt | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/resolveTemporaryNames.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/resolveTemporaryNames.kt index 830c40e30b1..4a2640444a3 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/resolveTemporaryNames.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/resolveTemporaryNames.kt @@ -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>.resolveNames(): Map { +private fun Map>.resolveNames(knownNames: Set): Map { val replacements = mutableMapOf() 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) diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectUtils.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectUtils.kt index d58078ba237..7784564f642 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectUtils.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/collectUtils.kt @@ -25,8 +25,23 @@ import org.jetbrains.kotlin.js.translate.utils.JsAstUtils fun collectFunctionReferencesInside(scope: JsNode): List = collectReferencedNames(scope).filter { it.staticRef is JsFunction } +fun collectReferencedTemporaryNames(scope: JsNode): Set { + val references = mutableSetOf() + + 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 { - val references = IdentitySet() + val references = mutableSetOf() object : RecursiveJsVisitor() { override fun visitBreak(x: JsBreak) { } @@ -53,7 +68,7 @@ private fun collectReferencedNames(scope: JsNode): Set { } fun collectUsedNames(scope: JsNode): Set { - val references = IdentitySet() + val references = mutableSetOf() object : RecursiveJsVisitor() { override fun visitBreak(x: JsBreak) { }