Chromium Code Reviews| Index: frog/leg/scanner/listener.dart |
| diff --git a/frog/leg/scanner/listener.dart b/frog/leg/scanner/listener.dart |
| index c30e564c2da92366c3c4f02139bfac290c77a47e..f0ffe0fada44ad4f366cb89d0177793ab822cbdd 100644 |
| --- a/frog/leg/scanner/listener.dart |
| +++ b/frog/leg/scanner/listener.dart |
| @@ -541,6 +541,7 @@ class ElementListener extends Listener { |
| NodeList interfaces = |
| makeNodeList(interfacesCount, implementsKeyword, null, ","); |
| TypeAnnotation supertype = popNode(); |
| + NodeList typeParameters = popNode(); |
| Identifier name = popNode(); |
| ClassElement element = new PartialClassElement( |
| name.source, beginToken, endToken, compilationUnitElement); |
| @@ -549,7 +550,9 @@ class ElementListener extends Listener { |
| } |
| void endDefaultClause(Token defaultKeyword) { |
| - pushNode(makeNodeList(1, defaultKeyword, null, null)); |
| + NodeList typeParameters = popNode(); |
| + Node name = popNode(); |
| + pushNode(new TypeAnnotation(name, typeParameters)); |
| } |
| void handleNoDefaultClause(Token token) { |
| @@ -562,12 +565,15 @@ class ElementListener extends Listener { |
| Node defaultClause = popNode(); |
| NodeList supertypes = |
| makeNodeList(supertypeCount, extendsKeyword, null, ","); |
| + NodeList typeParameters = popNode(); |
| Identifier name = popNode(); |
| - pushElement(new PartialClassElement( |
| - name.source, interfaceKeyword, endToken, compilationUnitElement)); |
| + pushElement(new PartialClassElement(name.source, interfaceKeyword, |
| + endToken, |
| + compilationUnitElement)); |
| } |
| void endFunctionTypeAlias(Token typedefKeyword, Token endToken) { |
| + NodeList typeVariables = popNode(); // TOOD(karlklose): do not throw away. |
| Identifier name = popNode(); |
| TypeAnnotation returnType = popNode(); |
| pushElement(new TypedefElement(name.source, compilationUnitElement)); |
| @@ -644,6 +650,15 @@ class ElementListener extends Listener { |
| void endTypeVariable(Token token) { |
| TypeAnnotation bound = popNode(); |
| Identifier name = popNode(); |
| + pushNode(new TypeVariable(name, bound)); |
| + } |
| + |
| + void endTypeVariables(int count, Token beginToken, Token endToken) { |
| + pushNode(makeNodeList(count, beginToken, endToken, ',')); |
| + } |
| + |
| + void handleNoTypeVariables(token) { |
| + pushNode(null); |
| } |
| void endTypeArguments(int count, Token beginToken, Token endToken) { |
| @@ -856,9 +871,9 @@ class NodeListener extends ElementListener { |
| NodeList interfaces = |
| makeNodeList(interfacesCount, implementsKeyword, null, ","); |
| TypeAnnotation supertype = popNode(); |
| - // TODO(ahe): Type variables. |
| + NodeList typeParameters = popNode(); |
| Identifier name = popNode(); |
| - pushNode(new ClassNode(name, supertype, interfaces, null, |
| + pushNode(new ClassNode(name, typeParameters, supertype, interfaces, null, |
| beginToken, extendsKeyword, endToken)); |
| } |
| @@ -877,15 +892,12 @@ class NodeListener extends ElementListener { |
| NodeList defaultClause = popNode(); |
| NodeList supertypes = makeNodeList(supertypeCount, extendsKeyword, |
| null, ','); |
| + NodeList typeParameters = popNode(); |
| Identifier name = popNode(); |
| - pushNode(new ClassNode(name, null, supertypes, defaultClause, |
| + pushNode(new ClassNode(name, typeParameters, null, supertypes, defaultClause, |
|
ngeoffray
2012/03/15 11:47:40
line too long
karlklose
2012/03/16 14:58:47
Done.
|
| interfaceKeyword, null, endToken)); |
| } |
| - void endDefaultClause(Token defaultKeyword) { |
| - pushNode(makeNodeList(1, defaultKeyword, null, null)); |
| - } |
| - |
| void endClassBody(int memberCount, Token beginToken, Token endToken) { |
| pushNode(makeNodeList(memberCount, beginToken, endToken, null)); |
| } |
| @@ -1348,6 +1360,7 @@ class NodeListener extends ElementListener { |
| Token endToken) { |
| Statement body = popNode(); |
| NodeList formals = popNode(); |
| + NodeList typeParameters = popNode(); |
| Node name = popNode(); |
| if (periodBeforeName !== null) { |
| // A library prefix was handled in [handleQualified]. |