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