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

Unified Diff: dart/frog/leg/tree/nodes.dart

Issue 9599013: Complete AST nodes for switch statement. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 10 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: dart/frog/leg/tree/nodes.dart
diff --git a/dart/frog/leg/tree/nodes.dart b/dart/frog/leg/tree/nodes.dart
index bc1ec4382f697bd183c7a5240c4914faa5138174..9bf503670296063715847efb10ab26b6d3c12255 100644
--- a/dart/frog/leg/tree/nodes.dart
+++ b/dart/frog/leg/tree/nodes.dart
@@ -9,6 +9,7 @@ interface Visitor<R> {
R visitClassNode(ClassNode node);
R visitConditional(Conditional node);
R visitContinueStatement(ContinueStatement node);
+ R visitDefaultCase(DefaultCase node);
R visitDoWhile(DoWhile node);
R visitEmptyStatement(EmptyStatement node);
R visitExpressionStatement(ExpressionStatement node);
@@ -40,6 +41,7 @@ interface Visitor<R> {
R visitSendSet(SendSet node);
R visitStringInterpolation(StringInterpolation node);
R visitStringInterpolationPart(StringInterpolationPart node);
+ R visitSwitchCase(SwitchCase node);
R visitSwitchStatement(SwitchStatement node);
R visitThrow(Throw node);
R visitTryStatement(TryStatement node);
@@ -102,6 +104,7 @@ class Node implements Hashable {
ClassNode asClassNode() => null;
Conditional asConditional() => null;
ContinueStatement asContinueStatement() => null;
+ DefaultCase asDefaultCase() => null;
DoWhile asDoWhile() => null;
EmptyStatement asEmptyStatement() => null;
Expression asExpression() => null;
@@ -133,6 +136,7 @@ class Node implements Hashable {
Statement asStatement() => null;
StringInterpolation asStringInterpolation() => null;
StringInterpolationPart asStringInterpolationPart() => null;
+ SwitchCase asSwitchCase() => null;
SwitchStatement asSwitchStatement() => null;
Throw asThrow() => null;
TryStatement asTryStatement() => null;
@@ -1374,13 +1378,12 @@ class NamedArgument extends Expression {
class SwitchStatement extends Statement {
final ParenthesizedExpression parenthesizedExpression;
+ final NodeList cases;
final Token switchKeyword;
- final Token endToken;
- // TODO(ahe): More to come...
- SwitchStatement(this.parenthesizedExpression,
- this.switchKeyword, this.endToken);
+ SwitchStatement(this.parenthesizedExpression, this.cases,
+ this.switchKeyword);
SwitchStatement asSwitchStatement() => this;
@@ -1390,12 +1393,64 @@ class SwitchStatement extends Statement {
visitChildren(Visitor visitor) {
parenthesizedExpression.accept(visitor);
- // TODO(ahe): Add more stuff here.
+ cases.accept(visitor);
}
Token getBeginToken() => switchKeyword;
- Token getEndToken() => endToken;
+ Token getEndToken() => cases.getEndToken();
+}
+
+class SwitchCase extends Node {
+ final Identifier label;
+ final Expression expression;
Lasse Reichstein Nielsen 2012/03/05 19:54:04 Only one expression per case? How is foo: case 1
ahe 2012/03/05 20:07:23 new SwitchCase('foo', 1, []); new SwitchCase(null,
+ final NodeList statements;
+
+ final Token caseKeyword;
+
+ SwitchCase(this.label, this.expression, this.statements, this.caseKeyword);
+
+ SwitchCase asSwitchCase() => this;
+
+ accept(Visitor visitor) => visitor.visitSwitchCase(this);
+
+ visitChildren(Visitor visitor) {
+ if (label !== null) label.accept(visitor);
+ expression.accept(visitor);
+ statements.accept(visitor);
+ }
+
+ Token getBeginToken() {
+ if (label !== null) return label.getBeginToken();
+ return caseKeyword;
+ }
+
+ Token getEndToken() => 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() => statements.getEndToken();
}
class GotoStatement extends Statement {

Powered by Google App Engine
This is Rietveld 408576698