Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Unified Diff: lib/compiler/implementation/dart_backend/placeholder_collector.dart

Issue 11267046: [dart2dart] fix after https://codereview.chromium.org/11227007 (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698