| 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; | |
| 9 import '../tokens/keyword.dart' show Keyword; | 8 import '../tokens/keyword.dart' show Keyword; |
| 10 import '../tokens/precedence.dart' show PrecedenceInfo; | 9 import '../tokens/precedence.dart' show PrecedenceInfo; |
| 11 import '../tokens/precedence_constants.dart' | 10 import '../tokens/precedence_constants.dart' |
| 12 show | 11 show |
| 13 AS_INFO, | 12 AS_INFO, |
| 14 ASSIGNMENT_PRECEDENCE, | 13 ASSIGNMENT_PRECEDENCE, |
| 15 CASCADE_PRECEDENCE, | 14 CASCADE_PRECEDENCE, |
| 16 EQUALITY_PRECEDENCE, | 15 EQUALITY_PRECEDENCE, |
| 17 GT_INFO, | 16 GT_INFO, |
| 18 IS_INFO, | 17 IS_INFO, |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 * events (except for errors) and may return null. | 88 * events (except for errors) and may return null. |
| 90 * | 89 * |
| 91 * Parse methods are generally named parseGrammarProductionSuffix. The | 90 * Parse methods are generally named parseGrammarProductionSuffix. The |
| 92 * suffix can be one of "opt", or "star". "opt" means zero or one | 91 * suffix can be one of "opt", or "star". "opt" means zero or one |
| 93 * matches, "star" means zero or more matches. For example, | 92 * matches, "star" means zero or more matches. For example, |
| 94 * [parseMetadataStar] corresponds to this grammar snippet: [: | 93 * [parseMetadataStar] corresponds to this grammar snippet: [: |
| 95 * metadata* :], and [parseTypeOpt] corresponds to: [: type? :]. | 94 * metadata* :], and [parseTypeOpt] corresponds to: [: type? :]. |
| 96 */ | 95 */ |
| 97 class Parser { | 96 class Parser { |
| 98 final Listener listener; | 97 final Listener listener; |
| 99 final ParserOptions parserOptions; | |
| 100 bool mayParseFunctionExpressions = true; | 98 bool mayParseFunctionExpressions = true; |
| 101 bool asyncAwaitKeywordsEnabled; | 99 bool asyncAwaitKeywordsEnabled; |
| 102 | 100 |
| 103 final bool enableGenericMethodSyntax; | 101 Parser(this.listener, {this.asyncAwaitKeywordsEnabled: false}); |
| 104 | |
| 105 Parser(this.listener, ParserOptions parserOptions, | |
| 106 {this.asyncAwaitKeywordsEnabled: false}) | |
| 107 : parserOptions = parserOptions, | |
| 108 enableGenericMethodSyntax = parserOptions.enableGenericMethodSyntax; | |
| 109 | 102 |
| 110 Token parseUnit(Token token) { | 103 Token parseUnit(Token token) { |
| 111 listener.beginCompilationUnit(token); | 104 listener.beginCompilationUnit(token); |
| 112 int count = 0; | 105 int count = 0; |
| 113 while (!identical(token.kind, EOF_TOKEN)) { | 106 while (!identical(token.kind, EOF_TOKEN)) { |
| 114 token = parseTopLevelDeclaration(token); | 107 token = parseTopLevelDeclaration(token); |
| 115 count++; | 108 count++; |
| 116 } | 109 } |
| 117 listener.endCompilationUnit(count, token); | 110 listener.endCompilationUnit(count, token); |
| 118 return token; | 111 return token; |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 thisKeyword = token; | 452 thisKeyword = token; |
| 460 // TODO(ahe): Validate field initializers are only used in | 453 // TODO(ahe): Validate field initializers are only used in |
| 461 // constructors, and not for function-typed arguments. | 454 // constructors, and not for function-typed arguments. |
| 462 token = expect('.', token.next); | 455 token = expect('.', token.next); |
| 463 } | 456 } |
| 464 token = parseIdentifier(token); | 457 token = parseIdentifier(token); |
| 465 if (optional('(', token)) { | 458 if (optional('(', token)) { |
| 466 listener.handleNoTypeVariables(token); | 459 listener.handleNoTypeVariables(token); |
| 467 token = parseFormalParameters(token); | 460 token = parseFormalParameters(token); |
| 468 listener.handleFunctionTypedFormalParameter(token); | 461 listener.handleFunctionTypedFormalParameter(token); |
| 469 } else if (enableGenericMethodSyntax && optional('<', token)) { | 462 } else if (optional('<', token)) { |
| 470 token = parseTypeVariablesOpt(token); | 463 token = parseTypeVariablesOpt(token); |
| 471 token = parseFormalParameters(token); | 464 token = parseFormalParameters(token); |
| 472 listener.handleFunctionTypedFormalParameter(token); | 465 listener.handleFunctionTypedFormalParameter(token); |
| 473 } | 466 } |
| 474 String value = token.stringValue; | 467 String value = token.stringValue; |
| 475 if ((identical('=', value)) || (identical(':', value))) { | 468 if ((identical('=', value)) || (identical(':', value))) { |
| 476 // TODO(ahe): Validate that these are only used for optional parameters. | 469 // TODO(ahe): Validate that these are only used for optional parameters. |
| 477 Token equal = token; | 470 Token equal = token; |
| 478 token = parseExpression(token.next); | 471 token = parseExpression(token.next); |
| 479 listener.handleValuedFormalParameter(equal, token); | 472 listener.handleValuedFormalParameter(equal, token); |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 if (!identical(string, token.stringValue)) { | 769 if (!identical(string, token.stringValue)) { |
| 777 return listener.expected(string, token); | 770 return listener.expected(string, token); |
| 778 } | 771 } |
| 779 return token.next; | 772 return token.next; |
| 780 } | 773 } |
| 781 | 774 |
| 782 Token parseTypeVariable(Token token) { | 775 Token parseTypeVariable(Token token) { |
| 783 listener.beginTypeVariable(token); | 776 listener.beginTypeVariable(token); |
| 784 token = parseIdentifier(token); | 777 token = parseIdentifier(token); |
| 785 Token extendsOrSuper = null; | 778 Token extendsOrSuper = null; |
| 786 if (optional('extends', token) || | 779 if (optional('extends', token) || optional('super', token)) { |
| 787 (enableGenericMethodSyntax && optional('super', token))) { | |
| 788 extendsOrSuper = token; | 780 extendsOrSuper = token; |
| 789 token = parseType(token.next); | 781 token = parseType(token.next); |
| 790 } else { | 782 } else { |
| 791 listener.handleNoType(token); | 783 listener.handleNoType(token); |
| 792 } | 784 } |
| 793 listener.endTypeVariable(token, extendsOrSuper); | 785 listener.endTypeVariable(token, extendsOrSuper); |
| 794 return token; | 786 return token; |
| 795 } | 787 } |
| 796 | 788 |
| 797 /** | 789 /** |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 listener.handleModifiers(0); | 1084 listener.handleModifiers(0); |
| 1093 } | 1085 } |
| 1094 | 1086 |
| 1095 if (type == null) { | 1087 if (type == null) { |
| 1096 listener.handleNoType(name); | 1088 listener.handleNoType(name); |
| 1097 } else { | 1089 } else { |
| 1098 parseReturnTypeOpt(type); | 1090 parseReturnTypeOpt(type); |
| 1099 } | 1091 } |
| 1100 Token token = parseIdentifier(name); | 1092 Token token = parseIdentifier(name); |
| 1101 | 1093 |
| 1102 if (enableGenericMethodSyntax && getOrSet == null) { | 1094 if (getOrSet == null) { |
| 1103 token = parseTypeVariablesOpt(token); | 1095 token = parseTypeVariablesOpt(token); |
| 1104 } else { | 1096 } else { |
| 1105 listener.handleNoTypeVariables(token); | 1097 listener.handleNoTypeVariables(token); |
| 1106 } | 1098 } |
| 1107 token = parseFormalParametersOpt(token); | 1099 token = parseFormalParametersOpt(token); |
| 1108 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; | 1100 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; |
| 1109 token = parseAsyncModifier(token); | 1101 token = parseAsyncModifier(token); |
| 1110 token = parseFunctionBody(token, false, externalModifier != null); | 1102 token = parseFunctionBody(token, false, externalModifier != null); |
| 1111 asyncAwaitKeywordsEnabled = previousAsyncAwaitKeywordsEnabled; | 1103 asyncAwaitKeywordsEnabled = previousAsyncAwaitKeywordsEnabled; |
| 1112 Token endToken = token; | 1104 Token endToken = token; |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1405 token = afterName; | 1397 token = afterName; |
| 1406 bool isField; | 1398 bool isField; |
| 1407 while (true) { | 1399 while (true) { |
| 1408 // Loop to allow the listener to rewrite the token stream for | 1400 // Loop to allow the listener to rewrite the token stream for |
| 1409 // error handling. | 1401 // error handling. |
| 1410 final String value = token.stringValue; | 1402 final String value = token.stringValue; |
| 1411 if ((identical(value, '(')) || | 1403 if ((identical(value, '(')) || |
| 1412 (identical(value, '.')) || | 1404 (identical(value, '.')) || |
| 1413 (identical(value, '{')) || | 1405 (identical(value, '{')) || |
| 1414 (identical(value, '=>')) || | 1406 (identical(value, '=>')) || |
| 1415 (enableGenericMethodSyntax && identical(value, '<'))) { | 1407 (identical(value, '<'))) { |
| 1416 isField = false; | 1408 isField = false; |
| 1417 break; | 1409 break; |
| 1418 } else if (identical(value, ';')) { | 1410 } else if (identical(value, ';')) { |
| 1419 if (getOrSet != null) { | 1411 if (getOrSet != null) { |
| 1420 // If we found a "get" keyword, this must be an abstract | 1412 // If we found a "get" keyword, this must be an abstract |
| 1421 // getter. | 1413 // getter. |
| 1422 isField = (!identical(getOrSet.stringValue, 'get')); | 1414 isField = (!identical(getOrSet.stringValue, 'get')); |
| 1423 // TODO(ahe): This feels like a hack. | 1415 // TODO(ahe): This feels like a hack. |
| 1424 } else { | 1416 } else { |
| 1425 isField = true; | 1417 isField = true; |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1500 token = parseOperatorName(name); | 1492 token = parseOperatorName(name); |
| 1501 if (staticModifier != null) { | 1493 if (staticModifier != null) { |
| 1502 listener.reportError(staticModifier, MessageKind.EXTRANEOUS_MODIFIER, | 1494 listener.reportError(staticModifier, MessageKind.EXTRANEOUS_MODIFIER, |
| 1503 {'modifier': staticModifier}); | 1495 {'modifier': staticModifier}); |
| 1504 } | 1496 } |
| 1505 } else { | 1497 } else { |
| 1506 token = parseIdentifier(name); | 1498 token = parseIdentifier(name); |
| 1507 } | 1499 } |
| 1508 | 1500 |
| 1509 token = parseQualifiedRestOpt(token); | 1501 token = parseQualifiedRestOpt(token); |
| 1510 if (enableGenericMethodSyntax && getOrSet == null) { | 1502 if (getOrSet == null) { |
| 1511 token = parseTypeVariablesOpt(token); | 1503 token = parseTypeVariablesOpt(token); |
| 1512 } else { | 1504 } else { |
| 1513 listener.handleNoTypeVariables(token); | 1505 listener.handleNoTypeVariables(token); |
| 1514 } | 1506 } |
| 1515 token = parseFormalParametersOpt(token); | 1507 token = parseFormalParametersOpt(token); |
| 1516 token = parseInitializersOpt(token); | 1508 token = parseInitializersOpt(token); |
| 1517 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; | 1509 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; |
| 1518 token = parseAsyncModifier(token); | 1510 token = parseAsyncModifier(token); |
| 1519 if (optional('=', token)) { | 1511 if (optional('=', token)) { |
| 1520 token = parseRedirectingFactoryBody(token); | 1512 token = parseRedirectingFactoryBody(token); |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 } | 1583 } |
| 1592 listener.beginFunctionName(token); | 1584 listener.beginFunctionName(token); |
| 1593 if (optional('operator', token)) { | 1585 if (optional('operator', token)) { |
| 1594 token = parseOperatorName(token); | 1586 token = parseOperatorName(token); |
| 1595 } else { | 1587 } else { |
| 1596 token = parseIdentifier(token); | 1588 token = parseIdentifier(token); |
| 1597 } | 1589 } |
| 1598 } | 1590 } |
| 1599 token = parseQualifiedRestOpt(token); | 1591 token = parseQualifiedRestOpt(token); |
| 1600 listener.endFunctionName(token); | 1592 listener.endFunctionName(token); |
| 1601 if (enableGenericMethodSyntax && getOrSet == null) { | 1593 if (getOrSet == null) { |
| 1602 token = parseTypeVariablesOpt(token); | 1594 token = parseTypeVariablesOpt(token); |
| 1603 } else { | 1595 } else { |
| 1604 listener.handleNoTypeVariables(token); | 1596 listener.handleNoTypeVariables(token); |
| 1605 } | 1597 } |
| 1606 token = parseFormalParametersOpt(token); | 1598 token = parseFormalParametersOpt(token); |
| 1607 token = parseInitializersOpt(token); | 1599 token = parseInitializersOpt(token); |
| 1608 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; | 1600 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; |
| 1609 token = parseAsyncModifier(token); | 1601 token = parseAsyncModifier(token); |
| 1610 if (optional('=', token)) { | 1602 if (optional('=', token)) { |
| 1611 token = parseRedirectingFactoryBody(token); | 1603 token = parseRedirectingFactoryBody(token); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1636 return token; | 1628 return token; |
| 1637 } | 1629 } |
| 1638 | 1630 |
| 1639 Token parseFunctionExpression(Token token) { | 1631 Token parseFunctionExpression(Token token) { |
| 1640 listener.beginFunction(token); | 1632 listener.beginFunction(token); |
| 1641 listener.handleModifiers(0); | 1633 listener.handleModifiers(0); |
| 1642 token = parseReturnTypeOpt(token); | 1634 token = parseReturnTypeOpt(token); |
| 1643 listener.beginFunctionName(token); | 1635 listener.beginFunctionName(token); |
| 1644 token = parseIdentifier(token); | 1636 token = parseIdentifier(token); |
| 1645 listener.endFunctionName(token); | 1637 listener.endFunctionName(token); |
| 1646 if (enableGenericMethodSyntax) { | 1638 token = parseTypeVariablesOpt(token); |
| 1647 token = parseTypeVariablesOpt(token); | |
| 1648 } else { | |
| 1649 listener.handleNoTypeVariables(token); | |
| 1650 } | |
| 1651 token = parseFormalParameters(token); | 1639 token = parseFormalParameters(token); |
| 1652 listener.handleNoInitializers(); | 1640 listener.handleNoInitializers(); |
| 1653 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; | 1641 bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled; |
| 1654 token = parseAsyncModifier(token); | 1642 token = parseAsyncModifier(token); |
| 1655 bool isBlock = optional('{', token); | 1643 bool isBlock = optional('{', token); |
| 1656 token = parseFunctionBody(token, true, false); | 1644 token = parseFunctionBody(token, true, false); |
| 1657 asyncAwaitKeywordsEnabled = previousAsyncAwaitKeywordsEnabled; | 1645 asyncAwaitKeywordsEnabled = previousAsyncAwaitKeywordsEnabled; |
| 1658 listener.endFunction(null, token); | 1646 listener.endFunction(null, token); |
| 1659 return isBlock ? token.next : token; | 1647 return isBlock ? token.next : token; |
| 1660 } | 1648 } |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1872 // TODO(eernst): Check for NPE as described in issue 26252. | 1860 // TODO(eernst): Check for NPE as described in issue 26252. |
| 1873 Token afterParens = endParen.next; | 1861 Token afterParens = endParen.next; |
| 1874 if (optional('{', afterParens) || | 1862 if (optional('{', afterParens) || |
| 1875 optional('=>', afterParens) || | 1863 optional('=>', afterParens) || |
| 1876 optional('async', afterParens) || | 1864 optional('async', afterParens) || |
| 1877 optional('sync', afterParens)) { | 1865 optional('sync', afterParens)) { |
| 1878 // We are looking at "type identifier '(' ... ')'" followed | 1866 // We are looking at "type identifier '(' ... ')'" followed |
| 1879 // by '{', '=>', 'async', or 'sync'. | 1867 // by '{', '=>', 'async', or 'sync'. |
| 1880 return parseFunctionDeclaration(token); | 1868 return parseFunctionDeclaration(token); |
| 1881 } | 1869 } |
| 1882 } else if (enableGenericMethodSyntax && | 1870 } else if (identical(afterIdKind, LT_TOKEN)) { |
| 1883 identical(afterIdKind, LT_TOKEN)) { | |
| 1884 // We are looking at "type identifier '<'". | 1871 // We are looking at "type identifier '<'". |
| 1885 BeginGroupToken beginAngle = afterId; | 1872 BeginGroupToken beginAngle = afterId; |
| 1886 Token endAngle = beginAngle.endGroup; | 1873 Token endAngle = beginAngle.endGroup; |
| 1887 if (endAngle != null && | 1874 if (endAngle != null && |
| 1888 identical(endAngle.next.kind, OPEN_PAREN_TOKEN)) { | 1875 identical(endAngle.next.kind, OPEN_PAREN_TOKEN)) { |
| 1889 BeginGroupToken beginParen = endAngle.next; | 1876 BeginGroupToken beginParen = endAngle.next; |
| 1890 Token endParen = beginParen.endGroup; | 1877 Token endParen = beginParen.endGroup; |
| 1891 if (endParen != null) { | 1878 if (endParen != null) { |
| 1892 Token afterParens = endParen.next; | 1879 Token afterParens = endParen.next; |
| 1893 if (optional('{', afterParens) || | 1880 if (optional('{', afterParens) || |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1908 } else if (optional('(', token.next)) { | 1895 } else if (optional('(', token.next)) { |
| 1909 BeginGroupToken begin = token.next; | 1896 BeginGroupToken begin = token.next; |
| 1910 // TODO(eernst): Check for NPE as described in issue 26252. | 1897 // TODO(eernst): Check for NPE as described in issue 26252. |
| 1911 String afterParens = begin.endGroup.next.stringValue; | 1898 String afterParens = begin.endGroup.next.stringValue; |
| 1912 if (identical(afterParens, '{') || | 1899 if (identical(afterParens, '{') || |
| 1913 identical(afterParens, '=>') || | 1900 identical(afterParens, '=>') || |
| 1914 identical(afterParens, 'async') || | 1901 identical(afterParens, 'async') || |
| 1915 identical(afterParens, 'sync')) { | 1902 identical(afterParens, 'sync')) { |
| 1916 return parseFunctionDeclaration(token); | 1903 return parseFunctionDeclaration(token); |
| 1917 } | 1904 } |
| 1918 } else if (enableGenericMethodSyntax && optional('<', token.next)) { | 1905 } else if (optional('<', token.next)) { |
| 1919 BeginGroupToken beginAngle = token.next; | 1906 BeginGroupToken beginAngle = token.next; |
| 1920 Token endAngle = beginAngle.endGroup; | 1907 Token endAngle = beginAngle.endGroup; |
| 1921 if (endAngle != null && | 1908 if (endAngle != null && |
| 1922 identical(endAngle.next.kind, OPEN_PAREN_TOKEN)) { | 1909 identical(endAngle.next.kind, OPEN_PAREN_TOKEN)) { |
| 1923 BeginGroupToken beginParen = endAngle.next; | 1910 BeginGroupToken beginParen = endAngle.next; |
| 1924 Token endParen = beginParen.endGroup; | 1911 Token endParen = beginParen.endGroup; |
| 1925 if (endParen != null) { | 1912 if (endParen != null) { |
| 1926 String afterParens = endParen.next.stringValue; | 1913 String afterParens = endParen.next.stringValue; |
| 1927 if (identical(afterParens, '{') || | 1914 if (identical(afterParens, '{') || |
| 1928 identical(afterParens, '=>') || | 1915 identical(afterParens, '=>') || |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2353 /// Where | 2340 /// Where |
| 2354 /// genericListLiteral ::= typeArguments '[' (expressionList ','?)? ']' | 2341 /// genericListLiteral ::= typeArguments '[' (expressionList ','?)? ']' |
| 2355 /// genericMapLiteral ::= | 2342 /// genericMapLiteral ::= |
| 2356 /// typeArguments '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}' | 2343 /// typeArguments '{' (mapLiteralEntry (',' mapLiteralEntry)* ','?)? '}' |
| 2357 /// genericFunctionLiteral ::= | 2344 /// genericFunctionLiteral ::= |
| 2358 /// typeParameters formalParameterList functionBody | 2345 /// typeParameters formalParameterList functionBody |
| 2359 /// Provide token for [constKeyword] if preceded by 'const', null if not. | 2346 /// Provide token for [constKeyword] if preceded by 'const', null if not. |
| 2360 Token parseLiteralListOrMapOrFunction(Token token, Token constKeyword) { | 2347 Token parseLiteralListOrMapOrFunction(Token token, Token constKeyword) { |
| 2361 assert(optional('<', token)); | 2348 assert(optional('<', token)); |
| 2362 BeginGroupToken begin = token; | 2349 BeginGroupToken begin = token; |
| 2363 if (enableGenericMethodSyntax && | 2350 if (constKeyword == null && |
| 2364 constKeyword == null && | |
| 2365 begin.endGroup != null && | 2351 begin.endGroup != null && |
| 2366 identical(begin.endGroup.next.kind, OPEN_PAREN_TOKEN)) { | 2352 identical(begin.endGroup.next.kind, OPEN_PAREN_TOKEN)) { |
| 2367 token = parseTypeVariablesOpt(token); | 2353 token = parseTypeVariablesOpt(token); |
| 2368 return parseLiteralFunctionSuffix(token); | 2354 return parseLiteralFunctionSuffix(token); |
| 2369 } else { | 2355 } else { |
| 2370 token = parseTypeArgumentsOpt(token); | 2356 token = parseTypeArgumentsOpt(token); |
| 2371 if (optional('{', token)) { | 2357 if (optional('{', token)) { |
| 2372 return parseLiteralMapSuffix(token, constKeyword); | 2358 return parseLiteralMapSuffix(token, constKeyword); |
| 2373 } else if ((optional('[', token)) || (optional('[]', token))) { | 2359 } else if ((optional('[', token)) || (optional('[]', token))) { |
| 2374 return parseLiteralListSuffix(token, constKeyword); | 2360 return parseLiteralListSuffix(token, constKeyword); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 2397 isFunctionDeclaration(peek.next)) { | 2383 isFunctionDeclaration(peek.next)) { |
| 2398 return parseFunctionExpression(token); | 2384 return parseFunctionExpression(token); |
| 2399 } else if (isFunctionDeclaration(token.next)) { | 2385 } else if (isFunctionDeclaration(token.next)) { |
| 2400 return parseFunctionExpression(token); | 2386 return parseFunctionExpression(token); |
| 2401 } else { | 2387 } else { |
| 2402 return parseSend(token); | 2388 return parseSend(token); |
| 2403 } | 2389 } |
| 2404 } | 2390 } |
| 2405 | 2391 |
| 2406 bool isFunctionDeclaration(Token token) { | 2392 bool isFunctionDeclaration(Token token) { |
| 2407 if (enableGenericMethodSyntax && optional('<', token)) { | 2393 if (optional('<', token)) { |
| 2408 BeginGroupToken begin = token; | 2394 BeginGroupToken begin = token; |
| 2409 if (begin.endGroup == null) return false; | 2395 if (begin.endGroup == null) return false; |
| 2410 token = begin.endGroup.next; | 2396 token = begin.endGroup.next; |
| 2411 } | 2397 } |
| 2412 if (optional('(', token)) { | 2398 if (optional('(', token)) { |
| 2413 BeginGroupToken begin = token; | 2399 BeginGroupToken begin = token; |
| 2414 // TODO(eernst): Check for NPE as described in issue 26252. | 2400 // TODO(eernst): Check for NPE as described in issue 26252. |
| 2415 String afterParens = begin.endGroup.next.stringValue; | 2401 String afterParens = begin.endGroup.next.stringValue; |
| 2416 if (identical(afterParens, '{') || | 2402 if (identical(afterParens, '{') || |
| 2417 identical(afterParens, '=>') || | 2403 identical(afterParens, '=>') || |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2546 } | 2532 } |
| 2547 | 2533 |
| 2548 Token parseLiteralNull(Token token) { | 2534 Token parseLiteralNull(Token token) { |
| 2549 listener.handleLiteralNull(token); | 2535 listener.handleLiteralNull(token); |
| 2550 return token.next; | 2536 return token.next; |
| 2551 } | 2537 } |
| 2552 | 2538 |
| 2553 Token parseSend(Token token) { | 2539 Token parseSend(Token token) { |
| 2554 listener.beginSend(token); | 2540 listener.beginSend(token); |
| 2555 token = parseIdentifier(token); | 2541 token = parseIdentifier(token); |
| 2556 if (enableGenericMethodSyntax && isValidMethodTypeArguments(token)) { | 2542 if (isValidMethodTypeArguments(token)) { |
| 2557 token = parseTypeArgumentsOpt(token); | 2543 token = parseTypeArgumentsOpt(token); |
| 2558 } else { | 2544 } else { |
| 2559 listener.handleNoTypeArguments(token); | 2545 listener.handleNoTypeArguments(token); |
| 2560 } | 2546 } |
| 2561 token = parseArgumentsOpt(token); | 2547 token = parseArgumentsOpt(token); |
| 2562 listener.endSend(token); | 2548 listener.endSend(token); |
| 2563 return token; | 2549 return token; |
| 2564 } | 2550 } |
| 2565 | 2551 |
| 2566 Token parseArgumentsOpt(Token token) { | 2552 Token parseArgumentsOpt(Token token) { |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3005 } | 2991 } |
| 3006 listener.handleContinueStatement(hasTarget, continueKeyword, token); | 2992 listener.handleContinueStatement(hasTarget, continueKeyword, token); |
| 3007 return expectSemicolon(token); | 2993 return expectSemicolon(token); |
| 3008 } | 2994 } |
| 3009 | 2995 |
| 3010 Token parseEmptyStatement(Token token) { | 2996 Token parseEmptyStatement(Token token) { |
| 3011 listener.handleEmptyStatement(token); | 2997 listener.handleEmptyStatement(token); |
| 3012 return expectSemicolon(token); | 2998 return expectSemicolon(token); |
| 3013 } | 2999 } |
| 3014 } | 3000 } |
| OLD | NEW |