| Index: pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
|
| diff --git a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
|
| index 4d47c149e2c7e47562c5a69bf5a003266288fe7e..91ed14927e147a1efa69cfdcb9dfc7171db7cdd6 100644
|
| --- a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
|
| +++ b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
|
| @@ -37,23 +37,63 @@ class DeclarationTypePlaceholder {
|
| DeclarationTypePlaceholder(this.typeNode, this.requiresVar);
|
| }
|
|
|
| -class SendVisitor extends OldResolvedVisitor {
|
| +class SendVisitor extends Visitor {
|
| + final TreeElements elements;
|
| final PlaceholderCollector collector;
|
|
|
| - SendVisitor(this.collector, TreeElements elements)
|
| - : super(elements);
|
| + SendVisitor(this.collector, this.elements);
|
|
|
| - visitOperatorSend(Send node) {
|
| - }
|
| -
|
| - visitForeignSend(Send node) {}
|
| -
|
| - visitSuperSend(Send node) {
|
| + visitSend(Send node) {
|
| Element element = elements[node];
|
| - if (element != null && element.isConstructor) {
|
| - collector.tryMakeConstructorPlaceholder(node, element);
|
| + if (elements.isAssert(node)) {
|
| + return;
|
| + } else if (elements.isTypeLiteral(node)) {
|
| + DartType type = elements.getTypeLiteralType(node);
|
| + if (!type.isDynamic) {
|
| + if (type is TypeVariableType) {
|
| + collector.makeTypeVariablePlaceholder(node.selector, type);
|
| + } else {
|
| + collector.makeTypePlaceholder(node.selector, type);
|
| + }
|
| + }
|
| + } else if (node.isSuperCall) {
|
| + if (element != null && element.isConstructor) {
|
| + collector.tryMakeConstructorPlaceholder(node, element);
|
| + } else {
|
| + collector.tryMakeMemberPlaceholder(node.selector);
|
| + }
|
| + } else if (node.isOperator) {
|
| + return;
|
| + } else if (node.isPropertyAccess) {
|
| + if (!Elements.isUnresolved(element) && element.impliesType) {
|
| + collector.makeElementPlaceholder(node, element);
|
| + } else {
|
| + visitGetterSend(node);
|
| + }
|
| + } else if (element != null && Initializers.isConstructorRedirect(node)) {
|
| + visitStaticSend(node);
|
| + } else if (Elements.isClosureSend(node, element)) {
|
| + if (element != null) {
|
| + collector.tryMakeLocalPlaceholder(element, node.selector);
|
| + }
|
| } else {
|
| - collector.tryMakeMemberPlaceholder(node.selector);
|
| + if (Elements.isUnresolved(element)) {
|
| + if (element == null) {
|
| + // Example: f() with 'f' unbound.
|
| + // This can only happen inside an instance method.
|
| + visitDynamicSend(node);
|
| + } else {
|
| + visitStaticSend(node);
|
| + }
|
| + } else if (element.isInstanceMember) {
|
| + // Example: f() with 'f' bound to instance method.
|
| + visitDynamicSend(node);
|
| + } else if (!element.isInstanceMember) {
|
| + // Example: A.f() or f() with 'f' bound to a static function.
|
| + // Also includes new A() or new A.named() which is treated like a
|
| + // static call to a factory.
|
| + visitStaticSend(node);
|
| + }
|
| }
|
| }
|
|
|
| @@ -64,13 +104,6 @@ class SendVisitor extends OldResolvedVisitor {
|
| }
|
| }
|
|
|
| - visitClosureSend(Send node) {
|
| - final element = elements[node];
|
| - if (element != null) {
|
| - collector.tryMakeLocalPlaceholder(element, node.selector);
|
| - }
|
| - }
|
| -
|
| visitGetterSend(Send node) {
|
| final element = elements[node];
|
| // element == null means dynamic property access.
|
| @@ -100,10 +133,6 @@ class SendVisitor extends OldResolvedVisitor {
|
| }
|
| }
|
|
|
| - visitAssertSend(node) {
|
| - visitStaticSend(node);
|
| - }
|
| -
|
| visitStaticSend(Send node) {
|
| Element element = elements[node];
|
| collector.mirrorRenamer.registerStaticSend(
|
| @@ -138,19 +167,8 @@ class SendVisitor extends OldResolvedVisitor {
|
| collector.internalError(reason, node: node);
|
| }
|
|
|
| - visitTypePrefixSend(Send node) {
|
| - collector.makeElementPlaceholder(node, elements[node]);
|
| - }
|
| -
|
| - visitTypeLiteralSend(Send node) {
|
| - DartType type = elements.getTypeLiteralType(node);
|
| - if (!type.isDynamic) {
|
| - if (type is TypeVariableType) {
|
| - collector.makeTypeVariablePlaceholder(node.selector, type);
|
| - } else {
|
| - collector.makeTypePlaceholder(node.selector, type);
|
| - }
|
| - }
|
| + visitNode(Node node) {
|
| + internalError(node, "Unhandled node");
|
| }
|
| }
|
|
|
|
|