Index: lib/compiler/implementation/ssa/builder.dart |
diff --git a/lib/compiler/implementation/ssa/builder.dart b/lib/compiler/implementation/ssa/builder.dart |
index 0d38ec3cc1b937adb2ebf17c0e87ff87f28db9c8..025ef8a613182339b19dc1aa25d0d32e93315a24 100644 |
--- a/lib/compiler/implementation/ssa/builder.dart |
+++ b/lib/compiler/implementation/ssa/builder.dart |
@@ -786,7 +786,7 @@ class JumpHandlerImpl implements JumpHandler { |
} |
} |
-class SsaBuilder implements Visitor { |
+class SsaBuilder implements Visitor, SendVisitor { |
final SsaBuilderTask builder; |
TreeElements elements; |
final Interceptors interceptors; |
@@ -2247,7 +2247,7 @@ class SsaBuilder implements Visitor { |
inputs)); |
} |
- handleForeignSend(Send node) { |
+ visitForeignSend(Send node) { |
Element element = elements[node]; |
if (element.name == const SourceString('JS')) { |
handleForeignJs(node); |
@@ -2401,37 +2401,21 @@ class SsaBuilder implements Visitor { |
} |
} |
+ visitGetterSend(Send node) { |
+ generateGetter(node, elements[node]); |
+ } |
+ |
visitSend(Send node) { |
- if (node.isSuperCall) { |
- visitSuperSend(node); |
- } else if (node.isOperator && methodInterceptionEnabled) { |
- visitOperatorSend(node); |
- } else if (node.isPropertyAccess) { |
- generateGetter(node, elements[node]); |
- } else if (Elements.isClosureSend(node, elements)) { |
- visitClosureSend(node); |
- } else { |
- Element element = elements[node]; |
- if (element === null) { |
- // Example: f() with 'f' unbound. |
- // This can only happen inside an instance method. |
- visitDynamicSend(node); |
- } else if (element.kind == ElementKind.CLASS) { |
- compiler.internalError("Cannot generate code for send", node: node); |
- } else if (element.isInstanceMember()) { |
- // Example: f() with 'f' bound to instance method. |
- visitDynamicSend(node); |
- } else if (element.kind === ElementKind.FOREIGN) { |
- handleForeignSend(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); |
- } else { |
- compiler.internalError("Cannot generate code for send", node: node); |
- } |
- } |
+ node.analyse( |
+ methodInterceptionEnabled: this.methodInterceptionEnabled, |
+ elements: this.elements, |
+ sendVisitor: this |
+ ); |
+ } |
+ |
+ // TODO(antonm): migrate rest of SsaBuilder to internalError. |
+ internalError(String reason, [Node node]) { |
+ compiler.internalError(reason, node: node); |
} |
// TODO(karlklose): share with resolver. |