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

Side by Side Diff: dart/lib/compiler/implementation/scanner/parser.dart

Issue 10836351: Parse metadata, but ignore it. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /** 5 /**
6 * An event generating parser of Dart programs. This parser expects 6 * An event generating parser of Dart programs. This parser expects
7 * all tokens in a linked list (aka a token stream). 7 * all tokens in a linked list (aka a token stream).
8 * 8 *
9 * The class [Scanner] is used to generate a token stream. See the 9 * The class [Scanner] is used to generate a token stream. See the
10 * file scanner.dart. 10 * file scanner.dart.
11 * 11 *
12 * Subclasses of the class [Listener] are used to listen to events. 12 * Subclasses of the class [Listener] are used to listen to events.
13 */ 13 */
14 class Parser { 14 class Parser {
15 final Listener listener; 15 final Listener listener;
16 bool mayParseFunctionExpressions = true; 16 bool mayParseFunctionExpressions = true;
17 17
18 Parser(Listener this.listener); 18 Parser(Listener this.listener);
19 19
20 void parseUnit(Token token) { 20 void parseUnit(Token token) {
21 while (token.kind !== EOF_TOKEN) { 21 while (token.kind !== EOF_TOKEN) {
22 token = parseTopLevelDeclaration(token); 22 token = parseTopLevelDeclaration(token);
23 } 23 }
24 } 24 }
25 25
26 Token parseTopLevelDeclaration(Token token) { 26 Token parseTopLevelDeclaration(Token token) {
27 token = parseMetadataStar(token);
ngeoffray 2012/08/21 06:28:31 What's the Star suffix for? for consistency, shoul
Johnni Winther 2012/08/21 07:05:31 Star means 0 or more. Opt means 0 or 1.
ahe 2012/08/21 07:07:10 The suffix "star" refers to the asterisk in gramma
ahe 2012/08/21 10:49:46 I have updated the class comment.
27 final String value = token.stringValue; 28 final String value = token.stringValue;
28 if (value === 'interface') { 29 if (value === 'interface') {
29 return parseInterface(token); 30 return parseInterface(token);
30 } else if ((value === 'abstract') || (value === 'class')) { 31 } else if ((value === 'abstract') || (value === 'class')) {
31 return parseClass(token); 32 return parseClass(token);
32 } else if (value === 'typedef') { 33 } else if (value === 'typedef') {
33 return parseNamedFunctionAlias(token); 34 return parseNamedFunctionAlias(token);
34 } else if (value === '#') { 35 } else if (value === '#') {
35 return parseScriptTags(token); 36 return parseScriptTags(token);
36 } else { 37 } else {
37 return parseTopLevelMember(token); 38 return parseTopLevelMember(token);
38 } 39 }
39 } 40 }
40 41
42 Token parseMetadataStar(Token token) {
43 while (optional('@', token)) {
44 token = parseMetadata(token);
45 }
46 return token;
47 }
48
49 Token parseMetadata(Token token) {
50 listener.beginMetadata(token);
51 Token atToken = token;
52 assert(optional('@', token));
53 token = parseIdentifier(token.next);
54 token = parseQualifiedRestOpt(token);
55 token = parseArgumentsOpt(token);
56 listener.endMetadata(atToken, token);
57 return token;
58 }
59
41 Token parseInterface(Token token) { 60 Token parseInterface(Token token) {
42 Token interfaceKeyword = token; 61 Token interfaceKeyword = token;
43 listener.beginInterface(token); 62 listener.beginInterface(token);
44 token = parseIdentifier(token.next); 63 token = parseIdentifier(token.next);
45 token = parseTypeVariablesOpt(token); 64 token = parseTypeVariablesOpt(token);
46 int supertypeCount = 0; 65 int supertypeCount = 0;
47 Token extendsKeyword = null; 66 Token extendsKeyword = null;
48 if (optional('extends', token)) { 67 if (optional('extends', token)) {
49 extendsKeyword = token; 68 extendsKeyword = token;
50 do { 69 do {
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 final Token peek = peekAfterExpectedType(token); 598 final Token peek = peekAfterExpectedType(token);
580 if (isGetOrSet(peek) && isIdentifier(peek.next)) { 599 if (isGetOrSet(peek) && isIdentifier(peek.next)) {
581 // type? get identifier 600 // type? get identifier
582 return peek; 601 return peek;
583 } 602 }
584 } 603 }
585 return null; 604 return null;
586 } 605 }
587 606
588 Token parseMember(Token token) { 607 Token parseMember(Token token) {
608 token = parseMetadataStar(token);
589 String value = token.stringValue; 609 String value = token.stringValue;
590 if (value === 'factory' || 610 if (value === 'factory' ||
591 (value === 'external' && optional('factory', token.next))) { 611 (value === 'external' && optional('factory', token.next))) {
592 return parseFactoryMethod(token); 612 return parseFactoryMethod(token);
593 } 613 }
594 Token start = token; 614 Token start = token;
595 listener.beginMember(token); 615 listener.beginMember(token);
596 token = parseModifiers(token); 616 token = parseModifiers(token);
597 Token getOrSet = findGetOrSet(token); 617 Token getOrSet = findGetOrSet(token);
598 if (token === getOrSet) token = token.next; 618 if (token === getOrSet) token = token.next;
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 } 1809 }
1790 listener.handleContinueStatement(hasTarget, continueKeyword, token); 1810 listener.handleContinueStatement(hasTarget, continueKeyword, token);
1791 return expectSemicolon(token); 1811 return expectSemicolon(token);
1792 } 1812 }
1793 1813
1794 Token parseEmptyStatement(Token token) { 1814 Token parseEmptyStatement(Token token) {
1795 listener.handleEmptyStatement(token); 1815 listener.handleEmptyStatement(token);
1796 return expectSemicolon(token); 1816 return expectSemicolon(token);
1797 } 1817 }
1798 } 1818 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698