| Index: frog/leg/tree/nodes.dart
|
| diff --git a/frog/leg/tree/nodes.dart b/frog/leg/tree/nodes.dart
|
| index 35e3098e153ee55400402fb763e87d44776cc838..a4c6322106c3ed17d29d2893644d2e6de9e5de5d 100644
|
| --- a/frog/leg/tree/nodes.dart
|
| +++ b/frog/leg/tree/nodes.dart
|
| @@ -146,6 +146,9 @@ class Node implements Hashable {
|
| Typedef asTypedef() => null;
|
| VariableDefinitions asVariableDefinitions() => null;
|
| While asWhile() => null;
|
| +
|
| + bool isValidBreakTarget() => false;
|
| + bool isValidContinueTarget() => false;
|
| }
|
|
|
| class ClassNode extends Node {
|
| @@ -200,7 +203,7 @@ class Statement extends Node {
|
| // TODO(ahe): make class abstract instead of adding an abstract method.
|
| abstract accept(Visitor visitor);
|
|
|
| - bool isValidContinueTarget() => false;
|
| + bool isValidBreakTarget() => true;
|
| }
|
|
|
| /**
|
| @@ -748,7 +751,7 @@ class DartString implements Iterable<int> {
|
| }
|
| return true;
|
| }
|
| - String toString() => "DartString#${length()}:${slowToString()}";
|
| + String toString() => "DartString#${length}:${slowToString()}";
|
| abstract SourceString get source();
|
| }
|
|
|
| @@ -1407,64 +1410,35 @@ class SwitchStatement extends Statement {
|
|
|
| class SwitchCase extends Node {
|
| final Identifier label;
|
| - final Expression expression;
|
| + final NodeList expressions;
|
| + final Token defaultKeyword;
|
| final NodeList statements;
|
|
|
| - final Token caseKeyword;
|
| + final Token startToken;
|
|
|
| - SwitchCase(this.label, this.expression, this.statements, this.caseKeyword);
|
| + SwitchCase(this.label, this.expressions, this.defaultKeyword,
|
| + this.statements, this.startToken);
|
|
|
| SwitchCase asSwitchCase() => this;
|
|
|
| + bool get isDefaultCase() => defaultKeyword !== null;
|
| +
|
| accept(Visitor visitor) => visitor.visitSwitchCase(this);
|
|
|
| visitChildren(Visitor visitor) {
|
| if (label !== null) label.accept(visitor);
|
| - expression.accept(visitor);
|
| + expressions.accept(visitor);
|
| statements.accept(visitor);
|
| }
|
|
|
| Token getBeginToken() {
|
| - if (label !== null) return label.getBeginToken();
|
| - return caseKeyword;
|
| + return startToken;
|
| }
|
|
|
| Token getEndToken() {
|
| if (statements.nodes.isEmpty()) {
|
| // The colon after the expression.
|
| - return expression.getEndToken().next;
|
| - } else {
|
| - return statements.getEndToken();
|
| - }
|
| - }
|
| -}
|
| -
|
| -class DefaultCase extends Node {
|
| - final Identifier label;
|
| - final NodeList statements;
|
| -
|
| - final Token defaultKeyword;
|
| -
|
| - DefaultCase(this.label, this.statements, this.defaultKeyword);
|
| -
|
| - DefaultCase asDefaultCase() => this;
|
| -
|
| - accept(Visitor visitor) => visitor.visitDefaultCase(this);
|
| -
|
| - visitChildren(Visitor visitor) {
|
| - if (label !== null) label.accept(visitor);
|
| - statements.accept(visitor);
|
| - }
|
| -
|
| - Token getBeginToken() {
|
| - if (label !== null) return label.getBeginToken();
|
| - return defaultKeyword;
|
| - }
|
| -
|
| - Token getEndToken() {
|
| - if (statements.nodes.isEmpty()) {
|
| - // The colon after default.
|
| - return defaultKeyword.next;
|
| + return expressions.getEndToken().next;
|
| } else {
|
| return statements.getEndToken();
|
| }
|
|
|