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

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

Issue 8508016: Create class AST nodes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years, 1 month 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
« no previous file with comments | « no previous file | dart/frog/leg/scanner/parser.dart » ('j') | dart/frog/leg/scanner/parser.dart » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: dart/frog/leg/scanner/listener.dart
diff --git a/dart/frog/leg/scanner/listener.dart b/dart/frog/leg/scanner/listener.dart
index 6ee22a7b1cdb846b5806aa6726b4aa5bda22dfc6..1321104aa052b58a9e978c88f7930066973f3589 100644
--- a/dart/frog/leg/scanner/listener.dart
+++ b/dart/frog/leg/scanner/listener.dart
@@ -18,7 +18,8 @@ class Listener {
void beginClass(Token token) {
}
- void endClass(Token beginToken, Token endToken) {
+ void endClass(int interfacesCount, Token beginToken, Token extendsKeyword,
kasperl 2011/11/10 06:37:34 Nit: Somehow the use of keyword in this file seems
ahe 2011/11/10 13:37:23 In this case, I think I get the maximum value from
+ Token implementsKeyword, Token endToken) {
}
void beginExpressionStatement(Token token) {
@@ -133,7 +134,10 @@ class Listener {
void beginTypeArguments(Token token) {
}
- void endTypeArguments(Token token) {
+ void endTypeArguments(int count, Token beginToken, Token endToken) {
+ }
+
+ void handleNoTypeArguments(Token token) {
}
void beginTypeVariable(Token token) {
@@ -145,7 +149,7 @@ class Listener {
void beginTypeVariables(Token token) {
}
- void endTypeVariables(Token token) {
+ void endTypeVariables(int count, Token beginToken, Token endToken) {
}
void beginVariablesDeclaration(Token token) {
@@ -244,12 +248,13 @@ class ElementListener extends Listener {
canceler.cancel("Cannot handle library tags");
}
- void endClass(Token beginToken, Token endToken) {
- Identifier name;
- while (!nodes.isEmpty()) {
- // TODO(ahe): Temporary code to discard supertypes.
- name = popNode();
+ void endClass(int interfacesCount, Token beginToken, Token extendsKeyword,
+ Token implementsKeyword, Token endToken) {
+ for (; interfacesCount > 0; --interfacesCount) {
+ popNode();
}
+ TypeAnnotation supertype = popNode();
ngeoffray 2011/11/10 08:27:42 Type variables were already popped, or not pushed?
ahe 2011/11/10 13:37:23 Already popped, see endTypeVariable below.
+ Identifier name = popNode();
pushElement(new PartialClassElement(name.source, beginToken, endToken));
}
@@ -277,6 +282,15 @@ class ElementListener extends Listener {
pushNode(new Identifier(token));
}
+ void handleNoType(Token token) {
+ pushNode(null);
+ }
+
+ void endTypeVariable(Token token) {
+ TypeAnnotation bound = popNode();
+ Identifier name = popNode();
+ }
+
Token expected(String string, Token token) {
canceler.cancel("Expected '$string', but got '$token' " +
"@ ${token.charOffset}");
@@ -324,14 +338,24 @@ class ElementListener extends Listener {
}
}
-class BodyListener extends ElementListener {
+class NodeListener extends ElementListener {
final Logger logger;
Function onError;
- BodyListener(Canceler canceler, Logger this.logger) : super(canceler) {
+ NodeListener(Canceler canceler, Logger this.logger) : super(canceler) {
onError = handleOnError; // Cuts parser time in half or more.
}
+ void endClass(int interfacesCount, Token beginToken, Token extendsKeyword,
+ Token implementsKeyword, Token endToken) {
+ NodeList interfaces =
+ makeNodeList(interfacesCount, implementsKeyword, null, ",");
+ TypeAnnotation supertype = popNode();
ngeoffray 2011/11/10 08:27:42 TODO(ahe): type variables?
ahe 2011/11/10 13:37:23 Done.
+ Identifier name = popNode();
+ pushNode(new ClassNode(name, supertype, interfaces, beginToken,
+ extendsKeyword, endToken));
+ }
+
void endFormalParameter(Token token) {
NodeList name = new NodeList.singleton(popNode());
TypeAnnotation type = popNode();
@@ -480,10 +504,6 @@ class BodyListener extends ElementListener {
pushNode(new Throw(null, throwToken, endToken));
}
- void handleNoType(Token token) {
- pushNode(null);
- }
-
NodeList makeNodeList(int count, Token beginToken, Token endToken,
String delimiter) {
Link<Node> nodes = const EmptyLink<Node>();
@@ -529,15 +549,14 @@ class PartialClassElement extends ClassElement {
ClassNode parseNode(Canceler canceler, Logger logger) {
if (node != null) return node;
- // node = parseAnyNode(canceler, logger, (p) => p.parseClass(beginToken));
- node = new ClassNode(name, beginToken, endToken);
+ node = parse(canceler, logger, (p) => p.parseClass(beginToken));
return node;
}
}
Node parse(Canceler canceler, Logger logger, doParse(Parser parser)) {
- BodyListener listener = new BodyListener(canceler, logger);
- doParse(new BodyParser(listener));
+ NodeListener listener = new NodeListener(canceler, logger);
+ doParse(new Parser(listener));
Node node = listener.popNode();
logger.log("parsed: $node");
return node;
« no previous file with comments | « no previous file | dart/frog/leg/scanner/parser.dart » ('j') | dart/frog/leg/scanner/parser.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698