Chromium Code Reviews| 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, |