diff --git a/src/com/google/javascript/jscomp/DefinitionsRemover.java b/src/com/google/javascript/jscomp/DefinitionsRemover.java index 2d7f19df05c..8ef318d2b47 100644 --- a/src/com/google/javascript/jscomp/DefinitionsRemover.java +++ b/src/com/google/javascript/jscomp/DefinitionsRemover.java @@ -25,6 +25,7 @@ import com.google.javascript.rhino.IR; import com.google.javascript.rhino.Node; import com.google.javascript.rhino.Token; +import javax.annotation.Nullable; /** * Models an assignment that defines a variable and the removal of it. @@ -157,6 +158,31 @@ public void remove(AbstractCompiler compiler) { */ protected abstract void performRemove(AbstractCompiler compiler); + /** + * Extract a name from a node. In the case of GETPROP nodes, replace the namespace or object + * expression with "this" for simplicity and correctness at the expense of inefficiencies due to + * higher chances of name collisions. + * + *

TODO(user) revisit. it would be helpful to at least use fully qualified names in the case + * of namespaces. Might not matter as much if this pass runs after {@link CollapseProperties}. + */ + @Nullable + public static String getSimplifiedName(Node node) { + if (node.isName()) { + String name = node.getString(); + if (name != null && !name.isEmpty()) { + return name; + } else { + return null; + } + } else if (node.isGetProp()) { + return "this." + node.getLastChild().getString(); + } else if (node.isMemberFunctionDef()) { + return "this." + node.getString(); + } + return null; + } + public String getSimplifiedName() { return simplifiedName; } @@ -201,7 +227,7 @@ abstract static class IncompleteDefinition extends Definition { private final Node lValue; IncompleteDefinition(Node lValue, boolean inExterns) { - super(inExterns, NameBasedDefinitionProvider.getSimplifiedName(lValue)); + super(inExterns, Definition.getSimplifiedName(lValue)); checkNotNull(lValue); Preconditions.checkArgument( @@ -280,7 +306,7 @@ abstract static class FunctionDefinition extends Definition { protected final Node function; FunctionDefinition(Node node, boolean inExterns) { - this(node, inExterns, NameBasedDefinitionProvider.getSimplifiedName(node.getFirstChild())); + this(node, inExterns, Definition.getSimplifiedName(node.getFirstChild())); } FunctionDefinition(Node node, boolean inExterns, String name) { @@ -344,7 +370,7 @@ static final class MemberFunctionDefinition extends FunctionDefinition { protected final Node memberFunctionDef; MemberFunctionDefinition(Node node, boolean inExterns) { - super(node.getFirstChild(), inExterns, NameBasedDefinitionProvider.getSimplifiedName(node)); + super(node.getFirstChild(), inExterns, Definition.getSimplifiedName(node)); checkState(node.isMemberFunctionDef(), node); memberFunctionDef = node; } @@ -369,7 +395,7 @@ abstract static class ClassDefinition extends Definition { protected final Node c; ClassDefinition(Node node, boolean inExterns) { - super(inExterns, NameBasedDefinitionProvider.getSimplifiedName(node.getFirstChild())); + super(inExterns, Definition.getSimplifiedName(node.getFirstChild())); Preconditions.checkArgument(node.isClass()); c = node; } @@ -426,7 +452,7 @@ static final class AssignmentDefinition extends Definition { private final Node assignment; AssignmentDefinition(Node node, boolean inExterns) { - super(inExterns, NameBasedDefinitionProvider.getSimplifiedName(node.getFirstChild())); + super(inExterns, Definition.getSimplifiedName(node.getFirstChild())); checkArgument(node.isAssign()); assignment = node; } @@ -479,7 +505,7 @@ static final class ObjectLiteralPropertyDefinition extends Definition { private final Node value; ObjectLiteralPropertyDefinition(Node name, Node value, boolean isExtern) { - super(isExtern, NameBasedDefinitionProvider.getSimplifiedName(getLValue(name))); + super(isExtern, Definition.getSimplifiedName(getLValue(name))); this.name = name; this.value = value; @@ -528,7 +554,7 @@ public Node getRValue() { static final class VarDefinition extends Definition { private final Node name; VarDefinition(Node node, boolean inExterns) { - super(inExterns, NameBasedDefinitionProvider.getSimplifiedName(node)); + super(inExterns, Definition.getSimplifiedName(node)); checkArgument(NodeUtil.isNameDeclaration(node.getParent()) && node.isName()); Preconditions.checkArgument(inExterns || node.hasChildren(), "VAR Declaration of %s must be assigned a value.", node.getString()); diff --git a/src/com/google/javascript/jscomp/NameBasedDefinitionProvider.java b/src/com/google/javascript/jscomp/NameBasedDefinitionProvider.java index ddee8a12d95..fc0c5e6f872 100644 --- a/src/com/google/javascript/jscomp/NameBasedDefinitionProvider.java +++ b/src/com/google/javascript/jscomp/NameBasedDefinitionProvider.java @@ -22,7 +22,6 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; @@ -36,10 +35,8 @@ import com.google.javascript.rhino.Node; import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.Set; -import javax.annotation.Nullable; /** * Simple name-based definition gatherer. @@ -91,20 +88,6 @@ public void process(Node externs, Node source) { NodeTraversal.traverse(compiler, source, new DefinitionGatheringCallback(false)); } - public void rebuildScopeRoots(List changedScopeRoots, List deletedScopeRoots) { - for (Node scopeRoot : Iterables.concat(deletedScopeRoots, changedScopeRoots)) { - for (DefinitionSite definitionSite : definitionSitesByScopeNode.removeAll(scopeRoot)) { - Definition definition = definitionSite.definition; - definitionNodes.remove(definitionSite.node); - definitionsByName.remove(definition.getSimplifiedName(), definition); - definitionSitesByDefinitionSiteNode.remove(definitionSite.node); - } - } - - DefinitionGatheringCallback cb = new DefinitionGatheringCallback(); - NodeTraversal.traverseScopeRoots(compiler, null, changedScopeRoots, cb, cb, false); - } - /** @return Whether the node has a JSDoc that actually declares something. */ private boolean jsdocContainsDeclarations(Node node) { JSDocInfo info = node.getJSDocInfo(); @@ -177,7 +160,7 @@ public Collection getDefinitionsReferencedAt(Node useSiteNode) { } } - String name = getSimplifiedName(useSiteNode); + String name = DefinitionsRemover.Definition.getSimplifiedName(useSiteNode); if (name != null) { return definitionsByName.get(name); } @@ -297,31 +280,6 @@ private void addDefinition( definitionSitesByScopeNode.put(scopeNode, definitionSite); } - /** - * Extract a name from a node. In the case of GETPROP nodes, replace the namespace or object - * expression with "this" for simplicity and correctness at the expense of inefficiencies due to - * higher chances of name collisions. - * - *

TODO(user) revisit. it would be helpful to at least use fully qualified names in the case of - * namespaces. Might not matter as much if this pass runs after {@link CollapseProperties}. - */ - @Nullable - public static String getSimplifiedName(Node node) { - if (node.isName()) { - String name = node.getString(); - if (name != null && !name.isEmpty()) { - return name; - } else { - return null; - } - } else if (node.isGetProp()) { - return "this." + node.getLastChild().getString(); - } else if (node.isMemberFunctionDef()) { - return "this." + node.getString(); - } - return null; - } - /** * Returns the collection of definition sites found during traversal. * @@ -331,10 +289,4 @@ public Collection getDefinitionSites() { checkState(hasProcessBeenRun, "Hasn't been initialized with process() yet."); return definitionSitesByDefinitionSiteNode.values(); } - - public DefinitionSite getDefinitionForFunction(Node function) { - checkState(hasProcessBeenRun, "Hasn't been initialized with process() yet."); - checkState(function.isFunction()); - return definitionSitesByDefinitionSiteNode.get(NodeUtil.getNameNode(function)); - } } diff --git a/src/com/google/javascript/jscomp/PureFunctionIdentifier.java b/src/com/google/javascript/jscomp/PureFunctionIdentifier.java index 90b472d9ba0..498f143e500 100644 --- a/src/com/google/javascript/jscomp/PureFunctionIdentifier.java +++ b/src/com/google/javascript/jscomp/PureFunctionIdentifier.java @@ -156,7 +156,7 @@ String getDebugReport() { Iterable expanded = unwrapCallableExpression(call.getFirstChild()); if (expanded != null) { for (Node comp : expanded) { - String name = NameBasedDefinitionProvider.getSimplifiedName(comp); + String name = DefinitionsRemover.Definition.getSimplifiedName(comp); sb.append(name).append("|"); } } else { @@ -270,7 +270,7 @@ private List getSideEffectsForCall(Node call) { continue; } - String name = NameBasedDefinitionProvider.getSimplifiedName(expression); + String name = DefinitionsRemover.Definition.getSimplifiedName(expression); FunctionInformation info = null; if (name != null) { info = functionInfoByName.get(name); @@ -307,7 +307,7 @@ private void buildGraph() { if (definition.getLValue() != null) { Node getOrName = definition.getLValue(); checkArgument(getOrName.isGetProp() || getOrName.isName(), getOrName); - String name = NameBasedDefinitionProvider.getSimplifiedName(getOrName); + String name = DefinitionsRemover.Definition.getSimplifiedName(getOrName); checkNotNull(name); if (isSupportedFunctionDefinition(definition.getRValue())) { addSupportedDefinition(site, name); diff --git a/test/com/google/javascript/jscomp/NameBasedDefinitionProviderTest.java b/test/com/google/javascript/jscomp/NameBasedDefinitionProviderTest.java index 7857eb18851..327d8bee498 100644 --- a/test/com/google/javascript/jscomp/NameBasedDefinitionProviderTest.java +++ b/test/com/google/javascript/jscomp/NameBasedDefinitionProviderTest.java @@ -56,7 +56,7 @@ private static Node parse(String js) { @Nullable private String getSimplifiedName(Node n) { - return NameBasedDefinitionProvider.getSimplifiedName(n); + return DefinitionsRemover.Definition.getSimplifiedName(n); } @Nullable