From cd9349deb7981fb1aa23afedb4756c3527b20b73 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 2 Oct 2014 15:10:46 +0400 Subject: [PATCH] JS inline refactor: moved JS AST collecting utils to 'collectors' package --- .../k2js/inline/FunctionCollector.java | 47 ------------------- .../k2js/inline/FunctionInlineMutator.java | 5 +- .../org/jetbrains/k2js/inline/JsInliner.java | 3 +- .../k2js/inline/util/collectUtils.kt | 30 ++++++++++++ .../collectors/InstanceCollector.kt} | 35 +++++--------- .../NameCollector.kt} | 23 ++++----- .../util/collectors/ReferenceNameCollector.kt | 37 +++++++++++++++ 7 files changed, 93 insertions(+), 87 deletions(-) delete mode 100644 js/js.inliner/src/org/jetbrains/k2js/inline/FunctionCollector.java rename js/js.inliner/src/org/jetbrains/k2js/inline/{ReturnCounter.java => util/collectors/InstanceCollector.kt} (54%) rename js/js.inliner/src/org/jetbrains/k2js/inline/util/{nameUtils.kt => collectors/NameCollector.kt} (76%) create mode 100644 js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/ReferenceNameCollector.kt diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionCollector.java b/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionCollector.java deleted file mode 100644 index 782d3511dfc..00000000000 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionCollector.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010-2014 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.k2js.inline; - -import com.google.dart.compiler.backend.js.ast.*; - -import java.util.IdentityHashMap; - -public class FunctionCollector extends RecursiveJsVisitor { - - private final IdentityHashMap functions = new IdentityHashMap(); - - public static IdentityHashMap collectFunctions(JsNode root) { - FunctionCollector collector = new FunctionCollector(); - collector.accept(root); - - return collector.functions; - } - - @Override - public void visitPropertyInitializer(JsPropertyInitializer x) { - super.visitPropertyInitializer(x); - - JsExpression label = x.getLabelExpr(); - JsExpression value = x.getValueExpr(); - - if (label instanceof JsNameRef && value instanceof JsFunction) { - JsName name = ((JsNameRef) label).getName(); - JsFunction function = (JsFunction) value; - functions.put(name, function); - } - } -} diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java b/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java index b1ed89cf828..c088b6f1a17 100644 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/FunctionInlineMutator.java @@ -19,6 +19,7 @@ package org.jetbrains.k2js.inline; import com.google.dart.compiler.backend.js.ast.*; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import static org.jetbrains.k2js.inline.util.UtilPackage.collectInstances; import static org.jetbrains.k2js.inline.util.UtilPackage.replaceReturns; import static org.jetbrains.k2js.inline.util.UtilPackage.replaceThisReference; @@ -112,8 +113,8 @@ class FunctionInlineMutator { insertionPoint.insertAllBefore(declarations); } - private void replaceReturns() { - int returnCount = ReturnCounter.countReturns(body); + private void processReturns() { + int returnCount = collectInstances(JsReturn.class, body).size(); if (returnCount == 0) { // TODO return Unit (KT-5647) resultExpr = JsLiteral.UNDEFINED; diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/JsInliner.java b/js/js.inliner/src/org/jetbrains/k2js/inline/JsInliner.java index d24cc1ccb8b..a1ea1451eb5 100644 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/JsInliner.java +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/JsInliner.java @@ -30,6 +30,7 @@ import static org.jetbrains.k2js.inline.clean.CleanPackage.removeUnusedLocalFunc import static org.jetbrains.k2js.inline.clean.CleanPackage.removeUnusedLocalFunctions; import static org.jetbrains.k2js.inline.FunctionInlineMutator.getInlineableCallReplacement; import static org.jetbrains.k2js.inline.util.UtilPackage.IdentitySet; +import static org.jetbrains.k2js.inline.util.UtilPackage.collectNamedFunctions; public class JsInliner extends JsVisitorWithContextImpl { @@ -69,7 +70,7 @@ public class JsInliner extends JsVisitorWithContextImpl { private boolean lastStatementWasShifted = false; public static JsProgram process(JsProgram program) { - IdentityHashMap functions = FunctionCollector.collectFunctions(program); + IdentityHashMap functions = collectNamedFunctions(program); JsInliner inliner = new JsInliner(functions); inliner.accept(program); removeUnusedLocalFunctions(program, functions); diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectUtils.kt b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectUtils.kt index ccc49a2802f..1faa98f6ea7 100644 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectUtils.kt +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectUtils.kt @@ -17,14 +17,44 @@ package org.jetbrains.k2js.inline.util import com.google.dart.compiler.backend.js.ast.* +import org.jetbrains.k2js.inline.util.IdentitySet import java.util.ArrayList import java.util.IdentityHashMap +import org.jetbrains.k2js.inline.util.collectors.ReferenceNameCollector +import org.jetbrains.k2js.inline.util.collectors.NameCollector +import org.jetbrains.k2js.inline.util.collectors.InstanceCollector import org.jetbrains.k2js.inline.util.collectors.FunctionCollector +public fun collectFunctionReferencesInside(scope: JsNode): List = + collectReferencesInside(scope) filter { it.getStaticRef() is JsFunction } + +public fun collectReferencesInside(scope: JsNode): List { + return with(ReferenceNameCollector()) { + accept(scope) + references + } +} + +public fun collectLocalNames(function: JsFunction): List { + val functionScope = function.getScope() + + return with(NameCollector(functionScope)) { + accept(function.getBody()) + names.values().toList() + } +} + public fun collectNamedFunctions(scope: JsNode): IdentityHashMap { return with(FunctionCollector()) { accept(scope) functions } +} + +public fun collectInstances(klass: Class, scope: JsNode): List { + return with(InstanceCollector(klass)) { + accept(scope) + collected + } } \ No newline at end of file diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/ReturnCounter.java b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/InstanceCollector.kt similarity index 54% rename from js/js.inliner/src/org/jetbrains/k2js/inline/ReturnCounter.java rename to js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/InstanceCollector.kt index 79bc4457db6..1400325df96 100644 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/ReturnCounter.java +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/InstanceCollector.kt @@ -14,31 +14,20 @@ * limitations under the License. */ -package org.jetbrains.k2js.inline; +package org.jetbrains.k2js.inline.util.collectors -import com.google.dart.compiler.backend.js.ast.JsNode; -import com.google.dart.compiler.backend.js.ast.JsReturn; -import com.google.dart.compiler.backend.js.ast.RecursiveJsVisitor; +import com.google.dart.compiler.backend.js.ast.JsNode +import com.google.dart.compiler.backend.js.ast.RecursiveJsVisitor +import java.util.ArrayList -public class ReturnCounter extends RecursiveJsVisitor { +class InstanceCollector(val klass: Class) : RecursiveJsVisitor() { + public val collected: MutableList = ArrayList() - private int count = 0; + override fun visitElement(node: JsNode?) { + if (klass.isInstance(node)) { + collected.add(klass.cast(node)!!) + } - public static int countReturns(JsNode root) { - ReturnCounter counter = new ReturnCounter(); - root.accept(counter); - - return counter.getCount(); + super.visitElement(node) } - - ReturnCounter() {} - - private int getCount() { - return count; - } - - @Override - public void visitReturn(JsReturn x) { - count++; - } -} +} \ No newline at end of file diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/util/nameUtils.kt b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/NameCollector.kt similarity index 76% rename from js/js.inliner/src/org/jetbrains/k2js/inline/util/nameUtils.kt rename to js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/NameCollector.kt index 1abe5055e9e..a527ec97781 100644 --- a/js/js.inliner/src/org/jetbrains/k2js/inline/util/nameUtils.kt +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/NameCollector.kt @@ -14,22 +14,18 @@ * limitations under the License. */ -package org.jetbrains.k2js.inline.util +package org.jetbrains.k2js.inline.util.collectors -import com.google.dart.compiler.backend.js.ast.* +import com.google.dart.compiler.backend.js.ast.JsScope +import com.google.dart.compiler.backend.js.ast.RecursiveJsVisitor +import com.google.dart.compiler.backend.js.ast.JsFunction +import com.google.dart.compiler.backend.js.ast.JsLabel +import com.google.dart.compiler.backend.js.ast.HasName +import com.google.dart.compiler.backend.js.ast.JsName +import com.google.dart.compiler.backend.js.ast.JsVars -import java.util.ArrayList import java.util.HashMap -public fun collectLocalNames(function: JsFunction): List { - val functionScope = function.getScope() - - return with (NameCollector(functionScope)) { - accept(function.getBody()) - names.values().toList() - } -} - class NameCollector(private val scope: JsScope) : RecursiveJsVisitor() { public val names: MutableMap = HashMap() @@ -57,5 +53,4 @@ class NameCollector(private val scope: JsScope) : RecursiveJsVisitor() { names.put(ident, name) } -} - +} \ No newline at end of file diff --git a/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/ReferenceNameCollector.kt b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/ReferenceNameCollector.kt new file mode 100644 index 00000000000..309c004cadf --- /dev/null +++ b/js/js.inliner/src/org/jetbrains/k2js/inline/util/collectors/ReferenceNameCollector.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.k2js.inline.util.collectors + +import com.google.dart.compiler.backend.js.ast.JsVisitorWithContextImpl +import com.google.dart.compiler.backend.js.ast.JsName +import com.google.dart.compiler.backend.js.ast.JsNameRef +import com.google.dart.compiler.backend.js.ast.JsContext +import org.jetbrains.k2js + +class ReferenceNameCollector : JsVisitorWithContextImpl() { + private val referenceSet = k2js.inline.util.IdentitySet() + + public val references: List + get() = referenceSet.toList() + + override fun endVisit(x: JsNameRef?, ctx: JsContext?) { + val name = x?.getName() + if (name != null) { + referenceSet.add(name) + } + } +} \ No newline at end of file