Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 library dart2js.parser; | 5 library dart2js.parser; |
| 6 | 6 |
| 7 import '../common.dart'; | 7 import '../common.dart'; |
| 8 import '../options.dart' show ParserOptions; | 8 import '../options.dart' show ParserOptions; |
| 9 import '../tokens/keyword.dart' show Keyword; | 9 import '../tokens/keyword.dart' show Keyword; |
| 10 import '../tokens/precedence.dart' show PrecedenceInfo; | 10 import '../tokens/precedence.dart' show PrecedenceInfo; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 105 Parser(this.listener, ParserOptions parserOptions, | 105 Parser(this.listener, ParserOptions parserOptions, |
| 106 {this.asyncAwaitKeywordsEnabled: false}) | 106 {this.asyncAwaitKeywordsEnabled: false}) |
| 107 : parserOptions = parserOptions, | 107 : parserOptions = parserOptions, |
| 108 enableGenericMethodSyntax = parserOptions.enableGenericMethodSyntax; | 108 enableGenericMethodSyntax = parserOptions.enableGenericMethodSyntax; |
| 109 | 109 |
| 110 Token parseUnit(Token token) { | 110 Token parseUnit(Token token) { |
| 111 listener.beginCompilationUnit(token); | 111 listener.beginCompilationUnit(token); |
| 112 int count = 0; | 112 int count = 0; |
| 113 while (!identical(token.kind, EOF_TOKEN)) { | 113 while (!identical(token.kind, EOF_TOKEN)) { |
| 114 token = parseTopLevelDeclaration(token); | 114 token = parseTopLevelDeclaration(token); |
| 115 listener.endTopLevelDeclaration(token); | |
| 116 count++; | 115 count++; |
| 117 } | 116 } |
| 118 listener.endCompilationUnit(count, token); | 117 listener.endCompilationUnit(count, token); |
| 119 return token; | 118 return token; |
| 120 } | 119 } |
| 121 | 120 |
| 122 Token parseTopLevelDeclaration(Token token) { | 121 Token parseTopLevelDeclaration(Token token) { |
| 122 token = _parseTopLevelDeclaration(token); | |
| 123 listener.endTopLevelDeclaration(token); | |
|
Siggi Cherem (dart-lang)
2016/09/30 22:28:07
note: this moved down here because when we parse a
| |
| 124 return token; | |
| 125 } | |
| 126 | |
| 127 Token _parseTopLevelDeclaration(Token token) { | |
| 123 token = parseMetadataStar(token); | 128 token = parseMetadataStar(token); |
| 124 final String value = token.stringValue; | 129 final String value = token.stringValue; |
| 125 if ((identical(value, 'abstract') && optional('class', token.next)) || | 130 if ((identical(value, 'abstract') && optional('class', token.next)) || |
| 126 identical(value, 'class')) { | 131 identical(value, 'class')) { |
| 127 return parseClassOrNamedMixinApplication(token); | 132 return parseClassOrNamedMixinApplication(token); |
| 128 } else if (identical(value, 'enum')) { | 133 } else if (identical(value, 'enum')) { |
| 129 return parseEnum(token); | 134 return parseEnum(token); |
| 130 } else if (identical(value, 'typedef')) { | 135 } else if (identical(value, 'typedef')) { |
| 131 return parseTypedef(token); | 136 return parseTypedef(token); |
| 132 } else if (identical(value, 'library')) { | 137 } else if (identical(value, 'library')) { |
| (...skipping 1217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1350 } | 1355 } |
| 1351 | 1356 |
| 1352 bool isFactoryDeclaration(Token token) { | 1357 bool isFactoryDeclaration(Token token) { |
| 1353 if (optional('external', token)) token = token.next; | 1358 if (optional('external', token)) token = token.next; |
| 1354 if (optional('const', token)) token = token.next; | 1359 if (optional('const', token)) token = token.next; |
| 1355 return optional('factory', token); | 1360 return optional('factory', token); |
| 1356 } | 1361 } |
| 1357 | 1362 |
| 1358 Token parseMember(Token token) { | 1363 Token parseMember(Token token) { |
| 1359 token = parseMetadataStar(token); | 1364 token = parseMetadataStar(token); |
| 1360 if (isFactoryDeclaration(token)) { | |
| 1361 return parseFactoryMethod(token); | |
| 1362 } | |
| 1363 Token start = token; | 1365 Token start = token; |
| 1364 listener.beginMember(token); | 1366 listener.beginMember(token); |
| 1367 if (isFactoryDeclaration(token)) { | |
| 1368 token = parseFactoryMethod(token); | |
| 1369 listener.endMember(); | |
| 1370 assert (token != null); | |
| 1371 return token; | |
| 1372 } | |
| 1365 | 1373 |
| 1366 Link<Token> identifiers = findMemberName(token); | 1374 Link<Token> identifiers = findMemberName(token); |
| 1367 if (identifiers.isEmpty) { | 1375 if (identifiers.isEmpty) { |
| 1368 return listener.expectedDeclaration(start); | 1376 return listener.expectedDeclaration(start); |
| 1369 } | 1377 } |
| 1370 Token afterName = identifiers.head; | 1378 Token afterName = identifiers.head; |
| 1371 identifiers = identifiers.tail; | 1379 identifiers = identifiers.tail; |
| 1372 | 1380 |
| 1373 if (identifiers.isEmpty) { | 1381 if (identifiers.isEmpty) { |
| 1374 return listener.expectedDeclaration(start); | 1382 return listener.expectedDeclaration(start); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1420 } | 1428 } |
| 1421 break; | 1429 break; |
| 1422 } else if ((identical(value, '=')) || (identical(value, ','))) { | 1430 } else if ((identical(value, '=')) || (identical(value, ','))) { |
| 1423 isField = true; | 1431 isField = true; |
| 1424 break; | 1432 break; |
| 1425 } else { | 1433 } else { |
| 1426 token = listener.unexpected(token); | 1434 token = listener.unexpected(token); |
| 1427 if (identical(token.kind, EOF_TOKEN)) { | 1435 if (identical(token.kind, EOF_TOKEN)) { |
| 1428 // TODO(ahe): This is a hack, see parseTopLevelMember. | 1436 // TODO(ahe): This is a hack, see parseTopLevelMember. |
| 1429 listener.endFields(1, start, token); | 1437 listener.endFields(1, start, token); |
| 1438 listener.endMember(); | |
| 1430 return token; | 1439 return token; |
| 1431 } | 1440 } |
| 1432 } | 1441 } |
| 1433 } | 1442 } |
| 1434 | 1443 |
| 1435 var modifiers = identifiers.reverse(); | 1444 var modifiers = identifiers.reverse(); |
| 1436 return isField | 1445 token = isField |
| 1437 ? parseFields(start, modifiers, type, getOrSet, name, false) | 1446 ? parseFields(start, modifiers, type, getOrSet, name, false) |
| 1438 : parseMethod(start, modifiers, type, getOrSet, name); | 1447 : parseMethod(start, modifiers, type, getOrSet, name); |
| 1448 listener.endMember(); | |
| 1449 return token; | |
| 1439 } | 1450 } |
| 1440 | 1451 |
| 1441 Token parseMethod(Token start, Link<Token> modifiers, Token type, | 1452 Token parseMethod(Token start, Link<Token> modifiers, Token type, |
| 1442 Token getOrSet, Token name) { | 1453 Token getOrSet, Token name) { |
| 1443 Token externalModifier; | 1454 Token externalModifier; |
| 1444 Token staticModifier; | 1455 Token staticModifier; |
| 1445 Token constModifier; | 1456 Token constModifier; |
| 1446 int modifierCount = 0; | 1457 int modifierCount = 0; |
| 1447 int allowedModifierCount = 1; | 1458 int allowedModifierCount = 1; |
| 1448 // TODO(johnniwinther): Move error reporting to resolution to give more | 1459 // TODO(johnniwinther): Move error reporting to resolution to give more |
| (...skipping 1547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2996 } | 3007 } |
| 2997 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 3008 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 2998 return expectSemicolon(token); | 3009 return expectSemicolon(token); |
| 2999 } | 3010 } |
| 3000 | 3011 |
| 3001 Token parseEmptyStatement(Token token) { | 3012 Token parseEmptyStatement(Token token) { |
| 3002 listener.handleEmptyStatement(token); | 3013 listener.handleEmptyStatement(token); |
| 3003 return expectSemicolon(token); | 3014 return expectSemicolon(token); |
| 3004 } | 3015 } |
| 3005 } | 3016 } |
| OLD | NEW |