| Index: dart/lib/compiler/implementation/scanner/parser.dart
|
| diff --git a/dart/lib/compiler/implementation/scanner/parser.dart b/dart/lib/compiler/implementation/scanner/parser.dart
|
| index 4f4f5ddba2aba43b2f61400ae36a5585d69f63d0..48fc94ddc6634a2d756a6e30be6e1c36bcc018c2 100644
|
| --- a/dart/lib/compiler/implementation/scanner/parser.dart
|
| +++ b/dart/lib/compiler/implementation/scanner/parser.dart
|
| @@ -31,10 +31,15 @@ class Parser {
|
|
|
| Parser(this.listener);
|
|
|
| - void parseUnit(Token token) {
|
| + Token parseUnit(Token token) {
|
| + listener.beginCompilationUnit(token);
|
| + int count = 0;
|
| while (token.kind !== EOF_TOKEN) {
|
| token = parseTopLevelDeclaration(token);
|
| + count++;
|
| }
|
| + listener.endCompilationUnit(count, token);
|
| + return token;
|
| }
|
|
|
| Token parseTopLevelDeclaration(Token token) {
|
| @@ -54,6 +59,8 @@ class Parser {
|
| return parseImport(token);
|
| } else if (value === 'export') {
|
| return parseExport(token);
|
| + } else if (value === 'part') {
|
| + return parsePartOrPartOf(token);
|
| } else {
|
| return parseTopLevelMember(token);
|
| }
|
| @@ -64,10 +71,7 @@ class Parser {
|
| Token libraryKeyword = token;
|
| listener.beginLibraryName(libraryKeyword);
|
| assert(optional('library', token));
|
| - token = parseIdentifier(token.next);
|
| - while (optional('.', token)) {
|
| - token = parseQualifiedRest(token);
|
| - }
|
| + token = parseQualified(token.next);
|
| Token semicolon = token;
|
| token = expect(';', token);
|
| listener.endLibraryName(libraryKeyword, semicolon);
|
| @@ -155,6 +159,38 @@ class Parser {
|
| return token;
|
| }
|
|
|
| + Token parsePartOrPartOf(Token token) {
|
| + assert(optional('part', token));
|
| + if (optional('of', token.next)) {
|
| + return parsePartOf(token);
|
| + } else {
|
| + return parsePart(token);
|
| + }
|
| + }
|
| +
|
| + Token parsePart(Token token) {
|
| + Token partKeyword = token;
|
| + listener.beginPart(token);
|
| + assert(optional('part', token));
|
| + token = parseLiteralStringOrRecoverExpression(token.next);
|
| + Token semicolon = token;
|
| + token = expect(';', token);
|
| + listener.endPart(partKeyword, semicolon);
|
| + return token;
|
| + }
|
| +
|
| + Token parsePartOf(Token token) {
|
| + listener.beginPartOf(token);
|
| + assert(optional('part', token));
|
| + assert(optional('of', token.next));
|
| + Token partKeyword = token;
|
| + token = parseQualified(token.next.next);
|
| + Token semicolon = token;
|
| + token = expect(';', token);
|
| + listener.endPartOf(partKeyword, semicolon);
|
| + return token;
|
| + }
|
| +
|
| Token parseMetadataStar(Token token) {
|
| while (optional('@', token)) {
|
| token = parseMetadata(token);
|
| @@ -342,6 +378,14 @@ class Parser {
|
| return token;
|
| }
|
|
|
| + Token parseQualified(Token token) {
|
| + token = parseIdentifier(token);
|
| + while (optional('.', token)) {
|
| + token = parseQualifiedRest(token);
|
| + }
|
| + return token;
|
| + }
|
| +
|
| Token parseQualifiedRestOpt(Token token) {
|
| if (optional('.', token)) {
|
| return parseQualifiedRest(token);
|
|
|