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

Unified Diff: frog/leg/scanner/listener.dart

Issue 9632018: Switch-implementation. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 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: frog/leg/scanner/listener.dart
diff --git a/frog/leg/scanner/listener.dart b/frog/leg/scanner/listener.dart
index 2d7e4fb59297dd2c7aad7eadc3a32e5d2158b6f8..f0a96ebad6598c2937a4552c849fa71389da9dad 100644
--- a/frog/leg/scanner/listener.dart
+++ b/frog/leg/scanner/listener.dart
@@ -395,8 +395,9 @@ class Listener {
void handleSuperExpression(Token token) {
}
- void handleSwitchCase(Token colon, Token caseKeyword, int statementCount,
- Token endToken) {
+ void handleSwitchCase(Token labelToken, int expressionCount,
+ Token defaultKeyword, int statementCount,
+ Token firstToken, Token endToken) {
}
void handleThisExpression(Token token) {
@@ -1301,18 +1302,32 @@ class NodeListener extends ElementListener {
}
void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
- pushNode(makeNodeList(caseCount, beginToken, endToken, null));
+ Link<Node> nodes = const EmptyLink<Node>();
+ bool isLast = true;
+ while (caseCount > 0) {
+ SwitchCase switchCase = popNode();
+ if (switchCase.isDefaultCase && !isLast) {
floitsch 2012/03/08 16:35:14 Afaik default can be anywhere. Does not need to be
Lasse Reichstein Nielsen 2012/03/08 18:35:40 Spec says it must be the last last "label" of the
ahe 2012/03/08 18:54:46 The ANTLR grammar agrees: | SWITCH '(' expres
+ recoverableError("default not on last switch case",
+ token: switchCase.defaultToken);
+ }
+ nodes = nodes.prepend(switchCase);
+ caseCount--;
+ isLast = false;
+ }
+ pushNode(new NodeList(beginToken, nodes, endToken, null));
}
- void handleSwitchCase(Token colon, Token caseKeyword, int statementCount,
- Token endToken) {
+ void handleSwitchCase(Token labelToken, int expressionCount,
+ Token defaultKeyword, int statementCount,
+ Token firstToken, Token endToken) {
NodeList statements = makeNodeList(statementCount, null, null, null);
- Expression expression = popNode();
+ NodeList expressions = makeNodeList(expressionCount, null, null, null);
Identifier label = null;
- if (colon !== null) {
+ if (labelToken !== null) {
label = popNode();
}
- pushNode(new SwitchCase(label, expression, statements, caseKeyword));
+ pushNode(new SwitchCase(label, expressions, defaultKeyword, statements,
+ firstToken));
}
void handleDefaultCase(Token colon, Token defaultKeyword, int statementCount,

Powered by Google App Engine
This is Rietveld 408576698