| 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 dart_parser; | 5 library dart_parser; |
| 6 | 6 |
| 7 import 'package:dart_scanner/src/keyword.dart' show | 7 import 'package:dart_scanner/src/keyword.dart' show |
| 8 Keyword; | 8 Keyword; |
| 9 | 9 |
| 10 import 'package:dart_scanner/src/precedence.dart' show | 10 import 'package:dart_scanner/src/precedence.dart' show |
| (...skipping 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 listener.handleFunctionTypedFormalParameter(token); | 475 listener.handleFunctionTypedFormalParameter(token); |
| 476 } | 476 } |
| 477 String value = token.stringValue; | 477 String value = token.stringValue; |
| 478 if ((identical('=', value)) || (identical(':', value))) { | 478 if ((identical('=', value)) || (identical(':', value))) { |
| 479 // TODO(ahe): Validate that these are only used for optional parameters. | 479 // TODO(ahe): Validate that these are only used for optional parameters. |
| 480 Token equal = token; | 480 Token equal = token; |
| 481 token = parseExpression(token.next); | 481 token = parseExpression(token.next); |
| 482 listener.handleValuedFormalParameter(equal, token); | 482 listener.handleValuedFormalParameter(equal, token); |
| 483 if (type.isRequired) { | 483 if (type.isRequired) { |
| 484 listener.reportError( | 484 listener.reportError( |
| 485 equal, ErrorKind.REQUIRED_PARAMETER_WITH_DEFAULT); | 485 equal, ErrorKind.RequiredParameterWithDefault); |
| 486 } else if (type.isPositional && identical(':', value)) { | 486 } else if (type.isPositional && identical(':', value)) { |
| 487 listener.reportError( | 487 listener.reportError( |
| 488 equal, ErrorKind.POSITIONAL_PARAMETER_WITH_EQUALS); | 488 equal, ErrorKind.PositionalParameterWithEquals); |
| 489 } | 489 } |
| 490 } | 490 } |
| 491 listener.endFormalParameter(thisKeyword); | 491 listener.endFormalParameter(thisKeyword); |
| 492 return token; | 492 return token; |
| 493 } | 493 } |
| 494 | 494 |
| 495 Token parseOptionalFormalParameters(Token token, bool isNamed) { | 495 Token parseOptionalFormalParameters(Token token, bool isNamed) { |
| 496 Token begin = token; | 496 Token begin = token; |
| 497 listener.beginOptionalFormalParameters(begin); | 497 listener.beginOptionalFormalParameters(begin); |
| 498 assert((isNamed && optional('{', token)) || optional('[', token)); | 498 assert((isNamed && optional('{', token)) || optional('[', token)); |
| 499 int parameterCount = 0; | 499 int parameterCount = 0; |
| 500 do { | 500 do { |
| 501 token = token.next; | 501 token = token.next; |
| 502 if (isNamed && optional('}', token)) { | 502 if (isNamed && optional('}', token)) { |
| 503 break; | 503 break; |
| 504 } else if (!isNamed && optional(']', token)) { | 504 } else if (!isNamed && optional(']', token)) { |
| 505 break; | 505 break; |
| 506 } | 506 } |
| 507 var type = | 507 var type = |
| 508 isNamed ? FormalParameterType.NAMED : FormalParameterType.POSITIONAL; | 508 isNamed ? FormalParameterType.NAMED : FormalParameterType.POSITIONAL; |
| 509 token = parseFormalParameter(token, type); | 509 token = parseFormalParameter(token, type); |
| 510 ++parameterCount; | 510 ++parameterCount; |
| 511 } while (optional(',', token)); | 511 } while (optional(',', token)); |
| 512 if (parameterCount == 0) { | 512 if (parameterCount == 0) { |
| 513 listener.reportError( | 513 listener.reportError( |
| 514 token, | 514 token, |
| 515 isNamed | 515 isNamed |
| 516 ? ErrorKind.EMPTY_NAMED_PARAMETER_LIST | 516 ? ErrorKind.EmptyNamedParameterList |
| 517 : ErrorKind.EMPTY_OPTIONAL_PARAMETER_LIST); | 517 : ErrorKind.EmptyOptionalParameterList); |
| 518 } | 518 } |
| 519 listener.endOptionalFormalParameters(parameterCount, begin, token); | 519 listener.endOptionalFormalParameters(parameterCount, begin, token); |
| 520 if (isNamed) { | 520 if (isNamed) { |
| 521 return expect('}', token); | 521 return expect('}', token); |
| 522 } else { | 522 } else { |
| 523 return expect(']', token); | 523 return expect(']', token); |
| 524 } | 524 } |
| 525 } | 525 } |
| 526 | 526 |
| 527 Token parseTypeOpt(Token token) { | 527 Token parseTypeOpt(Token token) { |
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 994 } | 994 } |
| 995 bool hasTypeOrModifier = hasType; | 995 bool hasTypeOrModifier = hasType; |
| 996 if (varFinalOrConst != null) { | 996 if (varFinalOrConst != null) { |
| 997 parseModifier(varFinalOrConst); | 997 parseModifier(varFinalOrConst); |
| 998 modifierCount++; | 998 modifierCount++; |
| 999 hasTypeOrModifier = true; | 999 hasTypeOrModifier = true; |
| 1000 modifierList.remove(varFinalOrConst); | 1000 modifierList.remove(varFinalOrConst); |
| 1001 } | 1001 } |
| 1002 listener.handleModifiers(modifierCount); | 1002 listener.handleModifiers(modifierCount); |
| 1003 var kind = hasTypeOrModifier | 1003 var kind = hasTypeOrModifier |
| 1004 ? ErrorKind.EXTRANEOUS_MODIFIER | 1004 ? ErrorKind.ExtraneousModifier |
| 1005 : ErrorKind.EXTRANEOUS_MODIFIER_REPLACE; | 1005 : ErrorKind.ExtraneousModifierReplace; |
| 1006 for (Token modifier in modifierList) { | 1006 for (Token modifier in modifierList) { |
| 1007 listener.reportError(modifier, kind, {'modifier': modifier}); | 1007 listener.reportError(modifier, kind, {'modifier': modifier}); |
| 1008 } | 1008 } |
| 1009 return null; | 1009 return null; |
| 1010 } | 1010 } |
| 1011 | 1011 |
| 1012 /// Removes the optional `covariant` token from the modifiers, if there | 1012 /// Removes the optional `covariant` token from the modifiers, if there |
| 1013 /// is no `static` in the list, and `covariant` is the first modifier. | 1013 /// is no `static` in the list, and `covariant` is the first modifier. |
| 1014 Link<Token> removeOptCovariantTokenIfNotStatic(Link<Token> modifiers) { | 1014 Link<Token> removeOptCovariantTokenIfNotStatic(Link<Token> modifiers) { |
| 1015 if (modifiers.isEmpty || | 1015 if (modifiers.isEmpty || |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1036 expectVarFinalOrConst(modifiers, hasType, !isTopLevel); | 1036 expectVarFinalOrConst(modifiers, hasType, !isTopLevel); |
| 1037 bool isVar = false; | 1037 bool isVar = false; |
| 1038 bool hasModifier = false; | 1038 bool hasModifier = false; |
| 1039 if (varFinalOrConst != null) { | 1039 if (varFinalOrConst != null) { |
| 1040 hasModifier = true; | 1040 hasModifier = true; |
| 1041 isVar = optional('var', varFinalOrConst); | 1041 isVar = optional('var', varFinalOrConst); |
| 1042 } | 1042 } |
| 1043 | 1043 |
| 1044 if (getOrSet != null) { | 1044 if (getOrSet != null) { |
| 1045 var kind = (hasModifier || hasType) | 1045 var kind = (hasModifier || hasType) |
| 1046 ? ErrorKind.EXTRANEOUS_MODIFIER | 1046 ? ErrorKind.ExtraneousModifier |
| 1047 : ErrorKind.EXTRANEOUS_MODIFIER_REPLACE; | 1047 : ErrorKind.ExtraneousModifierReplace; |
| 1048 listener.reportError(getOrSet, kind, {'modifier': getOrSet}); | 1048 listener.reportError(getOrSet, kind, {'modifier': getOrSet}); |
| 1049 } | 1049 } |
| 1050 | 1050 |
| 1051 if (!hasType) { | 1051 if (!hasType) { |
| 1052 listener.handleNoType(name); | 1052 listener.handleNoType(name); |
| 1053 } else if (optional('void', type)) { | 1053 } else if (optional('void', type)) { |
| 1054 listener.handleNoType(name); | 1054 listener.handleNoType(name); |
| 1055 // TODO(ahe): This error is reported twice, second time is from | 1055 // TODO(ahe): This error is reported twice, second time is from |
| 1056 // [parseVariablesDeclarationMaybeSemicolon] via | 1056 // [parseVariablesDeclarationMaybeSemicolon] via |
| 1057 // [PartialFieldListElement.parseNode]. | 1057 // [PartialFieldListElement.parseNode]. |
| 1058 listener.reportError(type, ErrorKind.INVALID_VOID); | 1058 listener.reportError(type, ErrorKind.InvalidVoid); |
| 1059 } else { | 1059 } else { |
| 1060 parseType(type); | 1060 parseType(type); |
| 1061 if (isVar) { | 1061 if (isVar) { |
| 1062 listener.reportError(modifiers.head, ErrorKind.EXTRANEOUS_MODIFIER, | 1062 listener.reportError(modifiers.head, ErrorKind.ExtraneousModifier, |
| 1063 {'modifier': modifiers.head}); | 1063 {'modifier': modifiers.head}); |
| 1064 } | 1064 } |
| 1065 } | 1065 } |
| 1066 | 1066 |
| 1067 Token token = parseIdentifier(name); | 1067 Token token = parseIdentifier(name); |
| 1068 | 1068 |
| 1069 int fieldCount = 1; | 1069 int fieldCount = 1; |
| 1070 token = parseVariableInitializerOpt(token); | 1070 token = parseVariableInitializerOpt(token); |
| 1071 while (optional(',', token)) { | 1071 while (optional(',', token)) { |
| 1072 token = parseIdentifier(token.next); | 1072 token = parseIdentifier(token.next); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1086 Token parseTopLevelMethod(Token start, Link<Token> modifiers, Token type, | 1086 Token parseTopLevelMethod(Token start, Link<Token> modifiers, Token type, |
| 1087 Token getOrSet, Token name) { | 1087 Token getOrSet, Token name) { |
| 1088 Token externalModifier; | 1088 Token externalModifier; |
| 1089 // TODO(johnniwinther): Move error reporting to resolution to give more | 1089 // TODO(johnniwinther): Move error reporting to resolution to give more |
| 1090 // specific error messages. | 1090 // specific error messages. |
| 1091 for (Token modifier in modifiers) { | 1091 for (Token modifier in modifiers) { |
| 1092 if (externalModifier == null && optional('external', modifier)) { | 1092 if (externalModifier == null && optional('external', modifier)) { |
| 1093 externalModifier = modifier; | 1093 externalModifier = modifier; |
| 1094 } else { | 1094 } else { |
| 1095 listener.reportError( | 1095 listener.reportError( |
| 1096 modifier, ErrorKind.EXTRANEOUS_MODIFIER, {'modifier': modifier}); | 1096 modifier, ErrorKind.ExtraneousModifier, {'modifier': modifier}); |
| 1097 } | 1097 } |
| 1098 } | 1098 } |
| 1099 if (externalModifier != null) { | 1099 if (externalModifier != null) { |
| 1100 parseModifier(externalModifier); | 1100 parseModifier(externalModifier); |
| 1101 listener.handleModifiers(1); | 1101 listener.handleModifiers(1); |
| 1102 } else { | 1102 } else { |
| 1103 listener.handleModifiers(0); | 1103 listener.handleModifiers(0); |
| 1104 } | 1104 } |
| 1105 | 1105 |
| 1106 if (type == null) { | 1106 if (type == null) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 } while (optional(',', token)); | 1248 } while (optional(',', token)); |
| 1249 mayParseFunctionExpressions = old; | 1249 mayParseFunctionExpressions = old; |
| 1250 listener.endInitializers(count, begin, token); | 1250 listener.endInitializers(count, begin, token); |
| 1251 return token; | 1251 return token; |
| 1252 } | 1252 } |
| 1253 | 1253 |
| 1254 Token parseLiteralStringOrRecoverExpression(Token token) { | 1254 Token parseLiteralStringOrRecoverExpression(Token token) { |
| 1255 if (identical(token.kind, STRING_TOKEN)) { | 1255 if (identical(token.kind, STRING_TOKEN)) { |
| 1256 return parseLiteralString(token); | 1256 return parseLiteralString(token); |
| 1257 } else { | 1257 } else { |
| 1258 listener.reportError(token, ErrorKind.EXPECTED_STRING); | 1258 listener.reportError(token, ErrorKind.ExpectedString); |
| 1259 return parseExpression(token); | 1259 return parseExpression(token); |
| 1260 } | 1260 } |
| 1261 } | 1261 } |
| 1262 | 1262 |
| 1263 Token expectSemicolon(Token token) { | 1263 Token expectSemicolon(Token token) { |
| 1264 return expect(';', token); | 1264 return expect(';', token); |
| 1265 } | 1265 } |
| 1266 | 1266 |
| 1267 bool isModifier(Token token) { | 1267 bool isModifier(Token token) { |
| 1268 final String value = token.stringValue; | 1268 final String value = token.stringValue; |
| (...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1484 Token constModifier; | 1484 Token constModifier; |
| 1485 int modifierCount = 0; | 1485 int modifierCount = 0; |
| 1486 int allowedModifierCount = 1; | 1486 int allowedModifierCount = 1; |
| 1487 // TODO(johnniwinther): Move error reporting to resolution to give more | 1487 // TODO(johnniwinther): Move error reporting to resolution to give more |
| 1488 // specific error messages. | 1488 // specific error messages. |
| 1489 for (Token modifier in modifiers) { | 1489 for (Token modifier in modifiers) { |
| 1490 if (externalModifier == null && optional('external', modifier)) { | 1490 if (externalModifier == null && optional('external', modifier)) { |
| 1491 modifierCount++; | 1491 modifierCount++; |
| 1492 externalModifier = modifier; | 1492 externalModifier = modifier; |
| 1493 if (modifierCount != allowedModifierCount) { | 1493 if (modifierCount != allowedModifierCount) { |
| 1494 listener.reportError(modifier, ErrorKind.EXTRANEOUS_MODIFIER, | 1494 listener.reportError(modifier, ErrorKind.ExtraneousModifier, |
| 1495 {'modifier': modifier}); | 1495 {'modifier': modifier}); |
| 1496 } | 1496 } |
| 1497 allowedModifierCount++; | 1497 allowedModifierCount++; |
| 1498 } else if (staticModifier == null && optional('static', modifier)) { | 1498 } else if (staticModifier == null && optional('static', modifier)) { |
| 1499 modifierCount++; | 1499 modifierCount++; |
| 1500 staticModifier = modifier; | 1500 staticModifier = modifier; |
| 1501 if (modifierCount != allowedModifierCount) { | 1501 if (modifierCount != allowedModifierCount) { |
| 1502 listener.reportError(modifier, ErrorKind.EXTRANEOUS_MODIFIER, | 1502 listener.reportError(modifier, ErrorKind.ExtraneousModifier, |
| 1503 {'modifier': modifier}); | 1503 {'modifier': modifier}); |
| 1504 } | 1504 } |
| 1505 } else if (constModifier == null && optional('const', modifier)) { | 1505 } else if (constModifier == null && optional('const', modifier)) { |
| 1506 modifierCount++; | 1506 modifierCount++; |
| 1507 constModifier = modifier; | 1507 constModifier = modifier; |
| 1508 if (modifierCount != allowedModifierCount) { | 1508 if (modifierCount != allowedModifierCount) { |
| 1509 listener.reportError(modifier, ErrorKind.EXTRANEOUS_MODIFIER, | 1509 listener.reportError(modifier, ErrorKind.ExtraneousModifier, |
| 1510 {'modifier': modifier}); | 1510 {'modifier': modifier}); |
| 1511 } | 1511 } |
| 1512 } else { | 1512 } else { |
| 1513 listener.reportError( | 1513 listener.reportError( |
| 1514 modifier, ErrorKind.EXTRANEOUS_MODIFIER, {'modifier': modifier}); | 1514 modifier, ErrorKind.ExtraneousModifier, {'modifier': modifier}); |
| 1515 } | 1515 } |
| 1516 } | 1516 } |
| 1517 if (getOrSet != null && constModifier != null) { | 1517 if (getOrSet != null && constModifier != null) { |
| 1518 listener.reportError(constModifier, ErrorKind.EXTRANEOUS_MODIFIER, | 1518 listener.reportError(constModifier, ErrorKind.ExtraneousModifier, |
| 1519 {'modifier': constModifier}); | 1519 {'modifier': constModifier}); |
| 1520 } | 1520 } |
| 1521 parseModifierList(modifiers); | 1521 parseModifierList(modifiers); |
| 1522 | 1522 |
| 1523 if (type == null) { | 1523 if (type == null) { |
| 1524 listener.handleNoType(name); | 1524 listener.handleNoType(name); |
| 1525 } else { | 1525 } else { |
| 1526 parseReturnTypeOpt(type); | 1526 parseReturnTypeOpt(type); |
| 1527 } | 1527 } |
| 1528 Token token; | 1528 Token token; |
| 1529 if (optional('operator', name)) { | 1529 if (optional('operator', name)) { |
| 1530 token = parseOperatorName(name); | 1530 token = parseOperatorName(name); |
| 1531 if (staticModifier != null) { | 1531 if (staticModifier != null) { |
| 1532 listener.reportError(staticModifier, ErrorKind.EXTRANEOUS_MODIFIER, | 1532 listener.reportError(staticModifier, ErrorKind.ExtraneousModifier, |
| 1533 {'modifier': staticModifier}); | 1533 {'modifier': staticModifier}); |
| 1534 } | 1534 } |
| 1535 } else { | 1535 } else { |
| 1536 token = parseIdentifier(name); | 1536 token = parseIdentifier(name); |
| 1537 } | 1537 } |
| 1538 | 1538 |
| 1539 token = parseQualifiedRestOpt(token); | 1539 token = parseQualifiedRestOpt(token); |
| 1540 if (getOrSet == null) { | 1540 if (getOrSet == null) { |
| 1541 token = parseTypeVariablesOpt(token); | 1541 token = parseTypeVariablesOpt(token); |
| 1542 } else { | 1542 } else { |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 listener.endRedirectingFactoryBody(equals, semicolon); | 1710 listener.endRedirectingFactoryBody(equals, semicolon); |
| 1711 return token; | 1711 return token; |
| 1712 } | 1712 } |
| 1713 | 1713 |
| 1714 Token skipFunctionBody(Token token, bool isExpression, bool allowAbstract) { | 1714 Token skipFunctionBody(Token token, bool isExpression, bool allowAbstract) { |
| 1715 assert(!isExpression); | 1715 assert(!isExpression); |
| 1716 token = skipAsyncModifier(token); | 1716 token = skipAsyncModifier(token); |
| 1717 String value = token.stringValue; | 1717 String value = token.stringValue; |
| 1718 if (identical(value, ';')) { | 1718 if (identical(value, ';')) { |
| 1719 if (!allowAbstract) { | 1719 if (!allowAbstract) { |
| 1720 listener.reportError(token, ErrorKind.EXPECTED_BODY); | 1720 listener.reportError(token, ErrorKind.ExpectedBody); |
| 1721 } | 1721 } |
| 1722 listener.handleNoFunctionBody(token); | 1722 listener.handleNoFunctionBody(token); |
| 1723 } else { | 1723 } else { |
| 1724 if (identical(value, '=>')) { | 1724 if (identical(value, '=>')) { |
| 1725 token = parseExpression(token.next); | 1725 token = parseExpression(token.next); |
| 1726 expectSemicolon(token); | 1726 expectSemicolon(token); |
| 1727 } else if (value == '=') { | 1727 } else if (value == '=') { |
| 1728 token = parseRedirectingFactoryBody(token); | 1728 token = parseRedirectingFactoryBody(token); |
| 1729 expectSemicolon(token); | 1729 expectSemicolon(token); |
| 1730 } else { | 1730 } else { |
| 1731 token = skipBlock(token); | 1731 token = skipBlock(token); |
| 1732 } | 1732 } |
| 1733 listener.skippedFunctionBody(token); | 1733 listener.skippedFunctionBody(token); |
| 1734 } | 1734 } |
| 1735 return token; | 1735 return token; |
| 1736 } | 1736 } |
| 1737 | 1737 |
| 1738 Token parseFunctionBody(Token token, bool isExpression, bool allowAbstract) { | 1738 Token parseFunctionBody(Token token, bool isExpression, bool allowAbstract) { |
| 1739 if (optional(';', token)) { | 1739 if (optional(';', token)) { |
| 1740 if (!allowAbstract) { | 1740 if (!allowAbstract) { |
| 1741 listener.reportError(token, ErrorKind.EXPECTED_BODY); | 1741 listener.reportError(token, ErrorKind.ExpectedBody); |
| 1742 } | 1742 } |
| 1743 listener.endFunctionBody(0, null, token); | 1743 listener.endFunctionBody(0, null, token); |
| 1744 return token; | 1744 return token; |
| 1745 } else if (optional('=>', token)) { | 1745 } else if (optional('=>', token)) { |
| 1746 Token begin = token; | 1746 Token begin = token; |
| 1747 token = parseExpression(token.next); | 1747 token = parseExpression(token.next); |
| 1748 if (!isExpression) { | 1748 if (!isExpression) { |
| 1749 expectSemicolon(token); | 1749 expectSemicolon(token); |
| 1750 listener.endReturnStatement(true, begin, token); | 1750 listener.endReturnStatement(true, begin, token); |
| 1751 } else { | 1751 } else { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1803 token = token.next; | 1803 token = token.next; |
| 1804 } | 1804 } |
| 1805 } else if (optional('sync', token)) { | 1805 } else if (optional('sync', token)) { |
| 1806 async = token; | 1806 async = token; |
| 1807 token = token.next; | 1807 token = token.next; |
| 1808 if (optional('*', token)) { | 1808 if (optional('*', token)) { |
| 1809 asyncAwaitKeywordsEnabled = true; | 1809 asyncAwaitKeywordsEnabled = true; |
| 1810 star = token; | 1810 star = token; |
| 1811 token = token.next; | 1811 token = token.next; |
| 1812 } else { | 1812 } else { |
| 1813 listener.reportError(async, ErrorKind.INVALID_SYNC_MODIFIER); | 1813 listener.reportError(async, ErrorKind.InvalidSyncModifier); |
| 1814 } | 1814 } |
| 1815 } | 1815 } |
| 1816 listener.handleAsyncModifier(async, star); | 1816 listener.handleAsyncModifier(async, star); |
| 1817 return token; | 1817 return token; |
| 1818 } | 1818 } |
| 1819 | 1819 |
| 1820 Token parseStatement(Token token) { | 1820 Token parseStatement(Token token) { |
| 1821 final value = token.stringValue; | 1821 final value = token.stringValue; |
| 1822 if (identical(token.kind, IDENTIFIER_TOKEN)) { | 1822 if (identical(token.kind, IDENTIFIER_TOKEN)) { |
| 1823 return parseExpressionStatementOrDeclaration(token); | 1823 return parseExpressionStatementOrDeclaration(token); |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2247 return token; | 2247 return token; |
| 2248 } | 2248 } |
| 2249 | 2249 |
| 2250 Token parseUnaryExpression(Token token, bool allowCascades) { | 2250 Token parseUnaryExpression(Token token, bool allowCascades) { |
| 2251 String value = token.stringValue; | 2251 String value = token.stringValue; |
| 2252 // Prefix: | 2252 // Prefix: |
| 2253 if (asyncAwaitKeywordsEnabled && optional('await', token)) { | 2253 if (asyncAwaitKeywordsEnabled && optional('await', token)) { |
| 2254 return parseAwaitExpression(token, allowCascades); | 2254 return parseAwaitExpression(token, allowCascades); |
| 2255 } else if (identical(value, '+')) { | 2255 } else if (identical(value, '+')) { |
| 2256 // Dart no longer allows prefix-plus. | 2256 // Dart no longer allows prefix-plus. |
| 2257 listener.reportError(token, ErrorKind.UNSUPPORTED_PREFIX_PLUS); | 2257 listener.reportError(token, ErrorKind.UnsupportedPrefixPlus); |
| 2258 return parseUnaryExpression(token.next, allowCascades); | 2258 return parseUnaryExpression(token.next, allowCascades); |
| 2259 } else if ((identical(value, '!')) || | 2259 } else if ((identical(value, '!')) || |
| 2260 (identical(value, '-')) || | 2260 (identical(value, '-')) || |
| 2261 (identical(value, '~'))) { | 2261 (identical(value, '~'))) { |
| 2262 Token operator = token; | 2262 Token operator = token; |
| 2263 // Right associative, so we recurse at the same precedence | 2263 // Right associative, so we recurse at the same precedence |
| 2264 // level. | 2264 // level. |
| 2265 token = parsePrecedenceExpression( | 2265 token = parsePrecedenceExpression( |
| 2266 token.next, POSTFIX_PRECEDENCE, allowCascades); | 2266 token.next, POSTFIX_PRECEDENCE, allowCascades); |
| 2267 listener.handleUnaryPrefixExpression(operator); | 2267 listener.handleUnaryPrefixExpression(operator); |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2842 Token parseForStatement(Token awaitToken, Token token) { | 2842 Token parseForStatement(Token awaitToken, Token token) { |
| 2843 Token forToken = token; | 2843 Token forToken = token; |
| 2844 listener.beginForStatement(forToken); | 2844 listener.beginForStatement(forToken); |
| 2845 token = expect('for', token); | 2845 token = expect('for', token); |
| 2846 token = expect('(', token); | 2846 token = expect('(', token); |
| 2847 token = parseVariablesDeclarationOrExpressionOpt(token); | 2847 token = parseVariablesDeclarationOrExpressionOpt(token); |
| 2848 if (optional('in', token)) { | 2848 if (optional('in', token)) { |
| 2849 return parseForInRest(awaitToken, forToken, token); | 2849 return parseForInRest(awaitToken, forToken, token); |
| 2850 } else { | 2850 } else { |
| 2851 if (awaitToken != null) { | 2851 if (awaitToken != null) { |
| 2852 listener.reportError(awaitToken, ErrorKind.INVALID_AWAIT_FOR); | 2852 listener.reportError(awaitToken, ErrorKind.InvalidAwaitFor); |
| 2853 } | 2853 } |
| 2854 return parseForRest(forToken, token); | 2854 return parseForRest(forToken, token); |
| 2855 } | 2855 } |
| 2856 } | 2856 } |
| 2857 | 2857 |
| 2858 Token parseVariablesDeclarationOrExpressionOpt(Token token) { | 2858 Token parseVariablesDeclarationOrExpressionOpt(Token token) { |
| 2859 final String value = token.stringValue; | 2859 final String value = token.stringValue; |
| 2860 if (identical(value, ';')) { | 2860 if (identical(value, ';')) { |
| 2861 listener.handleNoExpression(token); | 2861 listener.handleNoExpression(token); |
| 2862 return token; | 2862 return token; |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3170 } | 3170 } |
| 3171 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 3171 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 3172 return expectSemicolon(token); | 3172 return expectSemicolon(token); |
| 3173 } | 3173 } |
| 3174 | 3174 |
| 3175 Token parseEmptyStatement(Token token) { | 3175 Token parseEmptyStatement(Token token) { |
| 3176 listener.handleEmptyStatement(token); | 3176 listener.handleEmptyStatement(token); |
| 3177 return expectSemicolon(token); | 3177 return expectSemicolon(token); |
| 3178 } | 3178 } |
| 3179 } | 3179 } |
| OLD | NEW |