| Index: lib/compiler/implementation/dart_backend/placeholder_collector.dart
|
| diff --git a/lib/compiler/implementation/dart_backend/placeholder_collector.dart b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
|
| index 364a8f56a2bdd922b95476f1cf01a0097155e59a..2b68160003b297e0bbf420cfeaa337b554ef9a0e 100644
|
| --- a/lib/compiler/implementation/dart_backend/placeholder_collector.dart
|
| +++ b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
|
| @@ -72,14 +72,21 @@ class SendVisitor extends ResolvedVisitor {
|
|
|
| class PlaceholderCollector extends AbstractVisitor {
|
| final Compiler compiler;
|
| - final Map<Node, Placeholder> placeholders;
|
| - final Map<Element, Map<String, LocalPlaceholder>> localPlaceholders;
|
| + final Set<Node> nullNodes; // Nodes that should not be in output.
|
| + final Set<Identifier> unresolvedNodes;
|
| + final Map<Element, Set<Node>> elementNodes;
|
| + final Map<FunctionElement, Set<LocalPlaceholder>> localPlaceholders;
|
| + final Map<LibraryElement, Set<Node>> privateNodes;
|
| + Map<String, LocalPlaceholder> currentLocalPlaceholders;
|
| Element currentElement;
|
| TreeElements treeElements;
|
|
|
| PlaceholderCollector(this.compiler) :
|
| - placeholders = new Map<Node, Placeholder>(),
|
| - localPlaceholders = new Map<Element, Map<String, LocalPlaceholder>>();
|
| + nullNodes = new Set<Node>(),
|
| + unresolvedNodes = new Set<Identifier>(),
|
| + elementNodes = new Map<Element, Set<Node>>(),
|
| + localPlaceholders = new Map<FunctionElement, Set<LocalPlaceholder>>(),
|
| + privateNodes = new Map<LibraryElement, Set<Node>>();
|
|
|
| void collectFunctionDeclarationPlaceholders(
|
| FunctionElement element, FunctionExpression node) {
|
| @@ -180,6 +187,7 @@ class PlaceholderCollector extends AbstractVisitor {
|
| } else {
|
| assert(false); // Unreachable.
|
| }
|
| + currentLocalPlaceholders = new Map<String, LocalPlaceholder>();
|
| compiler.withCurrentElement(element, () {
|
| elementNode.accept(this);
|
| });
|
| @@ -214,35 +222,38 @@ class PlaceholderCollector extends AbstractVisitor {
|
| }
|
|
|
| void makeNullPlaceholder(Node node) {
|
| - placeholders[node] = new NullPlaceholder();
|
| + assert(node is Identifier || node is Send);
|
| + nullNodes.add(node);
|
| }
|
|
|
| void makeElementPlaceholder(Node node, Element element) {
|
| assert(element !== null);
|
| - placeholders[node] = new ElementPlaceholder(element);
|
| + elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node);
|
| }
|
|
|
| void makePrivateIdentifier(Identifier node) {
|
| assert(node !== null);
|
| - placeholders[node] =
|
| - new PrivatePlaceholder(currentElement.getLibrary(), node);
|
| + privateNodes.putIfAbsent(
|
| + currentElement.getLibrary(), () => new Set<Node>()).add(node);
|
| }
|
|
|
| void makeUnresolvedPlaceholder(Node node) {
|
| - placeholders[node] = const UnresolvedPlaceholder();
|
| + unresolvedNodes.add(node);
|
| }
|
|
|
| void makeLocalPlaceholder(Node node) {
|
| assert(currentElement is FunctionElement);
|
| assert(node is Identifier);
|
| - Map<String, LocalPlaceholder> functionLocals =
|
| - localPlaceholders.putIfAbsent(currentElement,
|
| - () => <LocalPlaceholder>{});
|
| String identifier = node.asIdentifier().source.slowToString();
|
| LocalPlaceholder localPlaceholder =
|
| - functionLocals.putIfAbsent(identifier,
|
| - () => new LocalPlaceholder(currentElement, identifier));
|
| - placeholders[node] = localPlaceholder;
|
| + currentLocalPlaceholders.putIfAbsent(identifier,
|
| + () {
|
| + LocalPlaceholder localPlaceholder =
|
| + new LocalPlaceholder(identifier);
|
| + localPlaceholders.putIfAbsent(currentElement,
|
| + () => new Set<LocalPlaceholder>()).add(localPlaceholder);
|
| + return localPlaceholder;
|
| + });
|
| }
|
|
|
| void internalError(String reason, [Node node]) {
|
|
|