| Index: lib/compiler/implementation/scanner/listener.dart
|
| diff --git a/lib/compiler/implementation/scanner/listener.dart b/lib/compiler/implementation/scanner/listener.dart
|
| index 74dd30f0dc1b51b65e5489840bdb8bc7bd995db5..31c1b0b716d1f0ca7f73eacfd75e352d2d841c2d 100644
|
| --- a/lib/compiler/implementation/scanner/listener.dart
|
| +++ b/lib/compiler/implementation/scanner/listener.dart
|
| @@ -165,10 +165,10 @@ class Listener {
|
| void handleLabel(Token token) {
|
| }
|
|
|
| - void beginLabeledStatement(Token token) {
|
| + void beginLabeledStatement(Token token, int labelCount) {
|
| }
|
|
|
| - void endLabeledStatement() {
|
| + void endLabeledStatement(int labelCount) {
|
| }
|
|
|
| void beginLiteralMapEntry(Token token) {
|
| @@ -251,6 +251,9 @@ class Listener {
|
| void beginTryStatement(Token token) {
|
| }
|
|
|
| + void handleCaseMatch(Token caseKeyword, Token colon) {
|
| + }
|
| +
|
| void handleCatchBlock(Token catchKeyword) {
|
| }
|
|
|
| @@ -404,7 +407,7 @@ class Listener {
|
| void handleSuperExpression(Token token) {
|
| }
|
|
|
| - void handleSwitchCase(Token labelToken, int expressionCount,
|
| + void handleSwitchCase(int labelCount, int expressionCount,
|
| Token defaultKeyword, int statementCount,
|
| Token firstToken, Token endToken) {
|
| }
|
| @@ -1331,6 +1334,10 @@ class NodeListener extends ElementListener {
|
| tryKeyword, finallyKeyword));
|
| }
|
|
|
| + void handleCaseMatch(Token caseKeyword, Token colon) {
|
| + pushNode(new CaseMatch(caseKeyword, popNode(), colon));
|
| + }
|
| +
|
| void handleCatchBlock(Token catchKeyword) {
|
| Block block = popNode();
|
| NodeList formals = popNode();
|
| @@ -1347,22 +1354,20 @@ class NodeListener extends ElementListener {
|
| Link<Node> caseNodes = const EmptyLink<Node>();
|
| while (caseCount > 0) {
|
| SwitchCase switchCase = popNode();
|
| + Expect.isTrue(switchCase is SwitchCase);
|
| caseNodes = caseNodes.prepend(switchCase);
|
| caseCount--;
|
| }
|
| pushNode(new NodeList(beginToken, caseNodes, endToken, null));
|
| }
|
|
|
| - void handleSwitchCase(Token labelToken, int expressionCount,
|
| + void handleSwitchCase(int labelCount, int caseCount,
|
| Token defaultKeyword, int statementCount,
|
| Token firstToken, Token endToken) {
|
| NodeList statements = makeNodeList(statementCount, null, null, null);
|
| - NodeList expressions = makeNodeList(expressionCount, null, null, null);
|
| - Label label = null;
|
| - if (labelToken !== null) {
|
| - label = popNode();
|
| - }
|
| - pushNode(new SwitchCase(label, expressions, defaultKeyword, statements,
|
| + NodeList labelsAndCases =
|
| + makeNodeList(labelCount + caseCount, null, null, null);
|
| + pushNode(new SwitchCase(labelsAndCases, defaultKeyword, statements,
|
| firstToken));
|
| }
|
|
|
| @@ -1439,10 +1444,14 @@ class NodeListener extends ElementListener {
|
| pushNode(new Label(name, colon));
|
| }
|
|
|
| - void endLabeledStatement() {
|
| + void endLabeledStatement(int labelCount) {
|
| Statement statement = popNode();
|
| - Label label = popNode();
|
| - pushNode(new LabeledStatement(label, statement));
|
| + while (labelCount > 0) {
|
| + Label label = popNode();
|
| + statement = new LabeledStatement(label, statement);
|
| + labelCount--;
|
| + }
|
| + pushNode(statement);
|
| }
|
|
|
| void log(message) {
|
|
|