| 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 925538eddab0213b7dc34fbe5621ce7721467a44..ae276439d66d8752e01064b9964d1e1f121931ed 100644
|
| --- a/lib/compiler/implementation/dart_backend/placeholder_collector.dart
|
| +++ b/lib/compiler/implementation/dart_backend/placeholder_collector.dart
|
| @@ -22,6 +22,12 @@ class FunctionScope {
|
| }
|
| }
|
|
|
| +class ConstructorPlaceholder {
|
| + final Node node;
|
| + final DartType type;
|
| + ConstructorPlaceholder(this.node, this.type);
|
| +}
|
| +
|
| class DeclarationTypePlaceholder {
|
| final TypeAnnotation typeNode;
|
| final bool requiresVar;
|
| @@ -144,11 +150,12 @@ class PlaceholderCollector extends Visitor {
|
| final Map<Element, ElementAst> elementAsts;
|
| final Set<Node> nullNodes; // Nodes that should not be in output.
|
| final Set<Identifier> unresolvedNodes;
|
| - final Map<Element, Set<Identifier>> elementNodes;
|
| + final Map<Element, Set<Node>> elementNodes;
|
| final Map<FunctionElement, FunctionScope> functionScopes;
|
| final Map<LibraryElement, Set<Identifier>> privateNodes;
|
| final List<DeclarationTypePlaceholder> declarationTypePlaceholders;
|
| final Map<String, Set<Identifier>> memberPlaceholders;
|
| + final Map<Element, List<ConstructorPlaceholder>> constructorPlaceholders;
|
| Map<String, LocalPlaceholder> currentLocalPlaceholders;
|
| Element currentElement;
|
| FunctionElement topmostEnclosingFunction;
|
| @@ -163,11 +170,12 @@ class PlaceholderCollector extends Visitor {
|
| PlaceholderCollector(this.compiler, this.fixedMemberNames, this.elementAsts) :
|
| nullNodes = new Set<Node>(),
|
| unresolvedNodes = new Set<Identifier>(),
|
| - elementNodes = new Map<Element, Set<Identifier>>(),
|
| + elementNodes = new Map<Element, Set<Node>>(),
|
| functionScopes = new Map<FunctionElement, FunctionScope>(),
|
| privateNodes = new Map<LibraryElement, Set<Identifier>>(),
|
| declarationTypePlaceholders = new List<DeclarationTypePlaceholder>(),
|
| - memberPlaceholders = new Map<String, Set<Identifier>>();
|
| + memberPlaceholders = new Map<String, Set<Identifier>>(),
|
| + constructorPlaceholders = new Map<Element, List<ConstructorPlaceholder>>();
|
|
|
| void tryMakeConstructorNamePlaceholder(
|
| FunctionExpression constructor, ClassElement element) {
|
| @@ -329,7 +337,7 @@ class PlaceholderCollector extends Visitor {
|
| nullNodes.add(node);
|
| }
|
|
|
| - void makeElementPlaceholder(Identifier node, Element element) {
|
| + void makeElementPlaceholder(Node node, Element element) {
|
| assert(element != null);
|
| if (identical(element, entryFunction)) return;
|
| if (identical(element.getLibrary(), coreLibrary)) return;
|
| @@ -341,7 +349,7 @@ class PlaceholderCollector extends Visitor {
|
| 'Should never make element placeholder for dynamic type element',
|
| node);
|
| }
|
| - elementNodes.putIfAbsent(element, () => new Set<Identifier>()).add(node);
|
| + elementNodes.putIfAbsent(element, () => new Set<Node>()).add(node);
|
| }
|
|
|
| void makePrivateIdentifier(Identifier node) {
|
| @@ -367,6 +375,12 @@ class PlaceholderCollector extends Visitor {
|
| getLocalPlaceholder().nodes.add(identifier);
|
| }
|
|
|
| + void makeConstructorPlaceholder(Node node, Element element, DartType type) {
|
| + constructorPlaceholders
|
| + .putIfAbsent(element, () => <ConstructorPlaceholder>[])
|
| + .add(new ConstructorPlaceholder(node, type));
|
| + }
|
| +
|
| void internalError(String reason, {Node node}) {
|
| compiler.cancel(reason, node: node);
|
| }
|
| @@ -377,6 +391,19 @@ class PlaceholderCollector extends Visitor {
|
|
|
| visitNode(Node node) { node.visitChildren(this); } // We must go deeper.
|
|
|
| + visitNewExpression(NewExpression node) {
|
| + Send send = node.send;
|
| + InterfaceType type = treeElements.getType(node);
|
| + assert(type !== null);
|
| + Element constructor = treeElements[send];
|
| + assert(constructor !== null);
|
| + assert(send.receiver == null);
|
| + if (constructor is !ErroneousElement) {
|
| + makeConstructorPlaceholder(node.send.selector, constructor, type);
|
| + }
|
| + visit(node.send.argumentsNode);
|
| + }
|
| +
|
| visitSend(Send send) {
|
| new SendVisitor(this, treeElements).visitSend(send);
|
| send.visitChildren(this);
|
|
|