Index: compiler/java/com/google/dart/compiler/backend/js/analysis/TopLevelElementIndexer.java |
diff --git a/compiler/java/com/google/dart/compiler/backend/js/analysis/TopLevelElementIndexer.java b/compiler/java/com/google/dart/compiler/backend/js/analysis/TopLevelElementIndexer.java |
deleted file mode 100644 |
index 13a2c14242d37baf36240b27978ed1f3a3b26781..0000000000000000000000000000000000000000 |
--- a/compiler/java/com/google/dart/compiler/backend/js/analysis/TopLevelElementIndexer.java |
+++ /dev/null |
@@ -1,283 +0,0 @@ |
-// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-package com.google.dart.compiler.backend.js.analysis; |
- |
-import org.mozilla.javascript.Token; |
-import org.mozilla.javascript.ast.Assignment; |
-import org.mozilla.javascript.ast.AstNode; |
-import org.mozilla.javascript.ast.ExpressionStatement; |
-import org.mozilla.javascript.ast.FunctionCall; |
-import org.mozilla.javascript.ast.FunctionNode; |
-import org.mozilla.javascript.ast.Name; |
-import org.mozilla.javascript.ast.NodeVisitor; |
-import org.mozilla.javascript.ast.VariableDeclaration; |
-import org.mozilla.javascript.ast.VariableInitializer; |
- |
-import java.util.ArrayList; |
-import java.util.Collection; |
-import java.util.Deque; |
-import java.util.Iterator; |
-import java.util.LinkedList; |
-import java.util.List; |
-import java.util.Map; |
-import java.util.Map.Entry; |
-import java.util.Set; |
- |
-/** |
- * Indexes the top level declarations and expressions contained in a JavaScript AST tree. Where top |
- * level expressions can be global variables, method definitions or invocations. Note that method |
- * bodies are not processed. |
- */ |
-class TopLevelElementIndexer implements NodeVisitor { |
- /** |
- * |
- */ |
- private static final String RUN_ENTRY_METHOD_NAME = "RunEntry"; |
- |
- /** |
- * Collects {@link Name} {@link AstNode}s. |
- */ |
- static class NameLocator implements NodeVisitor { |
- private static final int PROTOTYPE_DEFAULT_INDEX = -1; |
- private final Deque<String> identifiers = new LinkedList<String>(); |
- private int prototypeIndex = PROTOTYPE_DEFAULT_INDEX; |
- |
- public String getEnclosingTypeName() { |
- return identifiers.getFirst(); |
- } |
- |
- public String getName() { |
- return identifiers.getLast(); |
- } |
- |
- public Collection<String> getPossibleNames() { |
- List<String> names = new ArrayList<String>(2); |
- if (hasPrototypeInName()) { |
- names.add(identifiers.getLast()); |
- } |
- names.add(getQualifiedName()); |
- return names; |
- } |
- |
- public String getQualifiedName() { |
- StringBuffer sb = new StringBuffer(); |
- Iterator<String> iterator = identifiers.iterator(); |
- while (iterator.hasNext()) { |
- sb.append(iterator.next()); |
- if (iterator.hasNext()) { |
- sb.append("."); |
- } |
- } |
- return sb.toString(); |
- } |
- |
- public boolean hasPrototypeInName() { |
- return prototypeIndex != PROTOTYPE_DEFAULT_INDEX; |
- } |
- |
- @Override |
- public boolean visit(AstNode node) { |
- if (node.getType() == Token.NAME) { |
- Name name = (Name) node; |
- String identifier = name.getIdentifier(); |
- if ("prototype".equals(identifier)) { |
- prototypeIndex = identifiers.size(); |
- } |
- identifiers.add(identifier); |
- } |
- return true; |
- } |
- } |
- |
- public static void printGlobals(List<AstNode> globals) { |
- System.out.println("Globals"); |
- for (AstNode global : globals) { |
- System.out.println("--------"); |
- System.out.println(global.toSource()); |
- System.out.println(); |
- } |
- } |
- |
- public static void printNamesToElements(Map<String, List<JavascriptElement>> namesToElements) { |
- long rttCost = 0; |
- long namedCost = 0; |
- long ctorCost = 0; |
- |
- Set<Entry<String, List<JavascriptElement>>> entrySet = namesToElements.entrySet(); |
- for (Entry<String, List<JavascriptElement>> entry : entrySet) { |
- System.out.println("--------"); |
- System.out.println("Name: " + entry.getKey()); |
- for (JavascriptElement javascriptElement : entry.getValue()) { |
- AstNode node = javascriptElement.getNode(); |
- if (node == null) { |
- continue; |
- } |
- |
- System.out.println("Type: " + Token.typeToName(node.getType())); |
- if (javascriptElement.getInheritsElement() != null) { |
- System.out.println("Inherits: " + javascriptElement.getInheritsElement()); |
- } |
- |
- try { |
- System.out.println(node.toSource()); |
- } catch (Exception e) { |
- System.out.println("Failed to print node source code"); |
- } |
- |
- String name = javascriptElement.getName(); |
- if (name.endsWith("$named")) { |
- namedCost += node.getLength(); |
- } else if (name.endsWith("$addTo") || name.endsWith("$lookupRTT") |
- || name.endsWith("$RTTimplements")) { |
- rttCost += node.getLength(); |
- } else if (name.endsWith("$Constructor") || name.endsWith("$Initializer")) { |
- ctorCost += node.getLength(); |
- } |
- } |
- System.out.println(); |
- } |
- |
- System.out.println(ctorCost + |
- " characters worth of $Constructor and $Initializer methode declarations"); |
- System.out.println(namedCost + " characters worth of $named methods declarations"); |
- System.out.println(rttCost + " characters worth of RTT method declarations"); |
- } |
- |
- private final List<AstNode> entryPoints = new ArrayList<AstNode>(); |
- private final List<AstNode> globals; |
- |
- private final Map<String, List<JavascriptElement>> namesToElements; |
- |
- public TopLevelElementIndexer(Map<String, List<JavascriptElement>> namesToElements, |
- List<AstNode> globals) { |
- this.globals = globals; |
- this.namesToElements = namesToElements; |
- } |
- |
- private void addElement(String identifier, JavascriptElement javascriptElement) { |
- List<JavascriptElement> list = namesToElements.get(identifier); |
- if (list == null) { |
- list = new ArrayList<JavascriptElement>(1); |
- namesToElements.put(identifier, list); |
- } |
- list.add(javascriptElement); |
- } |
- |
- /** |
- * Processes an AST node that does not define a method. If the node is an invocation to a |
- * RunEntry method or an inherits method update the entry points and element inheritance |
- * hierarchy accordingly. Otherwise we just add this node to the globals block and continue. |
- */ |
- private void processGlobal(AstNode node) { |
- if (node.getType() == Token.EXPR_RESULT) { |
- ExpressionStatement expressionStatement = (ExpressionStatement) node; |
- AstNode expression = expressionStatement.getExpression(); |
- if (expression.getType() == Token.CALL) { |
- FunctionCall functionCall = (FunctionCall) expression; |
- AstNode target = functionCall.getTarget(); |
- if (target.getType() == Token.NAME) { |
- Name targetName = (Name) target; |
- if (RUN_ENTRY_METHOD_NAME.equals(targetName.getIdentifier())) { |
- // This is a call to an entry point so add it to the known set of entry points. |
- entryPoints.add(node); |
- return; |
- } else if ("$inherits".equals(targetName.getIdentifier())) { |
- // This is an inherits call so update the element's inheritance hierarchy. |
- List<AstNode> arguments = functionCall.getArguments(); |
- assert (arguments.size() == 2); |
- assert (arguments.get(0).getType() == Token.NAME); |
- assert (arguments.get(1).getType() == Token.NAME); |
- Name subtype = (Name) arguments.get(0); |
- Name supertype = (Name) arguments.get(1); |
- List<JavascriptElement> subTypeFunctions = namesToElements.get(subtype.getIdentifier()); |
- assert (subTypeFunctions != null && subTypeFunctions.size() == 1); |
- JavascriptElement subtypeFunction = subTypeFunctions.get(0); |
- subtypeFunction.setInheritsNode(node); |
- subtypeFunction.setInherits(namesToElements.get(supertype.getIdentifier()).get(0)); |
- return; |
- } |
- } |
- } |
- } |
- |
- globals.add(node); |
- } |
- |
- public List<AstNode> getEntryPoints() { |
- return entryPoints; |
- } |
- |
- @Override |
- public boolean visit(AstNode node) { |
- if (node == node.getAstRoot()) { |
- return true; |
- } |
- |
- switch (node.getType()) { |
- case Token.EXPR_VOID: |
- case Token.EXPR_RESULT: |
- ExpressionStatement expressionStatement = (ExpressionStatement) node; |
- AstNode expression = expressionStatement.getExpression(); |
- if (expression.getType() == Token.ASSIGN) { |
- Assignment assignment = (Assignment) expression; |
- NameLocator nameLocator = new NameLocator(); |
- assignment.getLeft().visit(nameLocator); |
- String enclosingTypeName = nameLocator.getEnclosingTypeName(); |
- JavascriptElement enclosingElement = null; |
- if (enclosingTypeName != null) { |
- List<JavascriptElement> list = namesToElements.get(enclosingTypeName); |
- if (list == null) { |
- // TODO: Assume that this is a native object for now, we could have a whitelist of |
- // native objects if we wanted to. |
- enclosingElement = |
- new JavascriptElement(null, false, enclosingTypeName, nameLocator.getName(), |
- null); |
- addElement(enclosingTypeName, enclosingElement); |
- } else { |
- assert (list != null && list.size() == 1); |
- enclosingElement = list.get(0); |
- } |
- } |
- |
- JavascriptElement javascriptElement = |
- new JavascriptElement(enclosingElement, nameLocator.hasPrototypeInName(), |
- nameLocator.getQualifiedName(), nameLocator.getName(), node); |
- for (String identifier : nameLocator.getPossibleNames()) { |
- addElement(identifier, javascriptElement); |
- } |
- } else { |
- processGlobal(node); |
- } |
- break; |
- |
- case Token.FUNCTION: |
- FunctionNode functionNode = (FunctionNode) node; |
- String name = functionNode.getName(); |
- if (name != null && !name.isEmpty()) { |
- addElement(name, new JavascriptElement(null, false, name, name, node)); |
- } |
- break; |
- |
- case Token.VAR: |
- VariableDeclaration variableDeclaration = (VariableDeclaration) node; |
- List<VariableInitializer> variables = variableDeclaration.getVariables(); |
- for (VariableInitializer variable : variables) { |
- AstNode target = variable.getTarget(); |
- if (target.getType() == Token.NAME) { |
- Name variableName = (Name) target; |
- addElement(variableName.getIdentifier(), new JavascriptElement(null, false, |
- variableName.getIdentifier(), variableName.getIdentifier(), node)); |
- } |
- } |
- break; |
- |
- default: |
- processGlobal(node); |
- break; |
- } |
- |
- return false; |
- } |
-} |