Chromium Code Reviews| Index: frog/leg/scanner/listener.dart |
| =================================================================== |
| --- frog/leg/scanner/listener.dart (revision 2339) |
| +++ frog/leg/scanner/listener.dart (working copy) |
| @@ -462,7 +462,16 @@ |
| } |
| void endTopLevelFields(int count, Token beginToken, Token endToken) { |
| - canceler.cancel("Cannot handle fields", token: beginToken); |
| + List<Identifier> names = <Identifier>[]; |
|
ahe
2011/12/12 14:56:57
Please use Link or LinkBuilder.
ngeoffray
2011/12/12 15:52:08
Done.
|
| + for (int i = 0; i < count; i++) { |
| + names.add(popNode()); |
| + } |
| + Element fields = new PartialFieldListElement(beginToken, endToken); |
|
ahe
2011/12/12 14:56:57
FieldList -> Fields?
ngeoffray
2011/12/12 15:52:08
As discussed, maintained FieldList according to th
|
| + |
| + // Push in source order. |
|
ahe
2011/12/12 14:56:57
Normally the order is reversed, isn't it?
ngeoffray
2011/12/12 15:52:08
Yes.
|
| + for (int i = count - 1; i >= 0; i--) { |
| + pushElement(new PartialFieldElement(names[i].source, fields)); |
| + } |
| } |
| void handleIdentifier(Token token) { |
| @@ -1016,6 +1025,46 @@ |
| } |
| } |
| +class PartialFieldElement extends Element { |
| + final Element variables; |
| + |
| + PartialFieldElement(SourceString name, |
| + Element this.variables, |
| + [Element enclosing = null]) |
| + : super(name, ElementKind.FIELD, enclosing); |
| + |
| + Node parseNode(Canceler canceler, Logger logger) |
| + => variables.parseNode(canceler, logger); |
|
ahe
2011/12/12 14:56:57
I prefer using { return ... } when it doesn't fit
ngeoffray
2011/12/12 15:52:08
Done.
|
| + |
| + Type computeType(Compiler compiler, Type types) |
|
ahe
2011/12/12 14:56:57
This method doesn't belong in this library.
ngeoffray
2011/12/12 15:52:08
Done.
|
| + => variables.computeType(compiler, types); |
|
ahe
2011/12/12 14:56:57
Ditto for { return ... }.
ngeoffray
2011/12/12 15:52:08
Done.
|
| + |
| + Type get type() => variables.type; |
| +} |
| + |
| +class PartialFieldListElement extends Element { |
|
karlklose
2011/12/12 15:09:48
Can you add a short comment on what this element r
ngeoffray
2011/12/12 15:52:08
Done.
|
| + final Token beginToken; |
| + final Token endToken; |
| + Node node; |
|
karlklose
2011/12/12 15:09:48
Or perhaps adding a more precise type for the Node
ngeoffray
2011/12/12 15:52:08
Done.
|
| + Type type; |
| + |
| + PartialFieldListElement(Token this.beginToken, Token this.endToken) |
| + : super(null, ElementKind.VARIABLE_LIST, null); |
| + |
| + Node parseNode(Canceler canceler, Logger logger) { |
| + if (node != null) return node; |
| + node = parse(canceler, logger, |
| + (p) => p.parseVariablesDeclaration(beginToken)); |
| + return node; |
| + } |
| + |
| + Type computeType(Compiler compiler, Type types) { |
|
ahe
2011/12/12 14:56:57
This method doesn't belong in this library.
ngeoffray
2011/12/12 15:52:08
Done.
|
| + if (type != null) return type; |
| + type = getType(parseNode(compiler, compiler).type, compiler, types); |
| + return type; |
| + } |
| +} |
| + |
| Node parse(Canceler canceler, Logger logger, doParse(Parser parser)) { |
| NodeListener listener = new NodeListener(canceler, logger); |
| doParse(new Parser(listener)); |