Files
sdk/lib/compiler/implementation/resolved_visitor.dart
T
antonm@google.com d50b2bfb24 Refactor common logic of SsaBuilder.visitSend.
lib/compiler/implementation/dart_backend.dart

R=ahe@google.com,smok@google.com

Review URL: https://chromiumcodereview.appspot.com//10441044

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@8316 260f80e4-7a28-3924-810f-c04153c831b5
2012-06-06 09:19:47 +00:00

53 lines
1.9 KiB
Dart

// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
class ResolvedVisitor<R> implements Visitor<R> {
TreeElements elements;
ResolvedVisitor(this.elements);
R visitSend(Send node) {
if (node.isSuperCall) {
return visitSuperSend(node);
} else if (node.isOperator) {
return visitOperatorSend(node);
} else if (node.isPropertyAccess) {
return visitGetterSend(node);
} else if (Elements.isClosureSend(node, elements)) {
return visitClosureSend(node);
} else {
Element element = elements[node];
if (element === null) {
// Example: f() with 'f' unbound.
// This can only happen inside an instance method.
return visitDynamicSend(node);
} else if (element.kind == ElementKind.CLASS) {
internalError("Cannot generate code for send", node: node);
} else if (element.isInstanceMember()) {
// Example: f() with 'f' bound to instance method.
return visitDynamicSend(node);
} else if (element.kind === ElementKind.FOREIGN) {
return visitForeignSend(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.
return visitStaticSend(node);
} else {
internalError("Cannot generate code for send", node: node);
}
}
}
abstract R visitSuperSend(Send node);
abstract R visitOperatorSend(Send node);
abstract R visitGetterSend(Send node);
abstract R visitClosureSend(Send node);
abstract R visitDynamicSend(Send node);
abstract R visitForeignSend(Send node);
abstract R visitStaticSend(Send node);
abstract void internalError(String reason, [Node node]);
}