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

Unified Diff: pkg/compiler/lib/src/resolved_visitor.dart

Issue 1030103004: Implement ResolvedVisitor using SemanticSendVisitor. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Cleanups. Created 5 years, 9 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: pkg/compiler/lib/src/resolved_visitor.dart
diff --git a/pkg/compiler/lib/src/resolved_visitor.dart b/pkg/compiler/lib/src/resolved_visitor.dart
index 5d4ae3bcffeb20bcfad49996a829c49bd3b0e3ba..e7f72b7615714e98e081ec667bd3f1c15b69f091 100644
--- a/pkg/compiler/lib/src/resolved_visitor.dart
+++ b/pkg/compiler/lib/src/resolved_visitor.dart
@@ -4,76 +4,701 @@
part of dart2js;
-abstract class ResolvedVisitor<R> extends Visitor<R> {
+/// Enum for the visit methods added in [ResolvedVisitor].
+// TODO(johnniwinther): Remove this.
+enum ResolvedKind {
+ ASSERT,
+ TYPE_LITERAL,
+ SUPER,
+ OPERATOR,
+ TYPE_PREFIX,
+ GETTER,
+ STATIC,
+ CLOSURE,
+ DYNAMIC,
+ ERROR,
+}
+
+/// Abstract interface for a [ResolvedVisitor].
+// TODO(johnniwinther): Remove this.
+abstract class ResolvedKindVisitor<R> {
+ R visitSuperSend(Send node);
+ R visitOperatorSend(Send node);
+ R visitGetterSend(Send node);
+ R visitClosureSend(Send node);
+ R visitDynamicSend(Send node);
+ R visitStaticSend(Send node);
+
+ /// Visitor callback for a type literal.
+ R visitTypeLiteralSend(Send node);
+
+ /// Visitor callback for the class prefix of a static access, like `Foo` in
+ /// `Foo.staticField`.
+ // TODO(johnniwinther): Remove this when not needed by the dart backend.
+ R visitTypePrefixSend(Send node);
+
+ R visitAssertSend(Send node);
+
+ internalError(Spannable node, String reason);
+}
+
+/// Visitor that returns the [ResolvedKind] corresponding to the called visitor
+/// method.
+class ResolvedKindComputer implements ResolvedKindVisitor {
+ const ResolvedKindComputer();
+
+ ResolvedKind visitSuperSend(Send node) => ResolvedKind.SUPER;
+ ResolvedKind visitOperatorSend(Send node) => ResolvedKind.OPERATOR;
+ ResolvedKind visitGetterSend(Send node) => ResolvedKind.GETTER;
+ ResolvedKind visitClosureSend(Send node) => ResolvedKind.CLOSURE;
+ ResolvedKind visitDynamicSend(Send node) => ResolvedKind.DYNAMIC;
+ ResolvedKind visitStaticSend(Send node) => ResolvedKind.STATIC;
+ ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL;
+ ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX;
+ ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT;
+ internalError(Spannable node, String reason) => ResolvedKind.ERROR;
+}
+
+abstract class ResolvedVisitor<R>
+ implements Visitor<R>, ResolvedKindVisitor<R> {}
+
+abstract class BaseResolvedVisitor<R> extends Visitor<R>
+ implements ResolvedVisitor<R> {
+
TreeElements elements;
- ResolvedVisitor(this.elements);
+ BaseResolvedVisitor(this.elements);
- R visitSend(Send node) {
+ /// Dispatch using the old [ResolvedVisitor] logic.
+ // TODO(johnniwinther): Remove this.
+ _oldDispatch(Send node, ResolvedKindVisitor visitor) {
Element element = elements[node];
if (elements.isAssert(node)) {
- return visitAssert(node);
+ return visitor.visitAssertSend(node);
} else if (elements.isTypeLiteral(node)) {
- return visitTypeLiteralSend(node);
+ return visitor.visitTypeLiteralSend(node);
} else if (node.isSuperCall) {
- return visitSuperSend(node);
+ return visitor.visitSuperSend(node);
} else if (node.isOperator) {
- return visitOperatorSend(node);
+ return visitor.visitOperatorSend(node);
} else if (node.isPropertyAccess) {
if (!Elements.isUnresolved(element) && element.impliesType) {
- return visitTypePrefixSend(node);
+ return visitor.visitTypePrefixSend(node);
} else {
- return visitGetterSend(node);
+ return visitor.visitGetterSend(node);
}
} else if (element != null && Initializers.isConstructorRedirect(node)) {
- return visitStaticSend(node);
+ return visitor.visitStaticSend(node);
} else if (Elements.isClosureSend(node, element)) {
- return visitClosureSend(node);
+ return visitor.visitClosureSend(node);
} else {
if (Elements.isUnresolved(element)) {
if (element == null) {
// Example: f() with 'f' unbound.
// This can only happen inside an instance method.
- return visitDynamicSend(node);
+ return visitor.visitDynamicSend(node);
} else {
- return visitStaticSend(node);
+ return visitor.visitStaticSend(node);
}
} else if (element.isInstanceMember) {
// Example: f() with 'f' bound to instance method.
- return visitDynamicSend(node);
+ return visitor.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.
- return visitStaticSend(node);
+ return visitor.visitStaticSend(node);
} else {
- internalError("Cannot generate code for send", node: node);
- return null;
+ return visitor.internalError(node, "Cannot generate code for send");
}
}
}
- R visitSuperSend(Send node);
- R visitOperatorSend(Send node);
- R visitGetterSend(Send node);
- R visitClosureSend(Send node);
- R visitDynamicSend(Send node);
- R visitStaticSend(Send node);
+ internalError(Spannable node, String reason);
- /// Visitor callback for a type literal.
- R visitTypeLiteralSend(Send node);
+ R visitNode(Node node) {
+ internalError(node, "Unhandled node");
+ return null;
+ }
+}
- /// Visitor callback for the class prefix of a static access, like `Foo` in
- /// `Foo.staticField`.
- // TODO(johnniwinther): Remove this when not needed by the dart backend.
- R visitTypePrefixSend(Send node);
+// TODO(johnniwinther): Remove this. Currently need by the old dart2dart
+// backend.
+abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> {
+ OldResolvedVisitor(TreeElements elements) : super(elements);
+
+ R visitSend(Send node) {
+ return _oldDispatch(node, this);
+ }
+}
- R visitAssert(Send node);
+abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R>
+ with SendResolverMixin,
+ GetBulkMixin<R, dynamic>,
+ SetBulkMixin<R, dynamic>,
+ ErrorBulkMixin<R, dynamic>,
+ InvokeBulkMixin<R, dynamic>,
+ IndexSetBulkMixin<R, dynamic>,
+ CompoundBulkMixin<R, dynamic>,
+ UnaryBulkMixin<R, dynamic>,
+ BaseBulkMixin<R, dynamic>,
+ BinaryBulkMixin<R, dynamic>,
+ PrefixBulkMixin<R, dynamic>,
+ PostfixBulkMixin<R, dynamic> {
- void internalError(String reason, {Node node});
+ final ResolvedSemanticDispatcher<R> _semanticDispatcher =
+ new ResolvedSemanticDispatcher<R>();
- R visitNode(Node node) {
- internalError("Unhandled node", node: node);
- return null;
+ final ResolvedSemanticDispatcher<ResolvedKind> _resolvedKindDispatcher =
+ new ResolvedSemanticDispatcher<ResolvedKind>();
+
+ NewResolvedVisitor(TreeElements elements) : super(elements);
+
+ /// Dispatch using the new [SemanticSendVisitor] logic.
+ _newDispatch(Send node,
+ ResolvedKindVisitor kindVisitor,
+ SemanticSendVisitor sendVisitor) {
+ Element element = elements[node];
+ if (element != null && element.isConstructor) {
+ if (node.isSuperCall) {
+ return kindVisitor.visitSuperSend(node);
+ } else {
+ return kindVisitor.visitStaticSend(node);
+ }
+ } else if (element != null && element.isPrefix) {
+ return kindVisitor.visitGetterSend(node);
+ } else if (!elements.isTypeLiteral(node) &&
+ node.isPropertyAccess &&
+ !Elements.isUnresolved(element) &&
+ element.impliesType) {
+ return kindVisitor.visitTypePrefixSend(node);
+ } else {
+ SendStructure sendStructure = computeSendStructure(node);
+ if (sendStructure != null) {
+ var arg = sendVisitor == _resolvedKindDispatcher
+ ? kindVisitor : sendStructure;
+ return sendStructure.dispatch(sendVisitor, node, arg);
+ } else {
+ return kindVisitor.visitStaticSend(node);
+ }
+ }
+ }
+
+ R visitSend(Send node) {
+ ResolvedKind oldKind;
+ ResolvedKind newKind;
+ assert(invariant(node, () {
+ oldKind = _oldDispatch(node, const ResolvedKindComputer());
+ newKind = _newDispatch(
+ node, const ResolvedKindComputer(), _resolvedKindDispatcher);
+ return oldKind == newKind;
+ }, message: () => '$oldKind != $newKind'));
+ return _newDispatch(node, this, this);
+ }
+
+ @override
+ R apply(Node node, arg) {
+ return visitNode(node);
+ }
+
+ @override
+ R bulkHandleNode(
+ Node node,
+ String message,
+ SendStructure sendStructure) {
+ return sendStructure.dispatch(_semanticDispatcher, node, this);
+ }
+}
+
+/// Visitor that dispatches [SemanticSendVisitor] calls to the corresponding
+/// visit methods in [ResolvedVisitor].
+class ResolvedSemanticDispatcher<R> extends Object
+ with GetBulkMixin<R, ResolvedKindVisitor<R>>,
+ SetBulkMixin<R, ResolvedKindVisitor<R>>,
+ InvokeBulkMixin<R, ResolvedKindVisitor<R>>,
+ PrefixBulkMixin<R, ResolvedKindVisitor<R>>,
+ PostfixBulkMixin<R, ResolvedKindVisitor<R>>,
+ SuperBulkMixin<R, ResolvedKindVisitor<R>>,
+ CompoundBulkMixin<R, ResolvedKindVisitor<R>>,
+ IndexSetBulkMixin<R, ResolvedKindVisitor<R>>,
+ ErrorBulkMixin<R, ResolvedKindVisitor<R>>
+ implements SemanticSendVisitor<R, ResolvedKindVisitor<R>> {
+
+ ResolvedSemanticDispatcher();
+
+ @override
+ R apply(Node node, ResolvedKindVisitor<R> visitor) {
+ return visitor.internalError(
+ node, "ResolvedSemanticDispatcher.apply unsupported.");
+ }
+
+ @override
+ R bulkHandleNode(
+ Node node,
+ String message,
+ ResolvedKindVisitor<R> visitor) {
+ // Set, Compound and IndexSet are not handled by [ResolvedVisitor].
+ return bulkHandleError(node, visitor);
+ }
+
+ R bulkHandleError(Node node, ResolvedKindVisitor<R> visitor) {
+ return visitor.internalError(node, "No resolved kind for node.");
+ }
+
+ @override
+ R bulkHandleGet(Node node, ResolvedKindVisitor<R> visitor) {
+ return visitor.visitGetterSend(node);
+ }
+
+ @override
+ R bulkHandleInvoke(Node node, ResolvedKindVisitor<R> visitor) {
+ // Most invokes are static.
+ return visitor.visitStaticSend(node);
+ }
+
+ @override
+ R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) {
+ return visitor.visitSuperSend(node);
+ }
+
+ @override
+ R errorInvalidAssert(
+ Send node,
+ NodeList arguments,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitAssertSend(node);
+ }
+
+ @override
+ R errorLocalFunctionPostfix(
+ Send node,
+ LocalFunctionElement function,
+ op.IncDecOperator operator,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R errorLocalFunctionPrefix(
+ Send node,
+ LocalFunctionElement function,
+ op.IncDecOperator operator,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R errorStaticSetterGet(
+ Send node,
+ FunctionElement setter,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitGetterSend(node);
+ }
+
+ @override
+ R errorStaticSetterInvoke(
+ Send node,
+ FunctionElement setter,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitStaticSend(node);
+ }
+
+ @override
+ R errorSuperSetterGet(
+ Send node,
+ FunctionElement setter,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitGetterSend(node);
+ }
+
+ @override
+ R errorSuperSetterInvoke(
+ Send node,
+ FunctionElement setter,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitSuperSend(node);
+ }
+
+ @override
+ R errorTopLevelSetterGet(
+ Send node,
+ FunctionElement setter,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitGetterSend(node);
+ }
+
+ @override
+ R errorTopLevelSetterInvoke(
+ Send node,
+ FunctionElement setter,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitStaticSend(node);
+ }
+
+ @override
+ R errorUndefinedBinaryExpression(
+ Send node,
+ Node left,
+ Operator operator,
+ Node right,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R errorUndefinedUnaryExpression(
+ Send node,
+ Operator operator,
+ Node expression,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R errorUnresolvedGet(
+ Send node,
+ Element element,
+ ResolvedKindVisitor<R> visitor) {
+ if (node.isSuperCall) {
+ return visitor.visitSuperSend(node);
+ }
+ return visitor.visitGetterSend(node);
+ }
+
+ @override
+ R errorUnresolvedInvoke(
+ Send node,
+ Element element,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ if (node.isSuperCall) {
+ return visitor.visitSuperSend(node);
+ }
+ return visitor.visitStaticSend(node);
+ }
+
+ @override
+ R errorUnresolvedPostfix(
+ Send node,
+ Element element,
+ op.IncDecOperator operator,
+ ResolvedKindVisitor<R> visitor) {
+ if (node.isSuperCall) {
+ return visitor.visitSuperSend(node);
+ }
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R errorUnresolvedPrefix(
+ Send node,
+ Element element,
+ op.IncDecOperator operator,
+ ResolvedKindVisitor<R> visitor) {
+ if (node.isSuperCall) {
+ return visitor.visitSuperSend(node);
+ }
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R errorUnresolvedSuperBinary(
+ Send node,
+ Element element,
+ op.BinaryOperator operator,
+ Node argument,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitSuperSend(node);
+ }
+
+ @override
+ R errorUnresolvedSuperUnary(
+ Send node,
+ op.UnaryOperator operator,
+ Element element,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitSuperSend(node);
+ }
+
+ @override
+ R visitAs(
+ Send node,
+ Node expression,
+ DartType type,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitAssert(
+ Send node,
+ Node expression,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitAssertSend(node);
+ }
+
+ @override
+ R visitBinary(
+ Send node,
+ Node left,
+ op.BinaryOperator operator,
+ Node right,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitEquals(
+ Send node,
+ Node left,
+ Node right,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitIs(
+ Send node,
+ Node expression,
+ DartType type,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitIsNot(
+ Send node,
+ Node expression,
+ DartType type,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitLogicalAnd(
+ Send node,
+ Node left,
+ Node right,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitLogicalOr(
+ Send node,
+ Node left,
+ Node right,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitNot(
+ Send node,
+ Node expression,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitNotEquals(
+ Send node,
+ Node left,
+ Node right,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitUnary(
+ Send node,
+ op.UnaryOperator operator,
+ Node expression,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitDynamicPropertyInvoke(
+ Send node,
+ Node receiver,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitDynamicSend(node);
+ }
+
+ @override
+ R visitThisPropertyInvoke(
+ Send node,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitDynamicSend(node);
+ }
+
+ @override
+ R visitExpressionInvoke(
+ Send node,
+ Node receiver,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitClosureSend(node);
+ }
+
+ @override
+ R visitParameterInvoke(
+ Send node,
+ ParameterElement parameter,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitClosureSend(node);
+ }
+
+ @override
+ R visitLocalVariableInvoke(
+ Send node,
+ LocalVariableElement variable,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitClosureSend(node);
+ }
+
+ @override
+ R visitLocalFunctionInvoke(
+ Send node,
+ LocalFunctionElement function,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitClosureSend(node);
+ }
+
+ @override
+ R visitThisInvoke(
+ Send node,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitClosureSend(node);
+ }
+
+ @override
+ R visitClassTypeLiteralGet(
+ Send node,
+ TypeConstantExpression constant,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitTypedefTypeLiteralGet(
+ Send node,
+ TypeConstantExpression constant,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitDynamicTypeLiteralGet(
+ Send node,
+ TypeConstantExpression constant,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitTypeVariableTypeLiteralGet(
+ Send node,
+ TypeVariableElement element,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitClassTypeLiteralInvoke(
+ Send node,
+ TypeConstantExpression constant,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitTypedefTypeLiteralInvoke(
+ Send node,
+ TypeConstantExpression constant,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitDynamicTypeLiteralInvoke(
+ Send node,
+ TypeConstantExpression constant,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitTypeVariableTypeLiteralInvoke(
+ Send node,
+ TypeVariableElement element,
+ NodeList arguments,
+ Selector selector,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitTypeLiteralSend(node);
+ }
+
+ @override
+ R visitIndex(
+ Send node,
+ Node receiver,
+ Node index,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitOperatorSend(node);
+ }
+
+ @override
+ R visitSuperIndex(
+ Send node,
+ FunctionElement function,
+ Node index,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitSuperSend(node);
+ }
+
+ @override
+ R errorUnresolvedSuperIndex(
+ Send node,
+ Element function,
+ Node index,
+ ResolvedKindVisitor<R> visitor) {
+ return visitor.visitSuperSend(node);
}
}

Powered by Google App Engine
This is Rietveld 408576698