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 561746bf17420763e3d7d7c5d7d3df2aec388180..fc399650dda47b5edb0ab1f9afc970d661d87f6f 100644 |
--- a/pkg/compiler/lib/src/resolved_visitor.dart |
+++ b/pkg/compiler/lib/src/resolved_visitor.dart |
@@ -17,6 +17,8 @@ enum ResolvedKind { |
CLOSURE, |
DYNAMIC, |
ERROR, |
+ SEND_SET, |
+ NEW, |
} |
/// Abstract interface for a [ResolvedVisitor]. |
@@ -28,6 +30,8 @@ abstract class ResolvedKindVisitor<R> { |
R visitClosureSend(Send node); |
R visitDynamicSend(Send node); |
R visitStaticSend(Send node); |
+ R handleSendSet(SendSet node); |
+ R handleNewExpression(NewExpression node); |
/// Visitor callback for a type literal. |
R visitTypeLiteralSend(Send node); |
@@ -56,6 +60,8 @@ class ResolvedKindComputer implements ResolvedKindVisitor { |
ResolvedKind visitTypeLiteralSend(Send node) => ResolvedKind.TYPE_LITERAL; |
ResolvedKind visitTypePrefixSend(Send node) => ResolvedKind.TYPE_PREFIX; |
ResolvedKind visitAssertSend(Send node) => ResolvedKind.ASSERT; |
+ ResolvedKind handleSendSet(SendSet node) => ResolvedKind.SEND_SET; |
+ ResolvedKind handleNewExpression(NewExpression node) => ResolvedKind.NEW; |
internalError(Spannable node, String reason) => ResolvedKind.ERROR; |
} |
@@ -130,6 +136,14 @@ abstract class OldResolvedVisitor<R> extends BaseResolvedVisitor<R> { |
R visitSend(Send node) { |
return _oldDispatch(node, this); |
} |
+ |
+ R visitSendSet(SendSet node) { |
+ return handleSendSet(node); |
+ } |
+ |
+ R visitNewExpression(NewExpression node) { |
+ return handleNewExpression(node); |
+ } |
} |
abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> |
@@ -185,19 +199,55 @@ abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> |
} |
} |
+ bool checkResolvedKind(Node node, |
+ ResolvedKind oldKind, |
+ ResolvedKind newKind) { |
+ return invariant(node, oldKind == newKind, message: '$oldKind != $newKind'); |
+ } |
+ |
+ ResolvedKind computeResolvedKindFromStructure( |
+ Node node, SemanticSendStructure structure) { |
+ return structure.dispatch( |
+ _resolvedKindDispatcher, node, const ResolvedKindComputer()); |
+ } |
+ |
+ @override |
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')); |
+ assert(checkResolvedKind( |
+ node, |
+ _oldDispatch(node, const ResolvedKindComputer()), |
+ _newDispatch(node, const ResolvedKindComputer(), |
+ _resolvedKindDispatcher))); |
return _newDispatch(node, this, this); |
} |
@override |
+ R visitSendSet(Send node) { |
+ SendStructure structure = computeSendStructure(node); |
+ if (structure == null) { |
+ return internalError(node, 'No structure for $node'); |
+ } else { |
+ assert(checkResolvedKind(node, |
+ ResolvedKind.SEND_SET, |
+ computeResolvedKindFromStructure(node, structure))); |
+ return structure.dispatch(this, node, structure); |
+ } |
+ } |
+ |
+ @override |
+ R visitNewExpression(NewExpression node) { |
+ NewStructure structure = computeNewStructure(node); |
+ if (structure == null) { |
+ return internalError(node, 'No structure for $node'); |
+ } else { |
+ assert(checkResolvedKind(node, |
+ ResolvedKind.NEW, |
+ computeResolvedKindFromStructure(node, structure))); |
+ return structure.dispatch(this, node, structure); |
+ } |
+ } |
+ |
+ @override |
R apply(Node node, arg) { |
return visitNode(node); |
} |
@@ -206,8 +256,8 @@ abstract class NewResolvedVisitor<R> extends BaseResolvedVisitor<R> |
R bulkHandleNode( |
Node node, |
String message, |
- SendStructure sendStructure) { |
- return sendStructure.dispatch(_semanticDispatcher, node, this); |
+ SemanticSendStructure structure) { |
+ return structure.dispatch(_semanticDispatcher, node, this); |
} |
} |
@@ -239,13 +289,16 @@ class ResolvedSemanticDispatcher<R> extends Object |
Node node, |
String message, |
ResolvedKindVisitor<R> visitor) { |
- // Set, Compound, IndexSet, and NewExpression 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."); |
+ if (node.asSendSet() != null) { |
+ return visitor.handleSendSet(node); |
+ } else if (node.asNewExpression() != null) { |
+ return visitor.handleNewExpression(node); |
+ } |
+ return visitor.internalError(node, "No resolved kind for $node."); |
} |
@override |
@@ -261,20 +314,43 @@ class ResolvedSemanticDispatcher<R> extends Object |
@override |
R bulkHandlePrefix(Node node, ResolvedKindVisitor<R> visitor) { |
- return visitor.visitOperatorSend(node); |
+ return visitor.handleSendSet(node); |
} |
@override |
R bulkHandlePostfix(Node node, ResolvedKindVisitor<R> visitor) { |
- return visitor.visitOperatorSend(node); |
+ return visitor.handleSendSet(node); |
} |
@override |
R bulkHandleSuper(Node node, ResolvedKindVisitor<R> visitor) { |
+ if (node.asSendSet() != null) { |
+ return visitor.handleSendSet(node); |
+ } |
return visitor.visitSuperSend(node); |
} |
@override |
+ R bulkHandleSet(SendSet node, ResolvedKindVisitor<R> visitor) { |
+ return visitor.handleSendSet(node); |
+ } |
+ |
+ @override |
+ R bulkHandleCompound(SendSet node, ResolvedKindVisitor<R> visitor) { |
+ return visitor.handleSendSet(node); |
+ } |
+ |
+ @override |
+ R bulkHandleIndexSet(SendSet node, ResolvedKindVisitor<R> visitor) { |
+ return visitor.handleSendSet(node); |
+ } |
+ |
+ @override |
+ R bulkHandleNew(NewExpression node, ResolvedKindVisitor<R> visitor) { |
+ return visitor.handleNewExpression(node); |
+ } |
+ |
+ @override |
R errorInvalidAssert( |
Send node, |
NodeList arguments, |
@@ -288,7 +364,7 @@ class ResolvedSemanticDispatcher<R> extends Object |
LocalFunctionElement function, |
op.IncDecOperator operator, |
ResolvedKindVisitor<R> visitor) { |
- return visitor.visitOperatorSend(node); |
+ return visitor.handleSendSet(node); |
} |
@override |
@@ -297,7 +373,7 @@ class ResolvedSemanticDispatcher<R> extends Object |
LocalFunctionElement function, |
op.IncDecOperator operator, |
ResolvedKindVisitor<R> visitor) { |
- return visitor.visitOperatorSend(node); |
+ return visitor.handleSendSet(node); |
} |
@override |
@@ -403,10 +479,7 @@ class ResolvedSemanticDispatcher<R> extends Object |
Element element, |
op.IncDecOperator operator, |
ResolvedKindVisitor<R> visitor) { |
- if (node.isSuperCall) { |
- return visitor.visitSuperSend(node); |
- } |
- return visitor.visitOperatorSend(node); |
+ return visitor.handleSendSet(node); |
} |
@override |
@@ -415,10 +488,7 @@ class ResolvedSemanticDispatcher<R> extends Object |
Element element, |
op.IncDecOperator operator, |
ResolvedKindVisitor<R> visitor) { |
- if (node.isSuperCall) { |
- return visitor.visitSuperSend(node); |
- } |
- return visitor.visitOperatorSend(node); |
+ return visitor.handleSendSet(node); |
} |
@override |