| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library engine.parser; | 8 library engine.parser; |
| 9 | 9 |
| 10 import 'dart:collection'; | 10 import 'dart:collection'; |
| (...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1769 arguments.add(argument); | 1769 arguments.add(argument); |
| 1770 bool foundNamedArgument = argument is NamedExpression; | 1770 bool foundNamedArgument = argument is NamedExpression; |
| 1771 bool generatedError = false; | 1771 bool generatedError = false; |
| 1772 while (_optional(TokenType.COMMA)) { | 1772 while (_optional(TokenType.COMMA)) { |
| 1773 argument = parseArgument(); | 1773 argument = parseArgument(); |
| 1774 arguments.add(argument); | 1774 arguments.add(argument); |
| 1775 if (foundNamedArgument) { | 1775 if (foundNamedArgument) { |
| 1776 bool blankArgument = argument is SimpleIdentifier && (argument as Simp
leIdentifier).name.isEmpty; | 1776 bool blankArgument = argument is SimpleIdentifier && (argument as Simp
leIdentifier).name.isEmpty; |
| 1777 if (!generatedError && !(argument is NamedExpression && !blankArgument
)) { | 1777 if (!generatedError && !(argument is NamedExpression && !blankArgument
)) { |
| 1778 // Report the error, once, but allow the arguments to be in any orde
r in the AST. | 1778 // Report the error, once, but allow the arguments to be in any orde
r in the AST. |
| 1779 _reportErrorForCurrentToken(ParserErrorCode.POSITIONAL_AFTER_NAMED_A
RGUMENT, []); | 1779 _reportErrorForCurrentToken(ParserErrorCode.POSITIONAL_AFTER_NAMED_A
RGUMENT); |
| 1780 generatedError = true; | 1780 generatedError = true; |
| 1781 } | 1781 } |
| 1782 } else if (argument is NamedExpression) { | 1782 } else if (argument is NamedExpression) { |
| 1783 foundNamedArgument = true; | 1783 foundNamedArgument = true; |
| 1784 } | 1784 } |
| 1785 } | 1785 } |
| 1786 // TODO(brianwilkerson) Recovery: Look at the left parenthesis to see whet
her there is a | 1786 // TODO(brianwilkerson) Recovery: Look at the left parenthesis to see whet
her there is a |
| 1787 // matching right parenthesis. If there is, then we're more likely missing
a comma and should | 1787 // matching right parenthesis. If there is, then we're more likely missing
a comma and should |
| 1788 // go back to parsing arguments. | 1788 // go back to parsing arguments. |
| 1789 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 1789 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1883 return _parseMethodDeclarationAfterReturnType(commentAndMetadata, modifi
ers.externalKeyword, modifiers.staticKeyword, returnType); | 1883 return _parseMethodDeclarationAfterReturnType(commentAndMetadata, modifi
ers.externalKeyword, modifiers.staticKeyword, returnType); |
| 1884 } else { | 1884 } else { |
| 1885 // | 1885 // |
| 1886 // We have found an error of some kind. Try to recover. | 1886 // We have found an error of some kind. Try to recover. |
| 1887 // | 1887 // |
| 1888 if (_matchesIdentifier()) { | 1888 if (_matchesIdentifier()) { |
| 1889 if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMIC
OLON])) { | 1889 if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMIC
OLON])) { |
| 1890 // | 1890 // |
| 1891 // We appear to have a variable declaration with a type of "void". | 1891 // We appear to have a variable declaration with a type of "void". |
| 1892 // | 1892 // |
| 1893 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []); | 1893 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 1894 return _parseInitializedIdentifierList(commentAndMetadata, modifiers
.staticKeyword, _validateModifiersForField(modifiers), returnType); | 1894 return _parseInitializedIdentifierList(commentAndMetadata, modifiers
.staticKeyword, _validateModifiersForField(modifiers), returnType); |
| 1895 } | 1895 } |
| 1896 } | 1896 } |
| 1897 if (_isOperator(_currentToken)) { | 1897 if (_isOperator(_currentToken)) { |
| 1898 // | 1898 // |
| 1899 // We appear to have found an operator declaration without the 'operat
or' keyword. | 1899 // We appear to have found an operator declaration without the 'operat
or' keyword. |
| 1900 // | 1900 // |
| 1901 _validateModifiersForOperator(modifiers); | 1901 _validateModifiersForOperator(modifiers); |
| 1902 return _parseOperator(commentAndMetadata, modifiers.externalKeyword, r
eturnType); | 1902 return _parseOperator(commentAndMetadata, modifiers.externalKeyword, r
eturnType); |
| 1903 } | 1903 } |
| 1904 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken,
[]); | 1904 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken)
; |
| 1905 return null; | 1905 return null; |
| 1906 } | 1906 } |
| 1907 } else if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek()))
{ | 1907 } else if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek()))
{ |
| 1908 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1908 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1909 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, null); | 1909 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, null); |
| 1910 } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek()))
{ | 1910 } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek()))
{ |
| 1911 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1911 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1912 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, null); | 1912 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, null); |
| 1913 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 1913 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 1914 _validateModifiersForOperator(modifiers); | 1914 _validateModifiersForOperator(modifiers); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1925 if (keyword == null) { | 1925 if (keyword == null) { |
| 1926 keyword = modifiers.finalKeyword; | 1926 keyword = modifiers.finalKeyword; |
| 1927 } | 1927 } |
| 1928 if (keyword == null) { | 1928 if (keyword == null) { |
| 1929 keyword = modifiers.constKeyword; | 1929 keyword = modifiers.constKeyword; |
| 1930 } | 1930 } |
| 1931 if (keyword != null) { | 1931 if (keyword != null) { |
| 1932 // | 1932 // |
| 1933 // We appear to have found an incomplete field declaration. | 1933 // We appear to have found an incomplete field declaration. |
| 1934 // | 1934 // |
| 1935 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 1935 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 1936 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 1936 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 1937 variables.add(new VariableDeclaration(null, null, _createSyntheticIdenti
fier(), null, null)); | 1937 variables.add(new VariableDeclaration(null, null, _createSyntheticIdenti
fier(), null, null)); |
| 1938 return new FieldDeclaration(commentAndMetadata.comment, commentAndMetada
ta.metadata, null, new VariableDeclarationList(null, null, keyword, null, variab
les), _expectSemicolon()); | 1938 return new FieldDeclaration(commentAndMetadata.comment, commentAndMetada
ta.metadata, null, new VariableDeclarationList(null, null, keyword, null, variab
les), _expectSemicolon()); |
| 1939 } | 1939 } |
| 1940 _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken,
[]); | 1940 _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken)
; |
| 1941 if (commentAndMetadata.comment != null || !commentAndMetadata.metadata.isE
mpty) { | 1941 if (commentAndMetadata.comment != null || !commentAndMetadata.metadata.isE
mpty) { |
| 1942 // | 1942 // |
| 1943 // We appear to have found an incomplete declaration at the end of the c
lass. At this point | 1943 // We appear to have found an incomplete declaration at the end of the c
lass. At this point |
| 1944 // it consists of a metadata, which we don't want to loose, so we'll tre
at it as a method | 1944 // it consists of a metadata, which we don't want to loose, so we'll tre
at it as a method |
| 1945 // declaration with a missing name, parameters and empty body. | 1945 // declaration with a missing name, parameters and empty body. |
| 1946 // | 1946 // |
| 1947 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetad
ata.metadata, null, null, null, null, null, _createSyntheticIdentifier(), new Fo
rmalParameterList(null, new List<FormalParameter>(), null, null, null), new Empt
yFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); | 1947 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetad
ata.metadata, null, null, null, null, null, _createSyntheticIdentifier(), new Fo
rmalParameterList(null, new List<FormalParameter>(), null, null, null), new Empt
yFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); |
| 1948 } | 1948 } |
| 1949 return null; | 1949 return null; |
| 1950 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatchesIdentifi
er(_peekAt(2)) && _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { | 1950 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatchesIdentifi
er(_peekAt(2)) && _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { |
| 1951 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, _v
alidateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimple
Identifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList()); | 1951 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, _v
alidateModifiersForConstructor(modifiers), modifiers.factoryKeyword, parseSimple
Identifier(), andAdvance, parseSimpleIdentifier(), parseFormalParameterList()); |
| 1952 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 1952 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 1953 SimpleIdentifier methodName = parseSimpleIdentifier(); | 1953 SimpleIdentifier methodName = parseSimpleIdentifier(); |
| 1954 FormalParameterList parameters = parseFormalParameterList(); | 1954 FormalParameterList parameters = parseFormalParameterList(); |
| 1955 if (_matches(TokenType.COLON) || modifiers.factoryKeyword != null || metho
dName.name == className) { | 1955 if (_matches(TokenType.COLON) || modifiers.factoryKeyword != null || metho
dName.name == className) { |
| 1956 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
_validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodNam
e, null, null, parameters); | 1956 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
_validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodNam
e, null, null, parameters); |
| 1957 } | 1957 } |
| 1958 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1958 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1959 _validateFormalParameterList(parameters); | 1959 _validateFormalParameterList(parameters); |
| 1960 return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifier
s.externalKeyword, modifiers.staticKeyword, null, methodName, parameters); | 1960 return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifier
s.externalKeyword, modifiers.staticKeyword, null, methodName, parameters); |
| 1961 } else if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMI
COLON])) { | 1961 } else if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMI
COLON])) { |
| 1962 if (modifiers.constKeyword == null && modifiers.finalKeyword == null && mo
difiers.varKeyword == null) { | 1962 if (modifiers.constKeyword == null && modifiers.finalKeyword == null && mo
difiers.varKeyword == null) { |
| 1963 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_T
YPE, []); | 1963 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_T
YPE); |
| 1964 } | 1964 } |
| 1965 return _parseInitializedIdentifierList(commentAndMetadata, modifiers.stati
cKeyword, _validateModifiersForField(modifiers), null); | 1965 return _parseInitializedIdentifierList(commentAndMetadata, modifiers.stati
cKeyword, _validateModifiersForField(modifiers), null); |
| 1966 } | 1966 } |
| 1967 TypeName type = parseTypeName(); | 1967 TypeName type = parseTypeName(); |
| 1968 if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) { | 1968 if (_matchesKeyword(Keyword.GET) && _tokenMatchesIdentifier(_peek())) { |
| 1969 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1969 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1970 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, type); | 1970 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, type); |
| 1971 } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek()))
{ | 1971 } else if (_matchesKeyword(Keyword.SET) && _tokenMatchesIdentifier(_peek()))
{ |
| 1972 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1972 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1973 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, type); | 1973 return _parseSetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, type); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1988 // We appear to have found an operator declaration without the 'operator
' keyword. | 1988 // We appear to have found an operator declaration without the 'operator
' keyword. |
| 1989 // | 1989 // |
| 1990 _validateModifiersForOperator(modifiers); | 1990 _validateModifiersForOperator(modifiers); |
| 1991 return _parseOperator(commentAndMetadata, modifiers.externalKeyword, typ
e); | 1991 return _parseOperator(commentAndMetadata, modifiers.externalKeyword, typ
e); |
| 1992 } | 1992 } |
| 1993 // | 1993 // |
| 1994 // We appear to have found an incomplete declaration before another declar
ation. | 1994 // We appear to have found an incomplete declaration before another declar
ation. |
| 1995 // At this point it consists of a type name, so we'll treat it as a field
declaration | 1995 // At this point it consists of a type name, so we'll treat it as a field
declaration |
| 1996 // with a missing field name and semicolon. | 1996 // with a missing field name and semicolon. |
| 1997 // | 1997 // |
| 1998 _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken,
[]); | 1998 _reportErrorForToken(ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken)
; |
| 1999 try { | 1999 try { |
| 2000 _lockErrorListener(); | 2000 _lockErrorListener(); |
| 2001 return _parseInitializedIdentifierList(commentAndMetadata, modifiers.sta
ticKeyword, _validateModifiersForField(modifiers), type); | 2001 return _parseInitializedIdentifierList(commentAndMetadata, modifiers.sta
ticKeyword, _validateModifiersForField(modifiers), type); |
| 2002 } finally { | 2002 } finally { |
| 2003 _unlockErrorListener(); | 2003 _unlockErrorListener(); |
| 2004 } | 2004 } |
| 2005 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 2005 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 2006 SimpleIdentifier methodName = parseSimpleIdentifier(); | 2006 SimpleIdentifier methodName = parseSimpleIdentifier(); |
| 2007 FormalParameterList parameters = parseFormalParameterList(); | 2007 FormalParameterList parameters = parseFormalParameterList(); |
| 2008 if (methodName.name == className) { | 2008 if (methodName.name == className) { |
| 2009 _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type,
[]); | 2009 _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type); |
| 2010 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
_validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodNam
e, null, null, parameters); | 2010 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword,
_validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, methodNam
e, null, null, parameters); |
| 2011 } | 2011 } |
| 2012 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2012 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2013 _validateFormalParameterList(parameters); | 2013 _validateFormalParameterList(parameters); |
| 2014 return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifier
s.externalKeyword, modifiers.staticKeyword, type, methodName, parameters); | 2014 return _parseMethodDeclarationAfterParameters(commentAndMetadata, modifier
s.externalKeyword, modifiers.staticKeyword, type, methodName, parameters); |
| 2015 } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) { | 2015 } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) { |
| 2016 // We have found "TypeName identifier {", and are guessing that this is a
getter without the | 2016 // We have found "TypeName identifier {", and are guessing that this is a
getter without the |
| 2017 // keyword 'get'. | 2017 // keyword 'get'. |
| 2018 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2018 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 2019 _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET, []); | 2019 _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET); |
| 2020 _currentToken = _injectToken(new Parser_SyntheticKeywordToken(Keyword.GET,
_currentToken.offset)); | 2020 _currentToken = _injectToken(new Parser_SyntheticKeywordToken(Keyword.GET,
_currentToken.offset)); |
| 2021 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, type); | 2021 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, modifie
rs.staticKeyword, type); |
| 2022 } | 2022 } |
| 2023 return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticK
eyword, _validateModifiersForField(modifiers), type); | 2023 return _parseInitializedIdentifierList(commentAndMetadata, modifiers.staticK
eyword, _validateModifiersForField(modifiers), type); |
| 2024 } | 2024 } |
| 2025 | 2025 |
| 2026 /** | 2026 /** |
| 2027 * Parse a compilation unit. | 2027 * Parse a compilation unit. |
| 2028 * | 2028 * |
| 2029 * Specified: | 2029 * Specified: |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2060 bool partDirectiveFound = false; | 2060 bool partDirectiveFound = false; |
| 2061 bool directiveFoundAfterDeclaration = false; | 2061 bool directiveFoundAfterDeclaration = false; |
| 2062 List<Directive> directives = new List<Directive>(); | 2062 List<Directive> directives = new List<Directive>(); |
| 2063 List<CompilationUnitMember> declarations = new List<CompilationUnitMember>()
; | 2063 List<CompilationUnitMember> declarations = new List<CompilationUnitMember>()
; |
| 2064 Token memberStart = _currentToken; | 2064 Token memberStart = _currentToken; |
| 2065 while (!_matches(TokenType.EOF)) { | 2065 while (!_matches(TokenType.EOF)) { |
| 2066 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); | 2066 CommentAndMetadata commentAndMetadata = _parseCommentAndMetadata(); |
| 2067 if ((_matchesKeyword(Keyword.IMPORT) || _matchesKeyword(Keyword.EXPORT) ||
_matchesKeyword(Keyword.LIBRARY) || _matchesKeyword(Keyword.PART)) && !_tokenMa
tches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT) && !_t
okenMatches(_peek(), TokenType.OPEN_PAREN)) { | 2067 if ((_matchesKeyword(Keyword.IMPORT) || _matchesKeyword(Keyword.EXPORT) ||
_matchesKeyword(Keyword.LIBRARY) || _matchesKeyword(Keyword.PART)) && !_tokenMa
tches(_peek(), TokenType.PERIOD) && !_tokenMatches(_peek(), TokenType.LT) && !_t
okenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 2068 Directive directive = _parseDirective(commentAndMetadata); | 2068 Directive directive = _parseDirective(commentAndMetadata); |
| 2069 if (declarations.length > 0 && !directiveFoundAfterDeclaration) { | 2069 if (declarations.length > 0 && !directiveFoundAfterDeclaration) { |
| 2070 _reportErrorForCurrentToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATIO
N, []); | 2070 _reportErrorForCurrentToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATIO
N); |
| 2071 directiveFoundAfterDeclaration = true; | 2071 directiveFoundAfterDeclaration = true; |
| 2072 } | 2072 } |
| 2073 if (directive is LibraryDirective) { | 2073 if (directive is LibraryDirective) { |
| 2074 if (libraryDirectiveFound) { | 2074 if (libraryDirectiveFound) { |
| 2075 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTI
VES, []); | 2075 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_LIBRARY_DIRECTI
VES); |
| 2076 } else { | 2076 } else { |
| 2077 if (directives.length > 0) { | 2077 if (directives.length > 0) { |
| 2078 _reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
directive.libraryToken, []); | 2078 _reportErrorForToken(ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST,
directive.libraryToken); |
| 2079 } | 2079 } |
| 2080 libraryDirectiveFound = true; | 2080 libraryDirectiveFound = true; |
| 2081 } | 2081 } |
| 2082 } else if (directive is PartDirective) { | 2082 } else if (directive is PartDirective) { |
| 2083 partDirectiveFound = true; | 2083 partDirectiveFound = true; |
| 2084 } else if (partDirectiveFound) { | 2084 } else if (partDirectiveFound) { |
| 2085 if (directive is ExportDirective) { | 2085 if (directive is ExportDirective) { |
| 2086 _reportErrorForToken(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIR
ECTIVE, directive.keyword, []); | 2086 _reportErrorForToken(ParserErrorCode.EXPORT_DIRECTIVE_AFTER_PART_DIR
ECTIVE, directive.keyword); |
| 2087 } else if (directive is ImportDirective) { | 2087 } else if (directive is ImportDirective) { |
| 2088 _reportErrorForToken(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIR
ECTIVE, directive.keyword, []); | 2088 _reportErrorForToken(ParserErrorCode.IMPORT_DIRECTIVE_AFTER_PART_DIR
ECTIVE, directive.keyword); |
| 2089 } | 2089 } |
| 2090 } | 2090 } |
| 2091 if (directive is PartOfDirective) { | 2091 if (directive is PartOfDirective) { |
| 2092 if (partOfDirectiveFound) { | 2092 if (partOfDirectiveFound) { |
| 2093 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_PART_OF_DIRECTI
VES, []); | 2093 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_PART_OF_DIRECTI
VES); |
| 2094 } else { | 2094 } else { |
| 2095 int directiveCount = directives.length; | 2095 int directiveCount = directives.length; |
| 2096 for (int i = 0; i < directiveCount; i++) { | 2096 for (int i = 0; i < directiveCount; i++) { |
| 2097 _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART
, directives[i].keyword, []); | 2097 _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART
, directives[i].keyword); |
| 2098 } | 2098 } |
| 2099 partOfDirectiveFound = true; | 2099 partOfDirectiveFound = true; |
| 2100 } | 2100 } |
| 2101 } else { | 2101 } else { |
| 2102 if (partOfDirectiveFound) { | 2102 if (partOfDirectiveFound) { |
| 2103 _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
directive.keyword, []); | 2103 _reportErrorForToken(ParserErrorCode.NON_PART_OF_DIRECTIVE_IN_PART,
directive.keyword); |
| 2104 } | 2104 } |
| 2105 } | 2105 } |
| 2106 directives.add(directive); | 2106 directives.add(directive); |
| 2107 } else if (_matches(TokenType.SEMICOLON)) { | 2107 } else if (_matches(TokenType.SEMICOLON)) { |
| 2108 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_
currentToken.lexeme]); | 2108 _reportErrorForToken(ParserErrorCode.UNEXPECTED_TOKEN, _currentToken, [_
currentToken.lexeme]); |
| 2109 _advance(); | 2109 _advance(); |
| 2110 } else { | 2110 } else { |
| 2111 CompilationUnitMember member = _parseCompilationUnitMember(commentAndMet
adata); | 2111 CompilationUnitMember member = _parseCompilationUnitMember(commentAndMet
adata); |
| 2112 if (member != null) { | 2112 if (member != null) { |
| 2113 declarations.add(member); | 2113 declarations.add(member); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2313 bool wasOptionalParameter = false; | 2313 bool wasOptionalParameter = false; |
| 2314 Token initialToken = null; | 2314 Token initialToken = null; |
| 2315 do { | 2315 do { |
| 2316 if (firstParameter) { | 2316 if (firstParameter) { |
| 2317 firstParameter = false; | 2317 firstParameter = false; |
| 2318 } else if (!_optional(TokenType.COMMA)) { | 2318 } else if (!_optional(TokenType.COMMA)) { |
| 2319 // TODO(brianwilkerson) The token is wrong, we need to recover from this
case. | 2319 // TODO(brianwilkerson) The token is wrong, we need to recover from this
case. |
| 2320 if (_getEndToken(leftParenthesis) != null) { | 2320 if (_getEndToken(leftParenthesis) != null) { |
| 2321 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType
.COMMA.lexeme]); | 2321 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TOKEN, [TokenType
.COMMA.lexeme]); |
| 2322 } else { | 2322 } else { |
| 2323 _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _cur
rentToken.previous, []); | 2323 _reportErrorForToken(ParserErrorCode.MISSING_CLOSING_PARENTHESIS, _cur
rentToken.previous); |
| 2324 break; | 2324 break; |
| 2325 } | 2325 } |
| 2326 } | 2326 } |
| 2327 initialToken = _currentToken; | 2327 initialToken = _currentToken; |
| 2328 // | 2328 // |
| 2329 // Handle the beginning of parameter groups. | 2329 // Handle the beginning of parameter groups. |
| 2330 // | 2330 // |
| 2331 if (_matches(TokenType.OPEN_SQUARE_BRACKET)) { | 2331 if (_matches(TokenType.OPEN_SQUARE_BRACKET)) { |
| 2332 wasOptionalParameter = true; | 2332 wasOptionalParameter = true; |
| 2333 if (leftSquareBracket != null && !reportedMuliplePositionalGroups) { | 2333 if (leftSquareBracket != null && !reportedMuliplePositionalGroups) { |
| 2334 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_POSITIONAL_PARAME
TER_GROUPS, []); | 2334 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_POSITIONAL_PARAME
TER_GROUPS); |
| 2335 reportedMuliplePositionalGroups = true; | 2335 reportedMuliplePositionalGroups = true; |
| 2336 } | 2336 } |
| 2337 if (leftCurlyBracket != null && !reportedMixedGroups) { | 2337 if (leftCurlyBracket != null && !reportedMixedGroups) { |
| 2338 _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS, []
); | 2338 _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS); |
| 2339 reportedMixedGroups = true; | 2339 reportedMixedGroups = true; |
| 2340 } | 2340 } |
| 2341 leftSquareBracket = andAdvance; | 2341 leftSquareBracket = andAdvance; |
| 2342 currentParameters = positionalParameters; | 2342 currentParameters = positionalParameters; |
| 2343 kind = ParameterKind.POSITIONAL; | 2343 kind = ParameterKind.POSITIONAL; |
| 2344 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 2344 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 2345 wasOptionalParameter = true; | 2345 wasOptionalParameter = true; |
| 2346 if (leftCurlyBracket != null && !reportedMulipleNamedGroups) { | 2346 if (leftCurlyBracket != null && !reportedMulipleNamedGroups) { |
| 2347 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_G
ROUPS, []); | 2347 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_NAMED_PARAMETER_G
ROUPS); |
| 2348 reportedMulipleNamedGroups = true; | 2348 reportedMulipleNamedGroups = true; |
| 2349 } | 2349 } |
| 2350 if (leftSquareBracket != null && !reportedMixedGroups) { | 2350 if (leftSquareBracket != null && !reportedMixedGroups) { |
| 2351 _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS, []
); | 2351 _reportErrorForCurrentToken(ParserErrorCode.MIXED_PARAMETER_GROUPS); |
| 2352 reportedMixedGroups = true; | 2352 reportedMixedGroups = true; |
| 2353 } | 2353 } |
| 2354 leftCurlyBracket = andAdvance; | 2354 leftCurlyBracket = andAdvance; |
| 2355 currentParameters = namedParameters; | 2355 currentParameters = namedParameters; |
| 2356 kind = ParameterKind.NAMED; | 2356 kind = ParameterKind.NAMED; |
| 2357 } | 2357 } |
| 2358 // | 2358 // |
| 2359 // Parse and record the parameter. | 2359 // Parse and record the parameter. |
| 2360 // | 2360 // |
| 2361 FormalParameter parameter = _parseFormalParameter(kind); | 2361 FormalParameter parameter = _parseFormalParameter(kind); |
| 2362 parameters.add(parameter); | 2362 parameters.add(parameter); |
| 2363 currentParameters.add(parameter); | 2363 currentParameters.add(parameter); |
| 2364 if (kind == ParameterKind.REQUIRED && wasOptionalParameter) { | 2364 if (kind == ParameterKind.REQUIRED && wasOptionalParameter) { |
| 2365 _reportErrorForNode(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, p
arameter, []); | 2365 _reportErrorForNode(ParserErrorCode.NORMAL_BEFORE_OPTIONAL_PARAMETERS, p
arameter); |
| 2366 } | 2366 } |
| 2367 // | 2367 // |
| 2368 // Handle the end of parameter groups. | 2368 // Handle the end of parameter groups. |
| 2369 // | 2369 // |
| 2370 // TODO(brianwilkerson) Improve the detection and reporting of missing and
mismatched delimiters. | 2370 // TODO(brianwilkerson) Improve the detection and reporting of missing and
mismatched delimiters. |
| 2371 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { | 2371 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { |
| 2372 rightSquareBracket = andAdvance; | 2372 rightSquareBracket = andAdvance; |
| 2373 currentParameters = normalParameters; | 2373 currentParameters = normalParameters; |
| 2374 if (leftSquareBracket == null) { | 2374 if (leftSquareBracket == null) { |
| 2375 if (leftCurlyBracket != null) { | 2375 if (leftCurlyBracket != null) { |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2555 Token period = null; | 2555 Token period = null; |
| 2556 if (_matchesKeyword(Keyword.THIS)) { | 2556 if (_matchesKeyword(Keyword.THIS)) { |
| 2557 thisKeyword = andAdvance; | 2557 thisKeyword = andAdvance; |
| 2558 period = _expect(TokenType.PERIOD); | 2558 period = _expect(TokenType.PERIOD); |
| 2559 } | 2559 } |
| 2560 SimpleIdentifier identifier = parseSimpleIdentifier(); | 2560 SimpleIdentifier identifier = parseSimpleIdentifier(); |
| 2561 if (_matches(TokenType.OPEN_PAREN)) { | 2561 if (_matches(TokenType.OPEN_PAREN)) { |
| 2562 FormalParameterList parameters = parseFormalParameterList(); | 2562 FormalParameterList parameters = parseFormalParameterList(); |
| 2563 if (thisKeyword == null) { | 2563 if (thisKeyword == null) { |
| 2564 if (holder.keyword != null) { | 2564 if (holder.keyword != null) { |
| 2565 _reportErrorForToken(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, hol
der.keyword, []); | 2565 _reportErrorForToken(ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, hol
der.keyword); |
| 2566 } | 2566 } |
| 2567 return new FunctionTypedFormalParameter(commentAndMetadata.comment, comm
entAndMetadata.metadata, holder.type, identifier, parameters); | 2567 return new FunctionTypedFormalParameter(commentAndMetadata.comment, comm
entAndMetadata.metadata, holder.type, identifier, parameters); |
| 2568 } else { | 2568 } else { |
| 2569 return new FieldFormalParameter(commentAndMetadata.comment, commentAndMe
tadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, p
arameters); | 2569 return new FieldFormalParameter(commentAndMetadata.comment, commentAndMe
tadata.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, p
arameters); |
| 2570 } | 2570 } |
| 2571 } | 2571 } |
| 2572 TypeName type = holder.type; | 2572 TypeName type = holder.type; |
| 2573 if (type != null) { | 2573 if (type != null) { |
| 2574 if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) { | 2574 if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) { |
| 2575 _reportErrorForToken(ParserErrorCode.VOID_PARAMETER, type.name.beginToke
n, []); | 2575 _reportErrorForToken(ParserErrorCode.VOID_PARAMETER, type.name.beginToke
n); |
| 2576 } else if (holder.keyword != null && _tokenMatchesKeyword(holder.keyword,
Keyword.VAR)) { | 2576 } else if (holder.keyword != null && _tokenMatchesKeyword(holder.keyword,
Keyword.VAR)) { |
| 2577 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword, []); | 2577 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword); |
| 2578 } | 2578 } |
| 2579 } | 2579 } |
| 2580 if (thisKeyword != null) { | 2580 if (thisKeyword != null) { |
| 2581 return new FieldFormalParameter(commentAndMetadata.comment, commentAndMeta
data.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, nul
l); | 2581 return new FieldFormalParameter(commentAndMetadata.comment, commentAndMeta
data.metadata, holder.keyword, holder.type, thisKeyword, period, identifier, nul
l); |
| 2582 } | 2582 } |
| 2583 return new SimpleFormalParameter(commentAndMetadata.comment, commentAndMetad
ata.metadata, holder.keyword, holder.type, identifier); | 2583 return new SimpleFormalParameter(commentAndMetadata.comment, commentAndMetad
ata.metadata, holder.keyword, holder.type, identifier); |
| 2584 } | 2584 } |
| 2585 | 2585 |
| 2586 /** | 2586 /** |
| 2587 * Parse a prefixed identifier. | 2587 * Parse a prefixed identifier. |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2629 * identifier ::= | 2629 * identifier ::= |
| 2630 * IDENTIFIER | 2630 * IDENTIFIER |
| 2631 * </pre> | 2631 * </pre> |
| 2632 * | 2632 * |
| 2633 * @return the simple identifier that was parsed | 2633 * @return the simple identifier that was parsed |
| 2634 */ | 2634 */ |
| 2635 SimpleIdentifier parseSimpleIdentifier() { | 2635 SimpleIdentifier parseSimpleIdentifier() { |
| 2636 if (_matchesIdentifier()) { | 2636 if (_matchesIdentifier()) { |
| 2637 return new SimpleIdentifier(andAdvance); | 2637 return new SimpleIdentifier(andAdvance); |
| 2638 } | 2638 } |
| 2639 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 2639 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 2640 return _createSyntheticIdentifier(); | 2640 return _createSyntheticIdentifier(); |
| 2641 } | 2641 } |
| 2642 | 2642 |
| 2643 /** | 2643 /** |
| 2644 * Parse a statement. | 2644 * Parse a statement. |
| 2645 * | 2645 * |
| 2646 * <pre> | 2646 * <pre> |
| 2647 * statement ::= | 2647 * statement ::= |
| 2648 * label* nonLabeledStatement | 2648 * label* nonLabeledStatement |
| 2649 * </pre> | 2649 * </pre> |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2677 List<StringLiteral> strings = new List<StringLiteral>(); | 2677 List<StringLiteral> strings = new List<StringLiteral>(); |
| 2678 while (_matches(TokenType.STRING)) { | 2678 while (_matches(TokenType.STRING)) { |
| 2679 Token string = andAdvance; | 2679 Token string = andAdvance; |
| 2680 if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || _matches(TokenT
ype.STRING_INTERPOLATION_IDENTIFIER)) { | 2680 if (_matches(TokenType.STRING_INTERPOLATION_EXPRESSION) || _matches(TokenT
ype.STRING_INTERPOLATION_IDENTIFIER)) { |
| 2681 strings.add(_parseStringInterpolation(string)); | 2681 strings.add(_parseStringInterpolation(string)); |
| 2682 } else { | 2682 } else { |
| 2683 strings.add(new SimpleStringLiteral(string, _computeStringValue(string.l
exeme, true, true))); | 2683 strings.add(new SimpleStringLiteral(string, _computeStringValue(string.l
exeme, true, true))); |
| 2684 } | 2684 } |
| 2685 } | 2685 } |
| 2686 if (strings.length < 1) { | 2686 if (strings.length < 1) { |
| 2687 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL, []); | 2687 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_STRING_LITERAL); |
| 2688 return _createSyntheticStringLiteral(); | 2688 return _createSyntheticStringLiteral(); |
| 2689 } else if (strings.length == 1) { | 2689 } else if (strings.length == 1) { |
| 2690 return strings[0]; | 2690 return strings[0]; |
| 2691 } else { | 2691 } else { |
| 2692 return new AdjacentStrings(strings); | 2692 return new AdjacentStrings(strings); |
| 2693 } | 2693 } |
| 2694 } | 2694 } |
| 2695 | 2695 |
| 2696 /** | 2696 /** |
| 2697 * Parse a list of type arguments. | 2697 * Parse a list of type arguments. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2723 * <pre> | 2723 * <pre> |
| 2724 * type ::= | 2724 * type ::= |
| 2725 * qualified typeArguments? | 2725 * qualified typeArguments? |
| 2726 * </pre> | 2726 * </pre> |
| 2727 * | 2727 * |
| 2728 * @return the type name that was parsed | 2728 * @return the type name that was parsed |
| 2729 */ | 2729 */ |
| 2730 TypeName parseTypeName() { | 2730 TypeName parseTypeName() { |
| 2731 Identifier typeName; | 2731 Identifier typeName; |
| 2732 if (_matchesKeyword(Keyword.VAR)) { | 2732 if (_matchesKeyword(Keyword.VAR)) { |
| 2733 _reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME, []); | 2733 _reportErrorForCurrentToken(ParserErrorCode.VAR_AS_TYPE_NAME); |
| 2734 typeName = new SimpleIdentifier(andAdvance); | 2734 typeName = new SimpleIdentifier(andAdvance); |
| 2735 } else if (_matchesIdentifier()) { | 2735 } else if (_matchesIdentifier()) { |
| 2736 typeName = parsePrefixedIdentifier(); | 2736 typeName = parsePrefixedIdentifier(); |
| 2737 } else { | 2737 } else { |
| 2738 typeName = _createSyntheticIdentifier(); | 2738 typeName = _createSyntheticIdentifier(); |
| 2739 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME, []); | 2739 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_TYPE_NAME); |
| 2740 } | 2740 } |
| 2741 TypeArgumentList typeArguments = null; | 2741 TypeArgumentList typeArguments = null; |
| 2742 if (_matches(TokenType.LT)) { | 2742 if (_matches(TokenType.LT)) { |
| 2743 typeArguments = parseTypeArgumentList(); | 2743 typeArguments = parseTypeArgumentList(); |
| 2744 } | 2744 } |
| 2745 return new TypeName(typeName, typeArguments); | 2745 return new TypeName(typeName, typeArguments); |
| 2746 } | 2746 } |
| 2747 | 2747 |
| 2748 /** | 2748 /** |
| 2749 * Parse a type parameter. | 2749 * Parse a type parameter. |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2984 * | 2984 * |
| 2985 * assignableSelector ::= | 2985 * assignableSelector ::= |
| 2986 * '[' expression ']' | 2986 * '[' expression ']' |
| 2987 * | '.' identifier | 2987 * | '.' identifier |
| 2988 * </pre> | 2988 * </pre> |
| 2989 * | 2989 * |
| 2990 * @param expression the expression being checked | 2990 * @param expression the expression being checked |
| 2991 */ | 2991 */ |
| 2992 void _ensureAssignable(Expression expression) { | 2992 void _ensureAssignable(Expression expression) { |
| 2993 if (expression != null && !expression.isAssignable) { | 2993 if (expression != null && !expression.isAssignable) { |
| 2994 _reportErrorForCurrentToken(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSI
GNABLE, []); | 2994 _reportErrorForCurrentToken(ParserErrorCode.ILLEGAL_ASSIGNMENT_TO_NON_ASSI
GNABLE); |
| 2995 } | 2995 } |
| 2996 } | 2996 } |
| 2997 | 2997 |
| 2998 /** | 2998 /** |
| 2999 * If the current token has the expected type, return it after advancing to th
e next token. | 2999 * If the current token has the expected type, return it after advancing to th
e next token. |
| 3000 * Otherwise report an error and return the current token without advancing. N
ote that the method | 3000 * Otherwise report an error and return the current token without advancing. N
ote that the method |
| 3001 * [_expectGt] should be used if the argument to this method would be [TokenTy
pe.GT]. | 3001 * [_expectGt] should be used if the argument to this method would be [TokenTy
pe.GT]. |
| 3002 * | 3002 * |
| 3003 * @param type the type of token that is expected | 3003 * @param type the type of token that is expected |
| 3004 * @return the token that matched the given type | 3004 * @return the token that matched the given type |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3584 * 'assert' '(' conditionalExpression ')' ';' | 3584 * 'assert' '(' conditionalExpression ')' ';' |
| 3585 * </pre> | 3585 * </pre> |
| 3586 * | 3586 * |
| 3587 * @return the assert statement | 3587 * @return the assert statement |
| 3588 */ | 3588 */ |
| 3589 AssertStatement _parseAssertStatement() { | 3589 AssertStatement _parseAssertStatement() { |
| 3590 Token keyword = _expectKeyword(Keyword.ASSERT); | 3590 Token keyword = _expectKeyword(Keyword.ASSERT); |
| 3591 Token leftParen = _expect(TokenType.OPEN_PAREN); | 3591 Token leftParen = _expect(TokenType.OPEN_PAREN); |
| 3592 Expression expression = parseExpression2(); | 3592 Expression expression = parseExpression2(); |
| 3593 if (expression is AssignmentExpression) { | 3593 if (expression is AssignmentExpression) { |
| 3594 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, expre
ssion, []); | 3594 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_ASSIGNMENT, expre
ssion); |
| 3595 } else if (expression is CascadeExpression) { | 3595 } else if (expression is CascadeExpression) { |
| 3596 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, expressi
on, []); | 3596 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_CASCADE, expressi
on); |
| 3597 } else if (expression is ThrowExpression) { | 3597 } else if (expression is ThrowExpression) { |
| 3598 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, expression
, []); | 3598 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_THROW, expression
); |
| 3599 } else if (expression is RethrowExpression) { | 3599 } else if (expression is RethrowExpression) { |
| 3600 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, expressi
on, []); | 3600 _reportErrorForNode(ParserErrorCode.ASSERT_DOES_NOT_TAKE_RETHROW, expressi
on); |
| 3601 } | 3601 } |
| 3602 Token rightParen = _expect(TokenType.CLOSE_PAREN); | 3602 Token rightParen = _expect(TokenType.CLOSE_PAREN); |
| 3603 Token semicolon = _expect(TokenType.SEMICOLON); | 3603 Token semicolon = _expect(TokenType.SEMICOLON); |
| 3604 return new AssertStatement(keyword, leftParen, expression, rightParen, semic
olon); | 3604 return new AssertStatement(keyword, leftParen, expression, rightParen, semic
olon); |
| 3605 } | 3605 } |
| 3606 | 3606 |
| 3607 /** | 3607 /** |
| 3608 * Parse an assignable expression. | 3608 * Parse an assignable expression. |
| 3609 * | 3609 * |
| 3610 * <pre> | 3610 * <pre> |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3685 return new IndexExpression.forTarget(prefix, leftBracket, index, rightBr
acket); | 3685 return new IndexExpression.forTarget(prefix, leftBracket, index, rightBr
acket); |
| 3686 } finally { | 3686 } finally { |
| 3687 _inInitializer = wasInInitializer; | 3687 _inInitializer = wasInInitializer; |
| 3688 } | 3688 } |
| 3689 } else if (_matches(TokenType.PERIOD)) { | 3689 } else if (_matches(TokenType.PERIOD)) { |
| 3690 Token period = andAdvance; | 3690 Token period = andAdvance; |
| 3691 return new PropertyAccess(prefix, period, parseSimpleIdentifier()); | 3691 return new PropertyAccess(prefix, period, parseSimpleIdentifier()); |
| 3692 } else { | 3692 } else { |
| 3693 if (!optional) { | 3693 if (!optional) { |
| 3694 // Report the missing selector. | 3694 // Report the missing selector. |
| 3695 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR,
[]); | 3695 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR)
; |
| 3696 } | 3696 } |
| 3697 return prefix; | 3697 return prefix; |
| 3698 } | 3698 } |
| 3699 } | 3699 } |
| 3700 | 3700 |
| 3701 /** | 3701 /** |
| 3702 * Parse a await expression. | 3702 * Parse a await expression. |
| 3703 * | 3703 * |
| 3704 * <pre> | 3704 * <pre> |
| 3705 * awaitExpression ::= | 3705 * awaitExpression ::= |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3774 * | 3774 * |
| 3775 * @return the break statement that was parsed | 3775 * @return the break statement that was parsed |
| 3776 */ | 3776 */ |
| 3777 Statement _parseBreakStatement() { | 3777 Statement _parseBreakStatement() { |
| 3778 Token breakKeyword = _expectKeyword(Keyword.BREAK); | 3778 Token breakKeyword = _expectKeyword(Keyword.BREAK); |
| 3779 SimpleIdentifier label = null; | 3779 SimpleIdentifier label = null; |
| 3780 if (_matchesIdentifier()) { | 3780 if (_matchesIdentifier()) { |
| 3781 label = parseSimpleIdentifier(); | 3781 label = parseSimpleIdentifier(); |
| 3782 } | 3782 } |
| 3783 if (!_inLoop && !_inSwitch && label == null) { | 3783 if (!_inLoop && !_inSwitch && label == null) { |
| 3784 _reportErrorForToken(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword,
[]); | 3784 _reportErrorForToken(ParserErrorCode.BREAK_OUTSIDE_OF_LOOP, breakKeyword); |
| 3785 } | 3785 } |
| 3786 Token semicolon = _expect(TokenType.SEMICOLON); | 3786 Token semicolon = _expect(TokenType.SEMICOLON); |
| 3787 return new BreakStatement(breakKeyword, label, semicolon); | 3787 return new BreakStatement(breakKeyword, label, semicolon); |
| 3788 } | 3788 } |
| 3789 | 3789 |
| 3790 /** | 3790 /** |
| 3791 * Parse a cascade section. | 3791 * Parse a cascade section. |
| 3792 * | 3792 * |
| 3793 * <pre> | 3793 * <pre> |
| 3794 * cascadeSection ::= | 3794 * cascadeSection ::= |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3909 // | 3909 // |
| 3910 ExtendsClause extendsClause = null; | 3910 ExtendsClause extendsClause = null; |
| 3911 WithClause withClause = null; | 3911 WithClause withClause = null; |
| 3912 ImplementsClause implementsClause = null; | 3912 ImplementsClause implementsClause = null; |
| 3913 bool foundClause = true; | 3913 bool foundClause = true; |
| 3914 while (foundClause) { | 3914 while (foundClause) { |
| 3915 if (_matchesKeyword(Keyword.EXTENDS)) { | 3915 if (_matchesKeyword(Keyword.EXTENDS)) { |
| 3916 if (extendsClause == null) { | 3916 if (extendsClause == null) { |
| 3917 extendsClause = parseExtendsClause(); | 3917 extendsClause = parseExtendsClause(); |
| 3918 if (withClause != null) { | 3918 if (withClause != null) { |
| 3919 _reportErrorForToken(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause
.withKeyword, []); | 3919 _reportErrorForToken(ParserErrorCode.WITH_BEFORE_EXTENDS, withClause
.withKeyword); |
| 3920 } else if (implementsClause != null) { | 3920 } else if (implementsClause != null) { |
| 3921 _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, impl
ementsClause.keyword, []); | 3921 _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_EXTENDS, impl
ementsClause.keyword); |
| 3922 } | 3922 } |
| 3923 } else { | 3923 } else { |
| 3924 _reportErrorForToken(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extends
Clause.keyword, []); | 3924 _reportErrorForToken(ParserErrorCode.MULTIPLE_EXTENDS_CLAUSES, extends
Clause.keyword); |
| 3925 parseExtendsClause(); | 3925 parseExtendsClause(); |
| 3926 } | 3926 } |
| 3927 } else if (_matchesKeyword(Keyword.WITH)) { | 3927 } else if (_matchesKeyword(Keyword.WITH)) { |
| 3928 if (withClause == null) { | 3928 if (withClause == null) { |
| 3929 withClause = parseWithClause(); | 3929 withClause = parseWithClause(); |
| 3930 if (implementsClause != null) { | 3930 if (implementsClause != null) { |
| 3931 _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, impleme
ntsClause.keyword, []); | 3931 _reportErrorForToken(ParserErrorCode.IMPLEMENTS_BEFORE_WITH, impleme
ntsClause.keyword); |
| 3932 } | 3932 } |
| 3933 } else { | 3933 } else { |
| 3934 _reportErrorForToken(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause
.withKeyword, []); | 3934 _reportErrorForToken(ParserErrorCode.MULTIPLE_WITH_CLAUSES, withClause
.withKeyword); |
| 3935 parseWithClause(); | 3935 parseWithClause(); |
| 3936 // TODO(brianwilkerson) Should we merge the list of applied mixins int
o a single list? | 3936 // TODO(brianwilkerson) Should we merge the list of applied mixins int
o a single list? |
| 3937 } | 3937 } |
| 3938 } else if (_matchesKeyword(Keyword.IMPLEMENTS)) { | 3938 } else if (_matchesKeyword(Keyword.IMPLEMENTS)) { |
| 3939 if (implementsClause == null) { | 3939 if (implementsClause == null) { |
| 3940 implementsClause = parseImplementsClause(); | 3940 implementsClause = parseImplementsClause(); |
| 3941 } else { | 3941 } else { |
| 3942 _reportErrorForToken(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, impl
ementsClause.keyword, []); | 3942 _reportErrorForToken(ParserErrorCode.MULTIPLE_IMPLEMENTS_CLAUSES, impl
ementsClause.keyword); |
| 3943 parseImplementsClause(); | 3943 parseImplementsClause(); |
| 3944 // TODO(brianwilkerson) Should we merge the list of implemented classe
s into a single list? | 3944 // TODO(brianwilkerson) Should we merge the list of implemented classe
s into a single list? |
| 3945 } | 3945 } |
| 3946 } else { | 3946 } else { |
| 3947 foundClause = false; | 3947 foundClause = false; |
| 3948 } | 3948 } |
| 3949 } | 3949 } |
| 3950 if (withClause != null && extendsClause == null) { | 3950 if (withClause != null && extendsClause == null) { |
| 3951 _reportErrorForToken(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.with
Keyword, []); | 3951 _reportErrorForToken(ParserErrorCode.WITH_WITHOUT_EXTENDS, withClause.with
Keyword); |
| 3952 } | 3952 } |
| 3953 // | 3953 // |
| 3954 // Look for and skip over the extra-lingual 'native' specification. | 3954 // Look for and skip over the extra-lingual 'native' specification. |
| 3955 // | 3955 // |
| 3956 NativeClause nativeClause = null; | 3956 NativeClause nativeClause = null; |
| 3957 if (_matchesString(_NATIVE) && _tokenMatches(_peek(), TokenType.STRING)) { | 3957 if (_matchesString(_NATIVE) && _tokenMatches(_peek(), TokenType.STRING)) { |
| 3958 nativeClause = _parseNativeClause(); | 3958 nativeClause = _parseNativeClause(); |
| 3959 } | 3959 } |
| 3960 // | 3960 // |
| 3961 // Parse the body of the class. | 3961 // Parse the body of the class. |
| 3962 // | 3962 // |
| 3963 Token leftBracket = null; | 3963 Token leftBracket = null; |
| 3964 List<ClassMember> members = null; | 3964 List<ClassMember> members = null; |
| 3965 Token rightBracket = null; | 3965 Token rightBracket = null; |
| 3966 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 3966 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 3967 leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); | 3967 leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); |
| 3968 members = _parseClassMembers(className, _getEndToken(leftBracket)); | 3968 members = _parseClassMembers(className, _getEndToken(leftBracket)); |
| 3969 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 3969 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 3970 } else { | 3970 } else { |
| 3971 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); | 3971 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); |
| 3972 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); | 3972 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); |
| 3973 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY, []); | 3973 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CLASS_BODY); |
| 3974 } | 3974 } |
| 3975 ClassDeclaration classDeclaration = new ClassDeclaration(commentAndMetadata.
comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParame
ters, extendsClause, withClause, implementsClause, leftBracket, members, rightBr
acket); | 3975 ClassDeclaration classDeclaration = new ClassDeclaration(commentAndMetadata.
comment, commentAndMetadata.metadata, abstractKeyword, keyword, name, typeParame
ters, extendsClause, withClause, implementsClause, leftBracket, members, rightBr
acket); |
| 3976 classDeclaration.nativeClause = nativeClause; | 3976 classDeclaration.nativeClause = nativeClause; |
| 3977 return classDeclaration; | 3977 return classDeclaration; |
| 3978 } | 3978 } |
| 3979 | 3979 |
| 3980 /** | 3980 /** |
| 3981 * Parse a list of class members. | 3981 * Parse a list of class members. |
| 3982 * | 3982 * |
| 3983 * <pre> | 3983 * <pre> |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4267 } else if (_parseEnum && _matchesKeyword(Keyword.ENUM)) { | 4267 } else if (_parseEnum && _matchesKeyword(Keyword.ENUM)) { |
| 4268 _validateModifiersForEnum(modifiers); | 4268 _validateModifiersForEnum(modifiers); |
| 4269 return _parseEnumDeclaration(commentAndMetadata); | 4269 return _parseEnumDeclaration(commentAndMetadata); |
| 4270 } | 4270 } |
| 4271 if (_matchesKeyword(Keyword.VOID)) { | 4271 if (_matchesKeyword(Keyword.VOID)) { |
| 4272 TypeName returnType = parseReturnType(); | 4272 TypeName returnType = parseReturnType(); |
| 4273 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _tok
enMatchesIdentifier(_peek())) { | 4273 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _tok
enMatchesIdentifier(_peek())) { |
| 4274 _validateModifiersForTopLevelFunction(modifiers); | 4274 _validateModifiersForTopLevelFunction(modifiers); |
| 4275 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalK
eyword, returnType); | 4275 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalK
eyword, returnType); |
| 4276 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 4276 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 4277 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken,
[]); | 4277 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 4278 return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata,
modifiers.externalKeyword, returnType)); | 4278 return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata,
modifiers.externalKeyword, returnType)); |
| 4279 } else if (_matchesIdentifier() && _peek().matchesAny([ | 4279 } else if (_matchesIdentifier() && _peek().matchesAny([ |
| 4280 TokenType.OPEN_PAREN, | 4280 TokenType.OPEN_PAREN, |
| 4281 TokenType.OPEN_CURLY_BRACKET, | 4281 TokenType.OPEN_CURLY_BRACKET, |
| 4282 TokenType.FUNCTION])) { | 4282 TokenType.FUNCTION])) { |
| 4283 _validateModifiersForTopLevelFunction(modifiers); | 4283 _validateModifiersForTopLevelFunction(modifiers); |
| 4284 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalK
eyword, returnType); | 4284 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalK
eyword, returnType); |
| 4285 } else { | 4285 } else { |
| 4286 // | 4286 // |
| 4287 // We have found an error of some kind. Try to recover. | 4287 // We have found an error of some kind. Try to recover. |
| 4288 // | 4288 // |
| 4289 if (_matchesIdentifier()) { | 4289 if (_matchesIdentifier()) { |
| 4290 if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMIC
OLON])) { | 4290 if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMIC
OLON])) { |
| 4291 // | 4291 // |
| 4292 // We appear to have a variable declaration with a type of "void". | 4292 // We appear to have a variable declaration with a type of "void". |
| 4293 // | 4293 // |
| 4294 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, []); | 4294 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 4295 return new TopLevelVariableDeclaration(commentAndMetadata.comment, c
ommentAndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _valida
teModifiersForTopLevelVariable(modifiers), null), _expect(TokenType.SEMICOLON)); | 4295 return new TopLevelVariableDeclaration(commentAndMetadata.comment, c
ommentAndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _valida
teModifiersForTopLevelVariable(modifiers), null), _expect(TokenType.SEMICOLON)); |
| 4296 } | 4296 } |
| 4297 } | 4297 } |
| 4298 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken,
[]); | 4298 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken)
; |
| 4299 return null; | 4299 return null; |
| 4300 } | 4300 } |
| 4301 } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
_tokenMatchesIdentifier(_peek())) { | 4301 } else if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) &&
_tokenMatchesIdentifier(_peek())) { |
| 4302 _validateModifiersForTopLevelFunction(modifiers); | 4302 _validateModifiersForTopLevelFunction(modifiers); |
| 4303 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKey
word, null); | 4303 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKey
word, null); |
| 4304 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 4304 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 4305 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []
); | 4305 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 4306 return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, mo
difiers.externalKeyword, null)); | 4306 return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, mo
difiers.externalKeyword, null)); |
| 4307 } else if (!_matchesIdentifier()) { | 4307 } else if (!_matchesIdentifier()) { |
| 4308 Token keyword = modifiers.varKeyword; | 4308 Token keyword = modifiers.varKeyword; |
| 4309 if (keyword == null) { | 4309 if (keyword == null) { |
| 4310 keyword = modifiers.finalKeyword; | 4310 keyword = modifiers.finalKeyword; |
| 4311 } | 4311 } |
| 4312 if (keyword == null) { | 4312 if (keyword == null) { |
| 4313 keyword = modifiers.constKeyword; | 4313 keyword = modifiers.constKeyword; |
| 4314 } | 4314 } |
| 4315 if (keyword != null) { | 4315 if (keyword != null) { |
| 4316 // | 4316 // |
| 4317 // We appear to have found an incomplete top-level variable declaration. | 4317 // We appear to have found an incomplete top-level variable declaration. |
| 4318 // | 4318 // |
| 4319 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 4319 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 4320 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 4320 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 4321 variables.add(new VariableDeclaration(null, null, _createSyntheticIdenti
fier(), null, null)); | 4321 variables.add(new VariableDeclaration(null, null, _createSyntheticIdenti
fier(), null, null)); |
| 4322 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comme
ntAndMetadata.metadata, new VariableDeclarationList(null, null, keyword, null, v
ariables), _expectSemicolon()); | 4322 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comme
ntAndMetadata.metadata, new VariableDeclarationList(null, null, keyword, null, v
ariables), _expectSemicolon()); |
| 4323 } | 4323 } |
| 4324 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, [
]); | 4324 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); |
| 4325 return null; | 4325 return null; |
| 4326 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 4326 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
| 4327 _validateModifiersForTopLevelFunction(modifiers); | 4327 _validateModifiersForTopLevelFunction(modifiers); |
| 4328 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKey
word, null); | 4328 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKey
word, null); |
| 4329 } else if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMI
COLON])) { | 4329 } else if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMI
COLON])) { |
| 4330 if (modifiers.constKeyword == null && modifiers.finalKeyword == null && mo
difiers.varKeyword == null) { | 4330 if (modifiers.constKeyword == null && modifiers.finalKeyword == null && mo
difiers.varKeyword == null) { |
| 4331 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_T
YPE, []); | 4331 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_T
YPE); |
| 4332 } | 4332 } |
| 4333 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comment
AndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModi
fiersForTopLevelVariable(modifiers), null), _expect(TokenType.SEMICOLON)); | 4333 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comment
AndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModi
fiersForTopLevelVariable(modifiers), null), _expect(TokenType.SEMICOLON)); |
| 4334 } | 4334 } |
| 4335 TypeName returnType = parseReturnType(); | 4335 TypeName returnType = parseReturnType(); |
| 4336 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _token
MatchesIdentifier(_peek())) { | 4336 if ((_matchesKeyword(Keyword.GET) || _matchesKeyword(Keyword.SET)) && _token
MatchesIdentifier(_peek())) { |
| 4337 _validateModifiersForTopLevelFunction(modifiers); | 4337 _validateModifiersForTopLevelFunction(modifiers); |
| 4338 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKey
word, returnType); | 4338 return _parseFunctionDeclaration(commentAndMetadata, modifiers.externalKey
word, returnType); |
| 4339 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { | 4339 } else if (_matchesKeyword(Keyword.OPERATOR) && _isOperator(_peek())) { |
| 4340 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken, []
); | 4340 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 4341 return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, mo
difiers.externalKeyword, returnType)); | 4341 return _convertToFunctionDeclaration(_parseOperator(commentAndMetadata, mo
difiers.externalKeyword, returnType)); |
| 4342 } else if (_matches(TokenType.AT)) { | 4342 } else if (_matches(TokenType.AT)) { |
| 4343 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comment
AndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModi
fiersForTopLevelVariable(modifiers), returnType), _expect(TokenType.SEMICOLON)); | 4343 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comment
AndMetadata.metadata, _parseVariableDeclarationListAfterType(null, _validateModi
fiersForTopLevelVariable(modifiers), returnType), _expect(TokenType.SEMICOLON)); |
| 4344 } else if (!_matchesIdentifier()) { | 4344 } else if (!_matchesIdentifier()) { |
| 4345 // TODO(brianwilkerson) Generalize this error. We could also be parsing a
top-level variable at this point. | 4345 // TODO(brianwilkerson) Generalize this error. We could also be parsing a
top-level variable at this point. |
| 4346 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken, [
]); | 4346 _reportErrorForToken(ParserErrorCode.EXPECTED_EXECUTABLE, _currentToken); |
| 4347 Token semicolon; | 4347 Token semicolon; |
| 4348 if (_matches(TokenType.SEMICOLON)) { | 4348 if (_matches(TokenType.SEMICOLON)) { |
| 4349 semicolon = andAdvance; | 4349 semicolon = andAdvance; |
| 4350 } else { | 4350 } else { |
| 4351 semicolon = _createSyntheticToken(TokenType.SEMICOLON); | 4351 semicolon = _createSyntheticToken(TokenType.SEMICOLON); |
| 4352 } | 4352 } |
| 4353 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 4353 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 4354 variables.add(new VariableDeclaration(null, null, _createSyntheticIdentifi
er(), null, null)); | 4354 variables.add(new VariableDeclaration(null, null, _createSyntheticIdentifi
er(), null, null)); |
| 4355 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comment
AndMetadata.metadata, new VariableDeclarationList(null, null, null, returnType,
variables), semicolon); | 4355 return new TopLevelVariableDeclaration(commentAndMetadata.comment, comment
AndMetadata.metadata, new VariableDeclarationList(null, null, null, returnType,
variables), semicolon); |
| 4356 } | 4356 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4403 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatches(_
peekAt(3), TokenType.OPEN_PAREN)) { | 4403 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && _tokenMatches(_
peekAt(3), TokenType.OPEN_PAREN)) { |
| 4404 bodyAllowed = false; | 4404 bodyAllowed = false; |
| 4405 initializers.add(_parseRedirectingConstructorInvocation()); | 4405 initializers.add(_parseRedirectingConstructorInvocation()); |
| 4406 } else { | 4406 } else { |
| 4407 initializers.add(_parseConstructorFieldInitializer()); | 4407 initializers.add(_parseConstructorFieldInitializer()); |
| 4408 } | 4408 } |
| 4409 } else if (_matchesKeyword(Keyword.SUPER)) { | 4409 } else if (_matchesKeyword(Keyword.SUPER)) { |
| 4410 initializers.add(_parseSuperConstructorInvocation()); | 4410 initializers.add(_parseSuperConstructorInvocation()); |
| 4411 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) | 4411 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) |
| 4412 || _matches(TokenType.FUNCTION)) { | 4412 || _matches(TokenType.FUNCTION)) { |
| 4413 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER, []); | 4413 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER); |
| 4414 } else { | 4414 } else { |
| 4415 initializers.add(_parseConstructorFieldInitializer()); | 4415 initializers.add(_parseConstructorFieldInitializer()); |
| 4416 } | 4416 } |
| 4417 } while (_optional(TokenType.COMMA)); | 4417 } while (_optional(TokenType.COMMA)); |
| 4418 if (factoryKeyword != null) { | 4418 if (factoryKeyword != null) { |
| 4419 _reportErrorForToken(ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryK
eyword, []); | 4419 _reportErrorForToken(ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryK
eyword); |
| 4420 } | 4420 } |
| 4421 } | 4421 } |
| 4422 ConstructorName redirectedConstructor = null; | 4422 ConstructorName redirectedConstructor = null; |
| 4423 FunctionBody body; | 4423 FunctionBody body; |
| 4424 if (_matches(TokenType.EQ)) { | 4424 if (_matches(TokenType.EQ)) { |
| 4425 separator = andAdvance; | 4425 separator = andAdvance; |
| 4426 redirectedConstructor = parseConstructorName(); | 4426 redirectedConstructor = parseConstructorName(); |
| 4427 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); | 4427 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); |
| 4428 if (factoryKeyword == null) { | 4428 if (factoryKeyword == null) { |
| 4429 _reportErrorForNode(ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCT
OR, redirectedConstructor, []); | 4429 _reportErrorForNode(ParserErrorCode.REDIRECTION_IN_NON_FACTORY_CONSTRUCT
OR, redirectedConstructor); |
| 4430 } | 4430 } |
| 4431 } else { | 4431 } else { |
| 4432 body = _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, fal
se); | 4432 body = _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, fal
se); |
| 4433 if (constKeyword != null && factoryKeyword != null && externalKeyword == n
ull) { | 4433 if (constKeyword != null && factoryKeyword != null && externalKeyword == n
ull) { |
| 4434 _reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword, []); | 4434 _reportErrorForToken(ParserErrorCode.CONST_FACTORY, factoryKeyword); |
| 4435 } else if (body is EmptyFunctionBody) { | 4435 } else if (body is EmptyFunctionBody) { |
| 4436 if (factoryKeyword != null && externalKeyword == null) { | 4436 if (factoryKeyword != null && externalKeyword == null) { |
| 4437 _reportErrorForToken(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyw
ord, []); | 4437 _reportErrorForToken(ParserErrorCode.FACTORY_WITHOUT_BODY, factoryKeyw
ord); |
| 4438 } | 4438 } |
| 4439 } else { | 4439 } else { |
| 4440 if (constKeyword != null) { | 4440 if (constKeyword != null) { |
| 4441 _reportErrorForNode(ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body,
[]); | 4441 _reportErrorForNode(ParserErrorCode.CONST_CONSTRUCTOR_WITH_BODY, body)
; |
| 4442 } else if (!bodyAllowed) { | 4442 } else if (!bodyAllowed) { |
| 4443 _reportErrorForNode(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, bo
dy, []); | 4443 _reportErrorForNode(ParserErrorCode.EXTERNAL_CONSTRUCTOR_WITH_BODY, bo
dy); |
| 4444 } | 4444 } |
| 4445 } | 4445 } |
| 4446 } | 4446 } |
| 4447 return new ConstructorDeclaration(commentAndMetadata.comment, commentAndMeta
data.metadata, externalKeyword, constKeyword, factoryKeyword, returnType, period
, name, parameters, separator, initializers, redirectedConstructor, body); | 4447 return new ConstructorDeclaration(commentAndMetadata.comment, commentAndMeta
data.metadata, externalKeyword, constKeyword, factoryKeyword, returnType, period
, name, parameters, separator, initializers, redirectedConstructor, body); |
| 4448 } | 4448 } |
| 4449 | 4449 |
| 4450 /** | 4450 /** |
| 4451 * Parse a field initializer within a constructor. | 4451 * Parse a field initializer within a constructor. |
| 4452 * | 4452 * |
| 4453 * <pre> | 4453 * <pre> |
| 4454 * fieldInitializer: | 4454 * fieldInitializer: |
| 4455 * ('this' '.')? identifier '=' conditionalExpression cascadeSection* | 4455 * ('this' '.')? identifier '=' conditionalExpression cascadeSection* |
| 4456 * </pre> | 4456 * </pre> |
| 4457 * | 4457 * |
| 4458 * @return the field initializer that was parsed | 4458 * @return the field initializer that was parsed |
| 4459 */ | 4459 */ |
| 4460 ConstructorFieldInitializer _parseConstructorFieldInitializer() { | 4460 ConstructorFieldInitializer _parseConstructorFieldInitializer() { |
| 4461 Token keyword = null; | 4461 Token keyword = null; |
| 4462 Token period = null; | 4462 Token period = null; |
| 4463 if (_matchesKeyword(Keyword.THIS)) { | 4463 if (_matchesKeyword(Keyword.THIS)) { |
| 4464 keyword = andAdvance; | 4464 keyword = andAdvance; |
| 4465 period = _expect(TokenType.PERIOD); | 4465 period = _expect(TokenType.PERIOD); |
| 4466 } | 4466 } |
| 4467 SimpleIdentifier fieldName = parseSimpleIdentifier(); | 4467 SimpleIdentifier fieldName = parseSimpleIdentifier(); |
| 4468 if (!_matches(TokenType.EQ)) { | 4468 if (!_matches(TokenType.EQ)) { |
| 4469 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALI
ZER, []); | 4469 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALI
ZER); |
| 4470 return new ConstructorFieldInitializer( | 4470 return new ConstructorFieldInitializer( |
| 4471 keyword, | 4471 keyword, |
| 4472 period, | 4472 period, |
| 4473 fieldName, | 4473 fieldName, |
| 4474 _createSyntheticToken(TokenType.EQ), | 4474 _createSyntheticToken(TokenType.EQ), |
| 4475 _createSyntheticIdentifier()); | 4475 _createSyntheticIdentifier()); |
| 4476 } | 4476 } |
| 4477 Token equals = _expect(TokenType.EQ); | 4477 Token equals = _expect(TokenType.EQ); |
| 4478 bool wasInInitializer = _inInitializer; | 4478 bool wasInInitializer = _inInitializer; |
| 4479 _inInitializer = true; | 4479 _inInitializer = true; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 4503 * <pre> | 4503 * <pre> |
| 4504 * continueStatement ::= | 4504 * continueStatement ::= |
| 4505 * 'continue' identifier? ';' | 4505 * 'continue' identifier? ';' |
| 4506 * </pre> | 4506 * </pre> |
| 4507 * | 4507 * |
| 4508 * @return the continue statement that was parsed | 4508 * @return the continue statement that was parsed |
| 4509 */ | 4509 */ |
| 4510 Statement _parseContinueStatement() { | 4510 Statement _parseContinueStatement() { |
| 4511 Token continueKeyword = _expectKeyword(Keyword.CONTINUE); | 4511 Token continueKeyword = _expectKeyword(Keyword.CONTINUE); |
| 4512 if (!_inLoop && !_inSwitch) { | 4512 if (!_inLoop && !_inSwitch) { |
| 4513 _reportErrorForToken(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKey
word, []); | 4513 _reportErrorForToken(ParserErrorCode.CONTINUE_OUTSIDE_OF_LOOP, continueKey
word); |
| 4514 } | 4514 } |
| 4515 SimpleIdentifier label = null; | 4515 SimpleIdentifier label = null; |
| 4516 if (_matchesIdentifier()) { | 4516 if (_matchesIdentifier()) { |
| 4517 label = parseSimpleIdentifier(); | 4517 label = parseSimpleIdentifier(); |
| 4518 } | 4518 } |
| 4519 if (_inSwitch && !_inLoop && label == null) { | 4519 if (_inSwitch && !_inLoop && label == null) { |
| 4520 _reportErrorForToken(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, conti
nueKeyword, []); | 4520 _reportErrorForToken(ParserErrorCode.CONTINUE_WITHOUT_LABEL_IN_CASE, conti
nueKeyword); |
| 4521 } | 4521 } |
| 4522 Token semicolon = _expect(TokenType.SEMICOLON); | 4522 Token semicolon = _expect(TokenType.SEMICOLON); |
| 4523 return new ContinueStatement(continueKeyword, label, semicolon); | 4523 return new ContinueStatement(continueKeyword, label, semicolon); |
| 4524 } | 4524 } |
| 4525 | 4525 |
| 4526 /** | 4526 /** |
| 4527 * Parse a directive. | 4527 * Parse a directive. |
| 4528 * | 4528 * |
| 4529 * <pre> | 4529 * <pre> |
| 4530 * directive ::= | 4530 * directive ::= |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4691 SimpleIdentifier name = parseSimpleIdentifier(); | 4691 SimpleIdentifier name = parseSimpleIdentifier(); |
| 4692 Token leftBracket = null; | 4692 Token leftBracket = null; |
| 4693 List<EnumConstantDeclaration> constants = new List<EnumConstantDeclaration>(
); | 4693 List<EnumConstantDeclaration> constants = new List<EnumConstantDeclaration>(
); |
| 4694 Token rightBracket = null; | 4694 Token rightBracket = null; |
| 4695 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 4695 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 4696 leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); | 4696 leftBracket = _expect(TokenType.OPEN_CURLY_BRACKET); |
| 4697 if (_matchesIdentifier()) { | 4697 if (_matchesIdentifier()) { |
| 4698 constants.add(_parseEnumConstantDeclaration()); | 4698 constants.add(_parseEnumConstantDeclaration()); |
| 4699 } else if (_matches(TokenType.COMMA) && _tokenMatchesIdentifier(_peek()))
{ | 4699 } else if (_matches(TokenType.COMMA) && _tokenMatchesIdentifier(_peek()))
{ |
| 4700 constants.add(_parseEnumConstantDeclaration()); | 4700 constants.add(_parseEnumConstantDeclaration()); |
| 4701 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 4701 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 4702 } else { | 4702 } else { |
| 4703 constants.add(_parseEnumConstantDeclaration()); | 4703 constants.add(_parseEnumConstantDeclaration()); |
| 4704 _reportErrorForCurrentToken(ParserErrorCode.EMPTY_ENUM_BODY, []); | 4704 _reportErrorForCurrentToken(ParserErrorCode.EMPTY_ENUM_BODY); |
| 4705 } | 4705 } |
| 4706 while (_optional(TokenType.COMMA)) { | 4706 while (_optional(TokenType.COMMA)) { |
| 4707 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 4707 if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 4708 break; | 4708 break; |
| 4709 } | 4709 } |
| 4710 constants.add(_parseEnumConstantDeclaration()); | 4710 constants.add(_parseEnumConstantDeclaration()); |
| 4711 } | 4711 } |
| 4712 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 4712 rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 4713 } else { | 4713 } else { |
| 4714 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); | 4714 leftBracket = _createSyntheticToken(TokenType.OPEN_CURLY_BRACKET); |
| 4715 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); | 4715 rightBracket = _createSyntheticToken(TokenType.CLOSE_CURLY_BRACKET); |
| 4716 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ENUM_BODY, []); | 4716 _reportErrorForCurrentToken(ParserErrorCode.MISSING_ENUM_BODY); |
| 4717 } | 4717 } |
| 4718 return new EnumDeclaration(commentAndMetadata.comment, commentAndMetadata.me
tadata, keyword, name, leftBracket, constants, rightBracket); | 4718 return new EnumDeclaration(commentAndMetadata.comment, commentAndMetadata.me
tadata, keyword, name, leftBracket, constants, rightBracket); |
| 4719 } | 4719 } |
| 4720 | 4720 |
| 4721 /** | 4721 /** |
| 4722 * Parse an equality expression. | 4722 * Parse an equality expression. |
| 4723 * | 4723 * |
| 4724 * <pre> | 4724 * <pre> |
| 4725 * equalityExpression ::= | 4725 * equalityExpression ::= |
| 4726 * relationalExpression (equalityOperator relationalExpression)? | 4726 * relationalExpression (equalityOperator relationalExpression)? |
| 4727 * | 'super' equalityOperator relationalExpression | 4727 * | 'super' equalityOperator relationalExpression |
| 4728 * </pre> | 4728 * </pre> |
| 4729 * | 4729 * |
| 4730 * @return the equality expression that was parsed | 4730 * @return the equality expression that was parsed |
| 4731 */ | 4731 */ |
| 4732 Expression _parseEqualityExpression() { | 4732 Expression _parseEqualityExpression() { |
| 4733 Expression expression; | 4733 Expression expression; |
| 4734 if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isEqualityOper
ator) { | 4734 if (_matchesKeyword(Keyword.SUPER) && _currentToken.next.type.isEqualityOper
ator) { |
| 4735 expression = new SuperExpression(andAdvance); | 4735 expression = new SuperExpression(andAdvance); |
| 4736 } else { | 4736 } else { |
| 4737 expression = _parseRelationalExpression(); | 4737 expression = _parseRelationalExpression(); |
| 4738 } | 4738 } |
| 4739 bool leftEqualityExpression = false; | 4739 bool leftEqualityExpression = false; |
| 4740 while (_currentToken.type.isEqualityOperator) { | 4740 while (_currentToken.type.isEqualityOperator) { |
| 4741 Token operator = andAdvance; | 4741 Token operator = andAdvance; |
| 4742 if (leftEqualityExpression) { | 4742 if (leftEqualityExpression) { |
| 4743 _reportErrorForNode(ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
expression, []); | 4743 _reportErrorForNode(ParserErrorCode.EQUALITY_CANNOT_BE_EQUALITY_OPERAND,
expression); |
| 4744 } | 4744 } |
| 4745 expression = new BinaryExpression(expression, operator, _parseRelationalEx
pression()); | 4745 expression = new BinaryExpression(expression, operator, _parseRelationalEx
pression()); |
| 4746 leftEqualityExpression = true; | 4746 leftEqualityExpression = true; |
| 4747 } | 4747 } |
| 4748 return expression; | 4748 return expression; |
| 4749 } | 4749 } |
| 4750 | 4750 |
| 4751 /** | 4751 /** |
| 4752 * Parse an export directive. | 4752 * Parse an export directive. |
| 4753 * | 4753 * |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4807 keyword = andAdvance; | 4807 keyword = andAdvance; |
| 4808 if (_isTypedIdentifier(_currentToken)) { | 4808 if (_isTypedIdentifier(_currentToken)) { |
| 4809 type = parseTypeName(); | 4809 type = parseTypeName(); |
| 4810 } | 4810 } |
| 4811 } else if (_matchesKeyword(Keyword.VAR)) { | 4811 } else if (_matchesKeyword(Keyword.VAR)) { |
| 4812 keyword = andAdvance; | 4812 keyword = andAdvance; |
| 4813 } else { | 4813 } else { |
| 4814 if (_isTypedIdentifier(_currentToken)) { | 4814 if (_isTypedIdentifier(_currentToken)) { |
| 4815 type = parseReturnType(); | 4815 type = parseReturnType(); |
| 4816 } else if (!optional) { | 4816 } else if (!optional) { |
| 4817 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_T
YPE, []); | 4817 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_T
YPE); |
| 4818 } | 4818 } |
| 4819 } | 4819 } |
| 4820 return new FinalConstVarOrType(keyword, type); | 4820 return new FinalConstVarOrType(keyword, type); |
| 4821 } | 4821 } |
| 4822 | 4822 |
| 4823 /** | 4823 /** |
| 4824 * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be | 4824 * Parse a formal parameter. At most one of `isOptional` and `isNamed` can be |
| 4825 * `true`. | 4825 * `true`. |
| 4826 * | 4826 * |
| 4827 * <pre> | 4827 * <pre> |
| 4828 * defaultFormalParameter ::= | 4828 * defaultFormalParameter ::= |
| 4829 * normalFormalParameter ('=' expression)? | 4829 * normalFormalParameter ('=' expression)? |
| 4830 * | 4830 * |
| 4831 * defaultNamedParameter ::= | 4831 * defaultNamedParameter ::= |
| 4832 * normalFormalParameter (':' expression)? | 4832 * normalFormalParameter (':' expression)? |
| 4833 * </pre> | 4833 * </pre> |
| 4834 * | 4834 * |
| 4835 * @param kind the kind of parameter being expected based on the presence or a
bsence of group | 4835 * @param kind the kind of parameter being expected based on the presence or a
bsence of group |
| 4836 * delimiters | 4836 * delimiters |
| 4837 * @return the formal parameter that was parsed | 4837 * @return the formal parameter that was parsed |
| 4838 */ | 4838 */ |
| 4839 FormalParameter _parseFormalParameter(ParameterKind kind) { | 4839 FormalParameter _parseFormalParameter(ParameterKind kind) { |
| 4840 NormalFormalParameter parameter = parseNormalFormalParameter(); | 4840 NormalFormalParameter parameter = parseNormalFormalParameter(); |
| 4841 if (_matches(TokenType.EQ)) { | 4841 if (_matches(TokenType.EQ)) { |
| 4842 Token seperator = andAdvance; | 4842 Token seperator = andAdvance; |
| 4843 Expression defaultValue = parseExpression2(); | 4843 Expression defaultValue = parseExpression2(); |
| 4844 if (kind == ParameterKind.NAMED) { | 4844 if (kind == ParameterKind.NAMED) { |
| 4845 _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER
, seperator, []); | 4845 _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_NAMED_PARAMETER
, seperator); |
| 4846 } else if (kind == ParameterKind.REQUIRED) { | 4846 } else if (kind == ParameterKind.REQUIRED) { |
| 4847 _reportErrorForNode(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
parameter, []); | 4847 _reportErrorForNode(ParserErrorCode.POSITIONAL_PARAMETER_OUTSIDE_GROUP,
parameter); |
| 4848 } | 4848 } |
| 4849 return new DefaultFormalParameter(parameter, kind, seperator, defaultValue
); | 4849 return new DefaultFormalParameter(parameter, kind, seperator, defaultValue
); |
| 4850 } else if (_matches(TokenType.COLON)) { | 4850 } else if (_matches(TokenType.COLON)) { |
| 4851 Token seperator = andAdvance; | 4851 Token seperator = andAdvance; |
| 4852 Expression defaultValue = parseExpression2(); | 4852 Expression defaultValue = parseExpression2(); |
| 4853 if (kind == ParameterKind.POSITIONAL) { | 4853 if (kind == ParameterKind.POSITIONAL) { |
| 4854 _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARA
METER, seperator, []); | 4854 _reportErrorForToken(ParserErrorCode.WRONG_SEPARATOR_FOR_POSITIONAL_PARA
METER, seperator); |
| 4855 } else if (kind == ParameterKind.REQUIRED) { | 4855 } else if (kind == ParameterKind.REQUIRED) { |
| 4856 _reportErrorForNode(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, param
eter, []); | 4856 _reportErrorForNode(ParserErrorCode.NAMED_PARAMETER_OUTSIDE_GROUP, param
eter); |
| 4857 } | 4857 } |
| 4858 return new DefaultFormalParameter(parameter, kind, seperator, defaultValue
); | 4858 return new DefaultFormalParameter(parameter, kind, seperator, defaultValue
); |
| 4859 } else if (kind != ParameterKind.REQUIRED) { | 4859 } else if (kind != ParameterKind.REQUIRED) { |
| 4860 return new DefaultFormalParameter(parameter, kind, null, null); | 4860 return new DefaultFormalParameter(parameter, kind, null, null); |
| 4861 } | 4861 } |
| 4862 return parameter; | 4862 return parameter; |
| 4863 } | 4863 } |
| 4864 | 4864 |
| 4865 /** | 4865 /** |
| 4866 * Parse a for statement. | 4866 * Parse a for statement. |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4903 } else if (_isInitializedVariableDeclaration()) { | 4903 } else if (_isInitializedVariableDeclaration()) { |
| 4904 variableList = _parseVariableDeclarationListAfterMetadata(commentAndMe
tadata); | 4904 variableList = _parseVariableDeclarationListAfterMetadata(commentAndMe
tadata); |
| 4905 } else { | 4905 } else { |
| 4906 initialization = parseExpression2(); | 4906 initialization = parseExpression2(); |
| 4907 } | 4907 } |
| 4908 if (_matchesKeyword(Keyword.IN)) { | 4908 if (_matchesKeyword(Keyword.IN)) { |
| 4909 DeclaredIdentifier loopVariable = null; | 4909 DeclaredIdentifier loopVariable = null; |
| 4910 SimpleIdentifier identifier = null; | 4910 SimpleIdentifier identifier = null; |
| 4911 if (variableList == null) { | 4911 if (variableList == null) { |
| 4912 // We found: <expression> 'in' | 4912 // We found: <expression> 'in' |
| 4913 _reportErrorForCurrentToken(ParserErrorCode.MISSING_VARIABLE_IN_FOR_
EACH, []); | 4913 _reportErrorForCurrentToken(ParserErrorCode.MISSING_VARIABLE_IN_FOR_
EACH); |
| 4914 } else { | 4914 } else { |
| 4915 NodeList<VariableDeclaration> variables = variableList.variables; | 4915 NodeList<VariableDeclaration> variables = variableList.variables; |
| 4916 if (variables.length > 1) { | 4916 if (variables.length > 1) { |
| 4917 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_VARIABLES_IN_
FOR_EACH, [variables.length.toString()]); | 4917 _reportErrorForCurrentToken(ParserErrorCode.MULTIPLE_VARIABLES_IN_
FOR_EACH, [variables.length.toString()]); |
| 4918 } | 4918 } |
| 4919 VariableDeclaration variable = variables[0]; | 4919 VariableDeclaration variable = variables[0]; |
| 4920 if (variable.initializer != null) { | 4920 if (variable.initializer != null) { |
| 4921 _reportErrorForCurrentToken(ParserErrorCode.INITIALIZED_VARIABLE_I
N_FOR_EACH, []); | 4921 _reportErrorForCurrentToken(ParserErrorCode.INITIALIZED_VARIABLE_I
N_FOR_EACH); |
| 4922 } | 4922 } |
| 4923 Token keyword = variableList.keyword; | 4923 Token keyword = variableList.keyword; |
| 4924 TypeName type = variableList.type; | 4924 TypeName type = variableList.type; |
| 4925 if (keyword != null || type != null) { | 4925 if (keyword != null || type != null) { |
| 4926 loopVariable = new DeclaredIdentifier(commentAndMetadata.comment,
commentAndMetadata.metadata, keyword, type, variable.name); | 4926 loopVariable = new DeclaredIdentifier(commentAndMetadata.comment,
commentAndMetadata.metadata, keyword, type, variable.name); |
| 4927 } else { | 4927 } else { |
| 4928 if (!commentAndMetadata.metadata.isEmpty) { | 4928 if (!commentAndMetadata.metadata.isEmpty) { |
| 4929 // TODO(jwren) metadata isn't allowed before the identifier in "
identifier in expression", | 4929 // TODO(jwren) metadata isn't allowed before the identifier in "
identifier in expression", |
| 4930 // add warning if commentAndMetadata has content | 4930 // add warning if commentAndMetadata has content |
| 4931 } | 4931 } |
| 4932 identifier = variable.name; | 4932 identifier = variable.name; |
| 4933 } | 4933 } |
| 4934 } | 4934 } |
| 4935 Token inKeyword = _expectKeyword(Keyword.IN); | 4935 Token inKeyword = _expectKeyword(Keyword.IN); |
| 4936 Expression iterator = parseExpression2(); | 4936 Expression iterator = parseExpression2(); |
| 4937 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); | 4937 Token rightParenthesis = _expect(TokenType.CLOSE_PAREN); |
| 4938 Statement body = parseStatement2(); | 4938 Statement body = parseStatement2(); |
| 4939 if (loopVariable == null) { | 4939 if (loopVariable == null) { |
| 4940 return new ForEachStatement.con2(awaitKeyword, forKeyword, leftParen
thesis, identifier, inKeyword, iterator, rightParenthesis, body); | 4940 return new ForEachStatement.con2(awaitKeyword, forKeyword, leftParen
thesis, identifier, inKeyword, iterator, rightParenthesis, body); |
| 4941 } | 4941 } |
| 4942 return new ForEachStatement.con1(awaitKeyword, forKeyword, leftParenth
esis, loopVariable, inKeyword, iterator, rightParenthesis, body); | 4942 return new ForEachStatement.con1(awaitKeyword, forKeyword, leftParenth
esis, loopVariable, inKeyword, iterator, rightParenthesis, body); |
| 4943 } | 4943 } |
| 4944 } | 4944 } |
| 4945 if (awaitKeyword != null) { | 4945 if (awaitKeyword != null) { |
| 4946 _reportErrorForToken(ParserErrorCode.INVALID_AWAIT_IN_FOR, awaitKeyword,
[]); | 4946 _reportErrorForToken(ParserErrorCode.INVALID_AWAIT_IN_FOR, awaitKeyword)
; |
| 4947 } | 4947 } |
| 4948 Token leftSeparator = _expect(TokenType.SEMICOLON); | 4948 Token leftSeparator = _expect(TokenType.SEMICOLON); |
| 4949 Expression condition = null; | 4949 Expression condition = null; |
| 4950 if (!_matches(TokenType.SEMICOLON)) { | 4950 if (!_matches(TokenType.SEMICOLON)) { |
| 4951 condition = parseExpression2(); | 4951 condition = parseExpression2(); |
| 4952 } | 4952 } |
| 4953 Token rightSeparator = _expect(TokenType.SEMICOLON); | 4953 Token rightSeparator = _expect(TokenType.SEMICOLON); |
| 4954 List<Expression> updaters = null; | 4954 List<Expression> updaters = null; |
| 4955 if (!_matches(TokenType.CLOSE_PAREN)) { | 4955 if (!_matches(TokenType.CLOSE_PAREN)) { |
| 4956 updaters = _parseExpressionList(); | 4956 updaters = _parseExpressionList(); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 4987 bool wasInGenerator = _inGenerator; | 4987 bool wasInGenerator = _inGenerator; |
| 4988 bool wasInLoop = _inLoop; | 4988 bool wasInLoop = _inLoop; |
| 4989 bool wasInSwitch = _inSwitch; | 4989 bool wasInSwitch = _inSwitch; |
| 4990 _inAsync = false; | 4990 _inAsync = false; |
| 4991 _inGenerator = false; | 4991 _inGenerator = false; |
| 4992 _inLoop = false; | 4992 _inLoop = false; |
| 4993 _inSwitch = false; | 4993 _inSwitch = false; |
| 4994 try { | 4994 try { |
| 4995 if (_matches(TokenType.SEMICOLON)) { | 4995 if (_matches(TokenType.SEMICOLON)) { |
| 4996 if (!mayBeEmpty) { | 4996 if (!mayBeEmpty) { |
| 4997 _reportErrorForCurrentToken(emptyErrorCode, []); | 4997 _reportErrorForCurrentToken(emptyErrorCode); |
| 4998 } | 4998 } |
| 4999 return new EmptyFunctionBody(andAdvance); | 4999 return new EmptyFunctionBody(andAdvance); |
| 5000 } else if (_matchesString(_NATIVE)) { | 5000 } else if (_matchesString(_NATIVE)) { |
| 5001 Token nativeToken = andAdvance; | 5001 Token nativeToken = andAdvance; |
| 5002 StringLiteral stringLiteral = null; | 5002 StringLiteral stringLiteral = null; |
| 5003 if (_matches(TokenType.STRING)) { | 5003 if (_matches(TokenType.STRING)) { |
| 5004 stringLiteral = parseStringLiteral(); | 5004 stringLiteral = parseStringLiteral(); |
| 5005 } | 5005 } |
| 5006 return new NativeFunctionBody(nativeToken, stringLiteral, _expect(TokenT
ype.SEMICOLON)); | 5006 return new NativeFunctionBody(nativeToken, stringLiteral, _expect(TokenT
ype.SEMICOLON)); |
| 5007 } | 5007 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 5019 keyword = andAdvance; | 5019 keyword = andAdvance; |
| 5020 if (_matches(TokenType.STAR)) { | 5020 if (_matches(TokenType.STAR)) { |
| 5021 star = andAdvance; | 5021 star = andAdvance; |
| 5022 _inGenerator = true; | 5022 _inGenerator = true; |
| 5023 } | 5023 } |
| 5024 } | 5024 } |
| 5025 } | 5025 } |
| 5026 if (_matches(TokenType.FUNCTION)) { | 5026 if (_matches(TokenType.FUNCTION)) { |
| 5027 if (keyword != null) { | 5027 if (keyword != null) { |
| 5028 if (!_tokenMatchesString(keyword, ASYNC)) { | 5028 if (!_tokenMatchesString(keyword, ASYNC)) { |
| 5029 _reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword, []); | 5029 _reportErrorForToken(ParserErrorCode.INVALID_SYNC, keyword); |
| 5030 keyword = null; | 5030 keyword = null; |
| 5031 } else if (star != null) { | 5031 } else if (star != null) { |
| 5032 _reportErrorForToken(ParserErrorCode.INVALID_STAR_AFTER_ASYNC, star,
[]); | 5032 _reportErrorForToken(ParserErrorCode.INVALID_STAR_AFTER_ASYNC, star)
; |
| 5033 } | 5033 } |
| 5034 } | 5034 } |
| 5035 Token functionDefinition = andAdvance; | 5035 Token functionDefinition = andAdvance; |
| 5036 Expression expression = parseExpression2(); | 5036 Expression expression = parseExpression2(); |
| 5037 Token semicolon = null; | 5037 Token semicolon = null; |
| 5038 if (!inExpression) { | 5038 if (!inExpression) { |
| 5039 semicolon = _expect(TokenType.SEMICOLON); | 5039 semicolon = _expect(TokenType.SEMICOLON); |
| 5040 } | 5040 } |
| 5041 if (!_parseFunctionBodies) { | 5041 if (!_parseFunctionBodies) { |
| 5042 return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON
)); | 5042 return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON
)); |
| 5043 } | 5043 } |
| 5044 return new ExpressionFunctionBody(keyword, functionDefinition, expressio
n, semicolon); | 5044 return new ExpressionFunctionBody(keyword, functionDefinition, expressio
n, semicolon); |
| 5045 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 5045 } else if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 5046 if (keyword != null) { | 5046 if (keyword != null) { |
| 5047 if (_tokenMatchesString(keyword, SYNC) && star == null) { | 5047 if (_tokenMatchesString(keyword, SYNC) && star == null) { |
| 5048 _reportErrorForToken(ParserErrorCode.MISSING_STAR_AFTER_SYNC, keywor
d, []); | 5048 _reportErrorForToken(ParserErrorCode.MISSING_STAR_AFTER_SYNC, keywor
d); |
| 5049 } | 5049 } |
| 5050 } | 5050 } |
| 5051 if (!_parseFunctionBodies) { | 5051 if (!_parseFunctionBodies) { |
| 5052 _skipBlock(); | 5052 _skipBlock(); |
| 5053 return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON
)); | 5053 return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON
)); |
| 5054 } | 5054 } |
| 5055 return new BlockFunctionBody(keyword, star, parseBlock()); | 5055 return new BlockFunctionBody(keyword, star, parseBlock()); |
| 5056 } else { | 5056 } else { |
| 5057 // Invalid function body | 5057 // Invalid function body |
| 5058 _reportErrorForCurrentToken(emptyErrorCode, []); | 5058 _reportErrorForCurrentToken(emptyErrorCode); |
| 5059 return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))
; | 5059 return new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))
; |
| 5060 } | 5060 } |
| 5061 } finally { | 5061 } finally { |
| 5062 _inAsync = wasInAsync; | 5062 _inAsync = wasInAsync; |
| 5063 _inGenerator = wasInGenerator; | 5063 _inGenerator = wasInGenerator; |
| 5064 _inLoop = wasInLoop; | 5064 _inLoop = wasInLoop; |
| 5065 _inSwitch = wasInSwitch; | 5065 _inSwitch = wasInSwitch; |
| 5066 } | 5066 } |
| 5067 } | 5067 } |
| 5068 | 5068 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5091 } else if (_matchesKeyword(Keyword.SET) && !_tokenMatches(_peek(), TokenType
.OPEN_PAREN)) { | 5091 } else if (_matchesKeyword(Keyword.SET) && !_tokenMatches(_peek(), TokenType
.OPEN_PAREN)) { |
| 5092 keyword = andAdvance; | 5092 keyword = andAdvance; |
| 5093 } | 5093 } |
| 5094 SimpleIdentifier name = parseSimpleIdentifier(); | 5094 SimpleIdentifier name = parseSimpleIdentifier(); |
| 5095 FormalParameterList parameters = null; | 5095 FormalParameterList parameters = null; |
| 5096 if (!isGetter) { | 5096 if (!isGetter) { |
| 5097 if (_matches(TokenType.OPEN_PAREN)) { | 5097 if (_matches(TokenType.OPEN_PAREN)) { |
| 5098 parameters = parseFormalParameterList(); | 5098 parameters = parseFormalParameterList(); |
| 5099 _validateFormalParameterList(parameters); | 5099 _validateFormalParameterList(parameters); |
| 5100 } else { | 5100 } else { |
| 5101 _reportErrorForCurrentToken(ParserErrorCode.MISSING_FUNCTION_PARAMETERS,
[]); | 5101 _reportErrorForCurrentToken(ParserErrorCode.MISSING_FUNCTION_PARAMETERS)
; |
| 5102 } | 5102 } |
| 5103 } else if (_matches(TokenType.OPEN_PAREN)) { | 5103 } else if (_matches(TokenType.OPEN_PAREN)) { |
| 5104 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS, []); | 5104 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS); |
| 5105 parseFormalParameterList(); | 5105 parseFormalParameterList(); |
| 5106 } | 5106 } |
| 5107 FunctionBody body; | 5107 FunctionBody body; |
| 5108 if (externalKeyword == null) { | 5108 if (externalKeyword == null) { |
| 5109 body = _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, fa
lse); | 5109 body = _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, fa
lse); |
| 5110 } else { | 5110 } else { |
| 5111 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); | 5111 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); |
| 5112 } | 5112 } |
| 5113 // if (!isStatement && matches(TokenType.SEMICOLON)) { | 5113 // if (!isStatement && matches(TokenType.SEMICOLON)) { |
| 5114 // // TODO(brianwilkerson) Improve this error message. | 5114 // // TODO(brianwilkerson) Improve this error message. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 5145 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 5145 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 5146 * declaration | 5146 * declaration |
| 5147 * @param returnType the return type, or `null` if there is no return type | 5147 * @param returnType the return type, or `null` if there is no return type |
| 5148 * @return the function declaration statement that was parsed | 5148 * @return the function declaration statement that was parsed |
| 5149 */ | 5149 */ |
| 5150 Statement _parseFunctionDeclarationStatementAfterReturnType(CommentAndMetadata
commentAndMetadata, TypeName returnType) { | 5150 Statement _parseFunctionDeclarationStatementAfterReturnType(CommentAndMetadata
commentAndMetadata, TypeName returnType) { |
| 5151 FunctionDeclaration declaration = _parseFunctionDeclaration(commentAndMetada
ta, null, returnType); | 5151 FunctionDeclaration declaration = _parseFunctionDeclaration(commentAndMetada
ta, null, returnType); |
| 5152 Token propertyKeyword = declaration.propertyKeyword; | 5152 Token propertyKeyword = declaration.propertyKeyword; |
| 5153 if (propertyKeyword != null) { | 5153 if (propertyKeyword != null) { |
| 5154 if ((propertyKeyword as KeywordToken).keyword == Keyword.GET) { | 5154 if ((propertyKeyword as KeywordToken).keyword == Keyword.GET) { |
| 5155 _reportErrorForToken(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword
, []); | 5155 _reportErrorForToken(ParserErrorCode.GETTER_IN_FUNCTION, propertyKeyword
); |
| 5156 } else { | 5156 } else { |
| 5157 _reportErrorForToken(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword
, []); | 5157 _reportErrorForToken(ParserErrorCode.SETTER_IN_FUNCTION, propertyKeyword
); |
| 5158 } | 5158 } |
| 5159 } | 5159 } |
| 5160 return new FunctionDeclarationStatement(declaration); | 5160 return new FunctionDeclarationStatement(declaration); |
| 5161 } | 5161 } |
| 5162 | 5162 |
| 5163 /** | 5163 /** |
| 5164 * Parse a function type alias. | 5164 * Parse a function type alias. |
| 5165 * | 5165 * |
| 5166 * <pre> | 5166 * <pre> |
| 5167 * functionTypeAlias ::= | 5167 * functionTypeAlias ::= |
| (...skipping 11 matching lines...) Expand all Loading... |
| 5179 TypeName returnType = null; | 5179 TypeName returnType = null; |
| 5180 if (hasReturnTypeInTypeAlias) { | 5180 if (hasReturnTypeInTypeAlias) { |
| 5181 returnType = parseReturnType(); | 5181 returnType = parseReturnType(); |
| 5182 } | 5182 } |
| 5183 SimpleIdentifier name = parseSimpleIdentifier(); | 5183 SimpleIdentifier name = parseSimpleIdentifier(); |
| 5184 TypeParameterList typeParameters = null; | 5184 TypeParameterList typeParameters = null; |
| 5185 if (_matches(TokenType.LT)) { | 5185 if (_matches(TokenType.LT)) { |
| 5186 typeParameters = parseTypeParameterList(); | 5186 typeParameters = parseTypeParameterList(); |
| 5187 } | 5187 } |
| 5188 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) { | 5188 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.EOF)) { |
| 5189 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []
); | 5189 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS); |
| 5190 FormalParameterList parameters = new FormalParameterList(_createSyntheticT
oken(TokenType.OPEN_PAREN), null, null, null, _createSyntheticToken(TokenType.CL
OSE_PAREN)); | 5190 FormalParameterList parameters = new FormalParameterList(_createSyntheticT
oken(TokenType.OPEN_PAREN), null, null, null, _createSyntheticToken(TokenType.CL
OSE_PAREN)); |
| 5191 Token semicolon = _expect(TokenType.SEMICOLON); | 5191 Token semicolon = _expect(TokenType.SEMICOLON); |
| 5192 return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadat
a.metadata, keyword, returnType, name, typeParameters, parameters, semicolon); | 5192 return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadat
a.metadata, keyword, returnType, name, typeParameters, parameters, semicolon); |
| 5193 } else if (!_matches(TokenType.OPEN_PAREN)) { | 5193 } else if (!_matches(TokenType.OPEN_PAREN)) { |
| 5194 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS, []
); | 5194 _reportErrorForCurrentToken(ParserErrorCode.MISSING_TYPEDEF_PARAMETERS); |
| 5195 // TODO(brianwilkerson) Recover from this error. At the very least we shou
ld skip to the start | 5195 // TODO(brianwilkerson) Recover from this error. At the very least we shou
ld skip to the start |
| 5196 // of the next valid compilation unit member, allowing for the possibility
of finding the | 5196 // of the next valid compilation unit member, allowing for the possibility
of finding the |
| 5197 // typedef parameters before that point. | 5197 // typedef parameters before that point. |
| 5198 return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadat
a.metadata, keyword, returnType, name, typeParameters, new FormalParameterList(_
createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, _createSyntheticTo
ken(TokenType.CLOSE_PAREN)), _createSyntheticToken(TokenType.SEMICOLON)); | 5198 return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadat
a.metadata, keyword, returnType, name, typeParameters, new FormalParameterList(_
createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, _createSyntheticTo
ken(TokenType.CLOSE_PAREN)), _createSyntheticToken(TokenType.SEMICOLON)); |
| 5199 } | 5199 } |
| 5200 FormalParameterList parameters = parseFormalParameterList(); | 5200 FormalParameterList parameters = parseFormalParameterList(); |
| 5201 _validateFormalParameterList(parameters); | 5201 _validateFormalParameterList(parameters); |
| 5202 Token semicolon = _expect(TokenType.SEMICOLON); | 5202 Token semicolon = _expect(TokenType.SEMICOLON); |
| 5203 return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadata.
metadata, keyword, returnType, name, typeParameters, parameters, semicolon); | 5203 return new FunctionTypeAlias(commentAndMetadata.comment, commentAndMetadata.
metadata, keyword, returnType, name, typeParameters, parameters, semicolon); |
| 5204 } | 5204 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 5219 * @param externalKeyword the 'external' token | 5219 * @param externalKeyword the 'external' token |
| 5220 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic | 5220 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic |
| 5221 * @param the return type that has already been parsed, or `null` if there was
no return | 5221 * @param the return type that has already been parsed, or `null` if there was
no return |
| 5222 * type | 5222 * type |
| 5223 * @return the getter that was parsed | 5223 * @return the getter that was parsed |
| 5224 */ | 5224 */ |
| 5225 MethodDeclaration _parseGetter(CommentAndMetadata commentAndMetadata, Token ex
ternalKeyword, Token staticKeyword, TypeName returnType) { | 5225 MethodDeclaration _parseGetter(CommentAndMetadata commentAndMetadata, Token ex
ternalKeyword, Token staticKeyword, TypeName returnType) { |
| 5226 Token propertyKeyword = _expectKeyword(Keyword.GET); | 5226 Token propertyKeyword = _expectKeyword(Keyword.GET); |
| 5227 SimpleIdentifier name = parseSimpleIdentifier(); | 5227 SimpleIdentifier name = parseSimpleIdentifier(); |
| 5228 if (_matches(TokenType.OPEN_PAREN) && _tokenMatches(_peek(), TokenType.CLOSE
_PAREN)) { | 5228 if (_matches(TokenType.OPEN_PAREN) && _tokenMatches(_peek(), TokenType.CLOSE
_PAREN)) { |
| 5229 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS, []); | 5229 _reportErrorForCurrentToken(ParserErrorCode.GETTER_WITH_PARAMETERS); |
| 5230 _advance(); | 5230 _advance(); |
| 5231 _advance(); | 5231 _advance(); |
| 5232 } | 5232 } |
| 5233 FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyw
ord == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false); | 5233 FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyw
ord == null, ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false); |
| 5234 if (externalKeyword != null && body is! EmptyFunctionBody) { | 5234 if (externalKeyword != null && body is! EmptyFunctionBody) { |
| 5235 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY, [])
; | 5235 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY); |
| 5236 } | 5236 } |
| 5237 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, nam
e, null, body); | 5237 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, nam
e, null, body); |
| 5238 } | 5238 } |
| 5239 | 5239 |
| 5240 /** | 5240 /** |
| 5241 * Parse a list of identifiers. | 5241 * Parse a list of identifiers. |
| 5242 * | 5242 * |
| 5243 * <pre> | 5243 * <pre> |
| 5244 * identifierList ::= | 5244 * identifierList ::= |
| 5245 * identifier (',' identifier)* | 5245 * identifier (',' identifier)* |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5296 ImportDirective _parseImportDirective(CommentAndMetadata commentAndMetadata) { | 5296 ImportDirective _parseImportDirective(CommentAndMetadata commentAndMetadata) { |
| 5297 Token importKeyword = _expectKeyword(Keyword.IMPORT); | 5297 Token importKeyword = _expectKeyword(Keyword.IMPORT); |
| 5298 StringLiteral libraryUri = parseStringLiteral(); | 5298 StringLiteral libraryUri = parseStringLiteral(); |
| 5299 Token deferredToken = null; | 5299 Token deferredToken = null; |
| 5300 Token asToken = null; | 5300 Token asToken = null; |
| 5301 SimpleIdentifier prefix = null; | 5301 SimpleIdentifier prefix = null; |
| 5302 if (_matchesKeyword(Keyword.DEFERRED)) { | 5302 if (_matchesKeyword(Keyword.DEFERRED)) { |
| 5303 if (_parseDeferredLibraries) { | 5303 if (_parseDeferredLibraries) { |
| 5304 deferredToken = andAdvance; | 5304 deferredToken = andAdvance; |
| 5305 } else { | 5305 } else { |
| 5306 _reportErrorForCurrentToken(ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORT
ED, []); | 5306 _reportErrorForCurrentToken(ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORT
ED); |
| 5307 _advance(); | 5307 _advance(); |
| 5308 } | 5308 } |
| 5309 } | 5309 } |
| 5310 if (_matchesKeyword(Keyword.AS)) { | 5310 if (_matchesKeyword(Keyword.AS)) { |
| 5311 asToken = andAdvance; | 5311 asToken = andAdvance; |
| 5312 prefix = parseSimpleIdentifier(); | 5312 prefix = parseSimpleIdentifier(); |
| 5313 } else if (deferredToken != null) { | 5313 } else if (deferredToken != null) { |
| 5314 _reportErrorForCurrentToken(ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMP
ORT, []); | 5314 _reportErrorForCurrentToken(ParserErrorCode.MISSING_PREFIX_IN_DEFERRED_IMP
ORT); |
| 5315 } | 5315 } |
| 5316 List<Combinator> combinators = _parseCombinators(); | 5316 List<Combinator> combinators = _parseCombinators(); |
| 5317 Token semicolon = _expectSemicolon(); | 5317 Token semicolon = _expectSemicolon(); |
| 5318 return new ImportDirective(commentAndMetadata.comment, commentAndMetadata.me
tadata, importKeyword, libraryUri, deferredToken, asToken, prefix, combinators,
semicolon); | 5318 return new ImportDirective(commentAndMetadata.comment, commentAndMetadata.me
tadata, importKeyword, libraryUri, deferredToken, asToken, prefix, combinators,
semicolon); |
| 5319 } | 5319 } |
| 5320 | 5320 |
| 5321 /** | 5321 /** |
| 5322 * Parse a list of initialized identifiers. | 5322 * Parse a list of initialized identifiers. |
| 5323 * | 5323 * |
| 5324 * <pre> | 5324 * <pre> |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5394 * missing | 5394 * missing |
| 5395 * @return the library name that was parsed | 5395 * @return the library name that was parsed |
| 5396 */ | 5396 */ |
| 5397 LibraryIdentifier _parseLibraryName(ParserErrorCode missingNameError, Token mi
ssingNameToken) { | 5397 LibraryIdentifier _parseLibraryName(ParserErrorCode missingNameError, Token mi
ssingNameToken) { |
| 5398 if (_matchesIdentifier()) { | 5398 if (_matchesIdentifier()) { |
| 5399 return parseLibraryIdentifier(); | 5399 return parseLibraryIdentifier(); |
| 5400 } else if (_matches(TokenType.STRING)) { | 5400 } else if (_matches(TokenType.STRING)) { |
| 5401 // TODO(brianwilkerson) Recovery: This should be extended to handle arbitr
ary tokens until we | 5401 // TODO(brianwilkerson) Recovery: This should be extended to handle arbitr
ary tokens until we |
| 5402 // can find a token that can start a compilation unit member. | 5402 // can find a token that can start a compilation unit member. |
| 5403 StringLiteral string = parseStringLiteral(); | 5403 StringLiteral string = parseStringLiteral(); |
| 5404 _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string, [
]); | 5404 _reportErrorForNode(ParserErrorCode.NON_IDENTIFIER_LIBRARY_NAME, string); |
| 5405 } else { | 5405 } else { |
| 5406 _reportErrorForToken(missingNameError, missingNameToken, []); | 5406 _reportErrorForToken(missingNameError, missingNameToken); |
| 5407 } | 5407 } |
| 5408 List<SimpleIdentifier> components = new List<SimpleIdentifier>(); | 5408 List<SimpleIdentifier> components = new List<SimpleIdentifier>(); |
| 5409 components.add(_createSyntheticIdentifier()); | 5409 components.add(_createSyntheticIdentifier()); |
| 5410 return new LibraryIdentifier(components); | 5410 return new LibraryIdentifier(components); |
| 5411 } | 5411 } |
| 5412 | 5412 |
| 5413 /** | 5413 /** |
| 5414 * Parse a list literal. | 5414 * Parse a list literal. |
| 5415 * | 5415 * |
| 5416 * <pre> | 5416 * <pre> |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5475 TypedLiteral _parseListOrMapLiteral(Token modifier) { | 5475 TypedLiteral _parseListOrMapLiteral(Token modifier) { |
| 5476 TypeArgumentList typeArguments = null; | 5476 TypeArgumentList typeArguments = null; |
| 5477 if (_matches(TokenType.LT)) { | 5477 if (_matches(TokenType.LT)) { |
| 5478 typeArguments = parseTypeArgumentList(); | 5478 typeArguments = parseTypeArgumentList(); |
| 5479 } | 5479 } |
| 5480 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { | 5480 if (_matches(TokenType.OPEN_CURLY_BRACKET)) { |
| 5481 return _parseMapLiteral(modifier, typeArguments); | 5481 return _parseMapLiteral(modifier, typeArguments); |
| 5482 } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.IND
EX)) { | 5482 } else if (_matches(TokenType.OPEN_SQUARE_BRACKET) || _matches(TokenType.IND
EX)) { |
| 5483 return _parseListLiteral(modifier, typeArguments); | 5483 return _parseListLiteral(modifier, typeArguments); |
| 5484 } | 5484 } |
| 5485 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL, []
); | 5485 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL); |
| 5486 return new ListLiteral(modifier, typeArguments, _createSyntheticToken(TokenT
ype.OPEN_SQUARE_BRACKET), null, _createSyntheticToken(TokenType.CLOSE_SQUARE_BRA
CKET)); | 5486 return new ListLiteral(modifier, typeArguments, _createSyntheticToken(TokenT
ype.OPEN_SQUARE_BRACKET), null, _createSyntheticToken(TokenType.CLOSE_SQUARE_BRA
CKET)); |
| 5487 } | 5487 } |
| 5488 | 5488 |
| 5489 /** | 5489 /** |
| 5490 * Parse a logical and expression. | 5490 * Parse a logical and expression. |
| 5491 * | 5491 * |
| 5492 * <pre> | 5492 * <pre> |
| 5493 * logicalAndExpression ::= | 5493 * logicalAndExpression ::= |
| 5494 * equalityExpression ('&&' equalityExpression)* | 5494 * equalityExpression ('&&' equalityExpression)* |
| 5495 * </pre> | 5495 * </pre> |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5557 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic | 5557 * @param staticKeyword the static keyword, or `null` if the getter is not sta
tic |
| 5558 * @param returnType the return type of the method | 5558 * @param returnType the return type of the method |
| 5559 * @param name the name of the method | 5559 * @param name the name of the method |
| 5560 * @param parameters the parameters to the method | 5560 * @param parameters the parameters to the method |
| 5561 * @return the method declaration that was parsed | 5561 * @return the method declaration that was parsed |
| 5562 */ | 5562 */ |
| 5563 MethodDeclaration _parseMethodDeclarationAfterParameters(CommentAndMetadata co
mmentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnTyp
e, SimpleIdentifier name, FormalParameterList parameters) { | 5563 MethodDeclaration _parseMethodDeclarationAfterParameters(CommentAndMetadata co
mmentAndMetadata, Token externalKeyword, Token staticKeyword, TypeName returnTyp
e, SimpleIdentifier name, FormalParameterList parameters) { |
| 5564 FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyw
ord == null, ParserErrorCode.MISSING_FUNCTION_BODY, false); | 5564 FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyw
ord == null, ParserErrorCode.MISSING_FUNCTION_BODY, false); |
| 5565 if (externalKeyword != null) { | 5565 if (externalKeyword != null) { |
| 5566 if (body is! EmptyFunctionBody) { | 5566 if (body is! EmptyFunctionBody) { |
| 5567 _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body, [])
; | 5567 _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body); |
| 5568 } | 5568 } |
| 5569 } else if (staticKeyword != null) { | 5569 } else if (staticKeyword != null) { |
| 5570 if (body is EmptyFunctionBody) { | 5570 if (body is EmptyFunctionBody) { |
| 5571 _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body, []); | 5571 _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body); |
| 5572 } | 5572 } |
| 5573 } | 5573 } |
| 5574 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, staticKeyword, returnType, null, null, name, paramete
rs, body); | 5574 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, staticKeyword, returnType, null, null, name, paramete
rs, body); |
| 5575 } | 5575 } |
| 5576 | 5576 |
| 5577 /** | 5577 /** |
| 5578 * Parse a method declaration. | 5578 * Parse a method declaration. |
| 5579 * | 5579 * |
| 5580 * <pre> | 5580 * <pre> |
| 5581 * functionDeclaration ::= | 5581 * functionDeclaration ::= |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5798 return _parseFunctionDeclarationStatementAfterReturnType(commentAndMet
adata, returnType); | 5798 return _parseFunctionDeclarationStatementAfterReturnType(commentAndMet
adata, returnType); |
| 5799 } else { | 5799 } else { |
| 5800 // | 5800 // |
| 5801 // We have found an error of some kind. Try to recover. | 5801 // We have found an error of some kind. Try to recover. |
| 5802 // | 5802 // |
| 5803 if (_matchesIdentifier()) { | 5803 if (_matchesIdentifier()) { |
| 5804 if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEM
ICOLON])) { | 5804 if (_peek().matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEM
ICOLON])) { |
| 5805 // | 5805 // |
| 5806 // We appear to have a variable declaration with a type of "void". | 5806 // We appear to have a variable declaration with a type of "void". |
| 5807 // | 5807 // |
| 5808 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType, [])
; | 5808 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 5809 return _parseVariableDeclarationStatementAfterMetadata(commentAndM
etadata); | 5809 return _parseVariableDeclarationStatementAfterMetadata(commentAndM
etadata); |
| 5810 } | 5810 } |
| 5811 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 5811 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 5812 // | 5812 // |
| 5813 // We appear to have found an incomplete statement at the end of a b
lock. Parse it as a | 5813 // We appear to have found an incomplete statement at the end of a b
lock. Parse it as a |
| 5814 // variable declaration. | 5814 // variable declaration. |
| 5815 // | 5815 // |
| 5816 return _parseVariableDeclarationStatementAfterType(commentAndMetadat
a, null, returnType); | 5816 return _parseVariableDeclarationStatementAfterType(commentAndMetadat
a, null, returnType); |
| 5817 } | 5817 } |
| 5818 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []); | 5818 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 5819 // TODO(brianwilkerson) Recover from this error. | 5819 // TODO(brianwilkerson) Recover from this error. |
| 5820 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 5820 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 5821 } | 5821 } |
| 5822 } else if (keyword == Keyword.CONST) { | 5822 } else if (keyword == Keyword.CONST) { |
| 5823 if (_peek().matchesAny([ | 5823 if (_peek().matchesAny([ |
| 5824 TokenType.LT, | 5824 TokenType.LT, |
| 5825 TokenType.OPEN_CURLY_BRACKET, | 5825 TokenType.OPEN_CURLY_BRACKET, |
| 5826 TokenType.OPEN_SQUARE_BRACKET, | 5826 TokenType.OPEN_SQUARE_BRACKET, |
| 5827 TokenType.INDEX])) { | 5827 TokenType.INDEX])) { |
| 5828 return new ExpressionStatement(parseExpression2(), _expect(TokenType.S
EMICOLON)); | 5828 return new ExpressionStatement(parseExpression2(), _expect(TokenType.S
EMICOLON)); |
| 5829 } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) { | 5829 } else if (_tokenMatches(_peek(), TokenType.IDENTIFIER)) { |
| 5830 Token afterType = _skipTypeName(_peek()); | 5830 Token afterType = _skipTypeName(_peek()); |
| 5831 if (afterType != null) { | 5831 if (afterType != null) { |
| 5832 if (_tokenMatches(afterType, TokenType.OPEN_PAREN) || (_tokenMatches
(afterType, TokenType.PERIOD) && _tokenMatches(afterType.next, TokenType.IDENTIF
IER) && _tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) { | 5832 if (_tokenMatches(afterType, TokenType.OPEN_PAREN) || (_tokenMatches
(afterType, TokenType.PERIOD) && _tokenMatches(afterType.next, TokenType.IDENTIF
IER) && _tokenMatches(afterType.next.next, TokenType.OPEN_PAREN))) { |
| 5833 return new ExpressionStatement(parseExpression2(), _expect(TokenTy
pe.SEMICOLON)); | 5833 return new ExpressionStatement(parseExpression2(), _expect(TokenTy
pe.SEMICOLON)); |
| 5834 } | 5834 } |
| 5835 } | 5835 } |
| 5836 } | 5836 } |
| 5837 return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadat
a); | 5837 return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadat
a); |
| 5838 } else if (keyword == Keyword.NEW || keyword == Keyword.TRUE || keyword ==
Keyword.FALSE || keyword == Keyword.NULL || keyword == Keyword.SUPER || keyword
== Keyword.THIS) { | 5838 } else if (keyword == Keyword.NEW || keyword == Keyword.TRUE || keyword ==
Keyword.FALSE || keyword == Keyword.NULL || keyword == Keyword.SUPER || keyword
== Keyword.THIS) { |
| 5839 return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEM
ICOLON)); | 5839 return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEM
ICOLON)); |
| 5840 } else { | 5840 } else { |
| 5841 // | 5841 // |
| 5842 // We have found an error of some kind. Try to recover. | 5842 // We have found an error of some kind. Try to recover. |
| 5843 // | 5843 // |
| 5844 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []); | 5844 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 5845 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 5845 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 5846 } | 5846 } |
| 5847 } else if (_inGenerator && _matchesString(_YIELD)) { | 5847 } else if (_inGenerator && _matchesString(_YIELD)) { |
| 5848 return _parseYieldStatement(); | 5848 return _parseYieldStatement(); |
| 5849 } else if (_inAsync && _matchesString(_AWAIT)) { | 5849 } else if (_inAsync && _matchesString(_AWAIT)) { |
| 5850 if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) { | 5850 if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) { |
| 5851 return _parseForStatement(); | 5851 return _parseForStatement(); |
| 5852 } | 5852 } |
| 5853 return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMIC
OLON)); | 5853 return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMIC
OLON)); |
| 5854 } else if (_matchesString(_AWAIT) && _tokenMatchesKeyword(_peek(), Keyword.F
OR)) { | 5854 } else if (_matchesString(_AWAIT) && _tokenMatchesKeyword(_peek(), Keyword.F
OR)) { |
| 5855 Token awaitToken = _currentToken; | 5855 Token awaitToken = _currentToken; |
| 5856 Statement statement = _parseForStatement(); | 5856 Statement statement = _parseForStatement(); |
| 5857 if (statement is! ForStatement) { | 5857 if (statement is! ForStatement) { |
| 5858 _reportErrorForToken(CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, aw
aitToken, []); | 5858 _reportErrorForToken(CompileTimeErrorCode.ASYNC_FOR_IN_WRONG_CONTEXT, aw
aitToken); |
| 5859 } | 5859 } |
| 5860 return statement; | 5860 return statement; |
| 5861 } else if (_matches(TokenType.SEMICOLON)) { | 5861 } else if (_matches(TokenType.SEMICOLON)) { |
| 5862 return _parseEmptyStatement(); | 5862 return _parseEmptyStatement(); |
| 5863 } else if (_isInitializedVariableDeclaration()) { | 5863 } else if (_isInitializedVariableDeclaration()) { |
| 5864 return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata)
; | 5864 return _parseVariableDeclarationStatementAfterMetadata(commentAndMetadata)
; |
| 5865 } else if (_isFunctionDeclaration()) { | 5865 } else if (_isFunctionDeclaration()) { |
| 5866 return _parseFunctionDeclarationStatement(); | 5866 return _parseFunctionDeclarationStatement(); |
| 5867 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { | 5867 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 5868 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT, []); | 5868 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 5869 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 5869 return new EmptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 5870 } else { | 5870 } else { |
| 5871 return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMIC
OLON)); | 5871 return new ExpressionStatement(parseExpression2(), _expect(TokenType.SEMIC
OLON)); |
| 5872 } | 5872 } |
| 5873 } | 5873 } |
| 5874 | 5874 |
| 5875 /** | 5875 /** |
| 5876 * Parse an operator declaration. | 5876 * Parse an operator declaration. |
| 5877 * | 5877 * |
| 5878 * <pre> | 5878 * <pre> |
| 5879 * operatorDeclaration ::= | 5879 * operatorDeclaration ::= |
| 5880 * operatorSignature (';' | functionBody) | 5880 * operatorSignature (';' | functionBody) |
| 5881 * | 5881 * |
| 5882 * operatorSignature ::= | 5882 * operatorSignature ::= |
| 5883 * 'external'? returnType? 'operator' operator formalParameterList | 5883 * 'external'? returnType? 'operator' operator formalParameterList |
| 5884 * </pre> | 5884 * </pre> |
| 5885 * | 5885 * |
| 5886 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the | 5886 * @param commentAndMetadata the documentation comment and metadata to be asso
ciated with the |
| 5887 * declaration | 5887 * declaration |
| 5888 * @param externalKeyword the 'external' token | 5888 * @param externalKeyword the 'external' token |
| 5889 * @param the return type that has already been parsed, or `null` if there was
no return | 5889 * @param the return type that has already been parsed, or `null` if there was
no return |
| 5890 * type | 5890 * type |
| 5891 * @return the operator declaration that was parsed | 5891 * @return the operator declaration that was parsed |
| 5892 */ | 5892 */ |
| 5893 MethodDeclaration _parseOperator(CommentAndMetadata commentAndMetadata, Token
externalKeyword, TypeName returnType) { | 5893 MethodDeclaration _parseOperator(CommentAndMetadata commentAndMetadata, Token
externalKeyword, TypeName returnType) { |
| 5894 Token operatorKeyword; | 5894 Token operatorKeyword; |
| 5895 if (_matchesKeyword(Keyword.OPERATOR)) { | 5895 if (_matchesKeyword(Keyword.OPERATOR)) { |
| 5896 operatorKeyword = andAdvance; | 5896 operatorKeyword = andAdvance; |
| 5897 } else { | 5897 } else { |
| 5898 _reportErrorForToken(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentTok
en, []); | 5898 _reportErrorForToken(ParserErrorCode.MISSING_KEYWORD_OPERATOR, _currentTok
en); |
| 5899 operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR); | 5899 operatorKeyword = _createSyntheticKeyword(Keyword.OPERATOR); |
| 5900 } | 5900 } |
| 5901 if (!_currentToken.isUserDefinableOperator) { | 5901 if (!_currentToken.isUserDefinableOperator) { |
| 5902 _reportErrorForCurrentToken(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [
_currentToken.lexeme]); | 5902 _reportErrorForCurrentToken(ParserErrorCode.NON_USER_DEFINABLE_OPERATOR, [
_currentToken.lexeme]); |
| 5903 } | 5903 } |
| 5904 SimpleIdentifier name = new SimpleIdentifier(andAdvance); | 5904 SimpleIdentifier name = new SimpleIdentifier(andAdvance); |
| 5905 if (_matches(TokenType.EQ)) { | 5905 if (_matches(TokenType.EQ)) { |
| 5906 Token previous = _currentToken.previous; | 5906 Token previous = _currentToken.previous; |
| 5907 if ((_tokenMatches(previous, TokenType.EQ_EQ) || _tokenMatches(previous, T
okenType.BANG_EQ)) && _currentToken.offset == previous.offset + 2) { | 5907 if ((_tokenMatches(previous, TokenType.EQ_EQ) || _tokenMatches(previous, T
okenType.BANG_EQ)) && _currentToken.offset == previous.offset + 2) { |
| 5908 _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR, ["${previo
us.lexeme}${_currentToken.lexeme}"]); | 5908 _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR, ["${previo
us.lexeme}${_currentToken.lexeme}"]); |
| 5909 _advance(); | 5909 _advance(); |
| 5910 } | 5910 } |
| 5911 } | 5911 } |
| 5912 FormalParameterList parameters = parseFormalParameterList(); | 5912 FormalParameterList parameters = parseFormalParameterList(); |
| 5913 _validateFormalParameterList(parameters); | 5913 _validateFormalParameterList(parameters); |
| 5914 FunctionBody body = _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTIO
N_BODY, false); | 5914 FunctionBody body = _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTIO
N_BODY, false); |
| 5915 if (externalKeyword != null && body is! EmptyFunctionBody) { | 5915 if (externalKeyword != null && body is! EmptyFunctionBody) { |
| 5916 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY, [
]); | 5916 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY); |
| 5917 } | 5917 } |
| 5918 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, null, returnType, null, operatorKeyword, name, parame
ters, body); | 5918 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, null, returnType, null, operatorKeyword, name, parame
ters, body); |
| 5919 } | 5919 } |
| 5920 | 5920 |
| 5921 /** | 5921 /** |
| 5922 * Parse a return type if one is given, otherwise return `null` without advanc
ing. | 5922 * Parse a return type if one is given, otherwise return `null` without advanc
ing. |
| 5923 * | 5923 * |
| 5924 * @return the return type that was parsed | 5924 * @return the return type that was parsed |
| 5925 */ | 5925 */ |
| 5926 TypeName _parseOptionalReturnType() { | 5926 TypeName _parseOptionalReturnType() { |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6113 // | 6113 // |
| 6114 // Recover from having a return type of "void" where a return type is not
expected. | 6114 // Recover from having a return type of "void" where a return type is not
expected. |
| 6115 // | 6115 // |
| 6116 // TODO(brianwilkerson) Improve this error message. | 6116 // TODO(brianwilkerson) Improve this error message. |
| 6117 _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TOKEN, [_currentTok
en.lexeme]); | 6117 _reportErrorForCurrentToken(ParserErrorCode.UNEXPECTED_TOKEN, [_currentTok
en.lexeme]); |
| 6118 _advance(); | 6118 _advance(); |
| 6119 return _parsePrimaryExpression(); | 6119 return _parsePrimaryExpression(); |
| 6120 } else if (_matches(TokenType.HASH)) { | 6120 } else if (_matches(TokenType.HASH)) { |
| 6121 return _parseSymbolLiteral(); | 6121 return _parseSymbolLiteral(); |
| 6122 } else { | 6122 } else { |
| 6123 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 6123 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 6124 return _createSyntheticIdentifier(); | 6124 return _createSyntheticIdentifier(); |
| 6125 } | 6125 } |
| 6126 } | 6126 } |
| 6127 | 6127 |
| 6128 /** | 6128 /** |
| 6129 * Parse a redirecting constructor invocation. | 6129 * Parse a redirecting constructor invocation. |
| 6130 * | 6130 * |
| 6131 * <pre> | 6131 * <pre> |
| 6132 * redirectingConstructorInvocation ::= | 6132 * redirectingConstructorInvocation ::= |
| 6133 * 'this' ('.' identifier)? arguments | 6133 * 'this' ('.' identifier)? arguments |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6234 * type | 6234 * type |
| 6235 * @return the setter that was parsed | 6235 * @return the setter that was parsed |
| 6236 */ | 6236 */ |
| 6237 MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata, Token ex
ternalKeyword, Token staticKeyword, TypeName returnType) { | 6237 MethodDeclaration _parseSetter(CommentAndMetadata commentAndMetadata, Token ex
ternalKeyword, Token staticKeyword, TypeName returnType) { |
| 6238 Token propertyKeyword = _expectKeyword(Keyword.SET); | 6238 Token propertyKeyword = _expectKeyword(Keyword.SET); |
| 6239 SimpleIdentifier name = parseSimpleIdentifier(); | 6239 SimpleIdentifier name = parseSimpleIdentifier(); |
| 6240 FormalParameterList parameters = parseFormalParameterList(); | 6240 FormalParameterList parameters = parseFormalParameterList(); |
| 6241 _validateFormalParameterList(parameters); | 6241 _validateFormalParameterList(parameters); |
| 6242 FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyw
ord == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false); | 6242 FunctionBody body = _parseFunctionBody(externalKeyword != null || staticKeyw
ord == null, ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false); |
| 6243 if (externalKeyword != null && body is! EmptyFunctionBody) { | 6243 if (externalKeyword != null && body is! EmptyFunctionBody) { |
| 6244 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY, [])
; | 6244 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY); |
| 6245 } | 6245 } |
| 6246 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, nam
e, parameters, body); | 6246 return new MethodDeclaration(commentAndMetadata.comment, commentAndMetadata.
metadata, externalKeyword, staticKeyword, returnType, propertyKeyword, null, nam
e, parameters, body); |
| 6247 } | 6247 } |
| 6248 | 6248 |
| 6249 /** | 6249 /** |
| 6250 * Parse a shift expression. | 6250 * Parse a shift expression. |
| 6251 * | 6251 * |
| 6252 * <pre> | 6252 * <pre> |
| 6253 * shiftExpression ::= | 6253 * shiftExpression ::= |
| 6254 * additiveExpression (shiftOperator additiveExpression)* | 6254 * additiveExpression (shiftOperator additiveExpression)* |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6399 } | 6399 } |
| 6400 Token colon = _expect(TokenType.COLON); | 6400 Token colon = _expect(TokenType.COLON); |
| 6401 labels.add(new Label(identifier, colon)); | 6401 labels.add(new Label(identifier, colon)); |
| 6402 } | 6402 } |
| 6403 if (_matchesKeyword(Keyword.CASE)) { | 6403 if (_matchesKeyword(Keyword.CASE)) { |
| 6404 Token caseKeyword = andAdvance; | 6404 Token caseKeyword = andAdvance; |
| 6405 Expression caseExpression = parseExpression2(); | 6405 Expression caseExpression = parseExpression2(); |
| 6406 Token colon = _expect(TokenType.COLON); | 6406 Token colon = _expect(TokenType.COLON); |
| 6407 members.add(new SwitchCase(labels, caseKeyword, caseExpression, colon,
_parseStatementList())); | 6407 members.add(new SwitchCase(labels, caseKeyword, caseExpression, colon,
_parseStatementList())); |
| 6408 if (defaultKeyword != null) { | 6408 if (defaultKeyword != null) { |
| 6409 _reportErrorForToken(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_C
ASE, caseKeyword, []); | 6409 _reportErrorForToken(ParserErrorCode.SWITCH_HAS_CASE_AFTER_DEFAULT_C
ASE, caseKeyword); |
| 6410 } | 6410 } |
| 6411 } else if (_matchesKeyword(Keyword.DEFAULT)) { | 6411 } else if (_matchesKeyword(Keyword.DEFAULT)) { |
| 6412 if (defaultKeyword != null) { | 6412 if (defaultKeyword != null) { |
| 6413 _reportErrorForToken(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CAS
ES, _peek(), []); | 6413 _reportErrorForToken(ParserErrorCode.SWITCH_HAS_MULTIPLE_DEFAULT_CAS
ES, _peek()); |
| 6414 } | 6414 } |
| 6415 defaultKeyword = andAdvance; | 6415 defaultKeyword = andAdvance; |
| 6416 Token colon = _expect(TokenType.COLON); | 6416 Token colon = _expect(TokenType.COLON); |
| 6417 members.add(new SwitchDefault(labels, defaultKeyword, colon, _parseSta
tementList())); | 6417 members.add(new SwitchDefault(labels, defaultKeyword, colon, _parseSta
tementList())); |
| 6418 } else { | 6418 } else { |
| 6419 // We need to advance, otherwise we could end up in an infinite loop,
but this could be a | 6419 // We need to advance, otherwise we could end up in an infinite loop,
but this could be a |
| 6420 // lot smarter about recovering from the error. | 6420 // lot smarter about recovering from the error. |
| 6421 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT,
[]); | 6421 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT); |
| 6422 while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRA
CKET) && !_matchesKeyword(Keyword.CASE) && !_matchesKeyword(Keyword.DEFAULT)) { | 6422 while (!_matches(TokenType.EOF) && !_matches(TokenType.CLOSE_CURLY_BRA
CKET) && !_matchesKeyword(Keyword.CASE) && !_matchesKeyword(Keyword.DEFAULT)) { |
| 6423 _advance(); | 6423 _advance(); |
| 6424 } | 6424 } |
| 6425 } | 6425 } |
| 6426 } | 6426 } |
| 6427 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); | 6427 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); |
| 6428 return new SwitchStatement(keyword, leftParenthesis, expression, rightPare
nthesis, leftBracket, members, rightBracket); | 6428 return new SwitchStatement(keyword, leftParenthesis, expression, rightPare
nthesis, leftBracket, members, rightBracket); |
| 6429 } finally { | 6429 } finally { |
| 6430 _inSwitch = wasInSwitch; | 6430 _inSwitch = wasInSwitch; |
| 6431 } | 6431 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 6444 SymbolLiteral _parseSymbolLiteral() { | 6444 SymbolLiteral _parseSymbolLiteral() { |
| 6445 Token poundSign = andAdvance; | 6445 Token poundSign = andAdvance; |
| 6446 List<Token> components = new List<Token>(); | 6446 List<Token> components = new List<Token>(); |
| 6447 if (_matchesIdentifier()) { | 6447 if (_matchesIdentifier()) { |
| 6448 components.add(andAdvance); | 6448 components.add(andAdvance); |
| 6449 while (_matches(TokenType.PERIOD)) { | 6449 while (_matches(TokenType.PERIOD)) { |
| 6450 _advance(); | 6450 _advance(); |
| 6451 if (_matchesIdentifier()) { | 6451 if (_matchesIdentifier()) { |
| 6452 components.add(andAdvance); | 6452 components.add(andAdvance); |
| 6453 } else { | 6453 } else { |
| 6454 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 6454 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 6455 components.add(_createSyntheticToken(TokenType.IDENTIFIER)); | 6455 components.add(_createSyntheticToken(TokenType.IDENTIFIER)); |
| 6456 break; | 6456 break; |
| 6457 } | 6457 } |
| 6458 } | 6458 } |
| 6459 } else if (_currentToken.isOperator) { | 6459 } else if (_currentToken.isOperator) { |
| 6460 components.add(andAdvance); | 6460 components.add(andAdvance); |
| 6461 } else if (_tokenMatchesKeyword(_currentToken, Keyword.VOID)) { | 6461 } else if (_tokenMatchesKeyword(_currentToken, Keyword.VOID)) { |
| 6462 components.add(andAdvance); | 6462 components.add(andAdvance); |
| 6463 } else { | 6463 } else { |
| 6464 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 6464 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 6465 components.add(_createSyntheticToken(TokenType.IDENTIFIER)); | 6465 components.add(_createSyntheticToken(TokenType.IDENTIFIER)); |
| 6466 } | 6466 } |
| 6467 return new SymbolLiteral(poundSign, components); | 6467 return new SymbolLiteral(poundSign, components); |
| 6468 } | 6468 } |
| 6469 | 6469 |
| 6470 /** | 6470 /** |
| 6471 * Parse a throw expression. | 6471 * Parse a throw expression. |
| 6472 * | 6472 * |
| 6473 * <pre> | 6473 * <pre> |
| 6474 * throwExpression ::= | 6474 * throwExpression ::= |
| 6475 * 'throw' expression | 6475 * 'throw' expression |
| 6476 * </pre> | 6476 * </pre> |
| 6477 * | 6477 * |
| 6478 * @return the throw expression that was parsed | 6478 * @return the throw expression that was parsed |
| 6479 */ | 6479 */ |
| 6480 Expression _parseThrowExpression() { | 6480 Expression _parseThrowExpression() { |
| 6481 Token keyword = _expectKeyword(Keyword.THROW); | 6481 Token keyword = _expectKeyword(Keyword.THROW); |
| 6482 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { | 6482 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { |
| 6483 _reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _current
Token, []); | 6483 _reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _current
Token); |
| 6484 return new ThrowExpression(keyword, _createSyntheticIdentifier()); | 6484 return new ThrowExpression(keyword, _createSyntheticIdentifier()); |
| 6485 } | 6485 } |
| 6486 Expression expression = parseExpression2(); | 6486 Expression expression = parseExpression2(); |
| 6487 return new ThrowExpression(keyword, expression); | 6487 return new ThrowExpression(keyword, expression); |
| 6488 } | 6488 } |
| 6489 | 6489 |
| 6490 /** | 6490 /** |
| 6491 * Parse a throw expression. | 6491 * Parse a throw expression. |
| 6492 * | 6492 * |
| 6493 * <pre> | 6493 * <pre> |
| 6494 * throwExpressionWithoutCascade ::= | 6494 * throwExpressionWithoutCascade ::= |
| 6495 * 'throw' expressionWithoutCascade | 6495 * 'throw' expressionWithoutCascade |
| 6496 * </pre> | 6496 * </pre> |
| 6497 * | 6497 * |
| 6498 * @return the throw expression that was parsed | 6498 * @return the throw expression that was parsed |
| 6499 */ | 6499 */ |
| 6500 Expression _parseThrowExpressionWithoutCascade() { | 6500 Expression _parseThrowExpressionWithoutCascade() { |
| 6501 Token keyword = _expectKeyword(Keyword.THROW); | 6501 Token keyword = _expectKeyword(Keyword.THROW); |
| 6502 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { | 6502 if (_matches(TokenType.SEMICOLON) || _matches(TokenType.CLOSE_PAREN)) { |
| 6503 _reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _current
Token, []); | 6503 _reportErrorForToken(ParserErrorCode.MISSING_EXPRESSION_IN_THROW, _current
Token); |
| 6504 return new ThrowExpression(keyword, _createSyntheticIdentifier()); | 6504 return new ThrowExpression(keyword, _createSyntheticIdentifier()); |
| 6505 } | 6505 } |
| 6506 Expression expression = parseExpressionWithoutCascade(); | 6506 Expression expression = parseExpressionWithoutCascade(); |
| 6507 return new ThrowExpression(keyword, expression); | 6507 return new ThrowExpression(keyword, expression); |
| 6508 } | 6508 } |
| 6509 | 6509 |
| 6510 /** | 6510 /** |
| 6511 * Parse a try statement. | 6511 * Parse a try statement. |
| 6512 * | 6512 * |
| 6513 * <pre> | 6513 * <pre> |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6557 } | 6557 } |
| 6558 Block catchBody = parseBlock(); | 6558 Block catchBody = parseBlock(); |
| 6559 catchClauses.add(new CatchClause(onKeyword, exceptionType, catchKeyword, l
eftParenthesis, exceptionParameter, comma, stackTraceParameter, rightParenthesis
, catchBody)); | 6559 catchClauses.add(new CatchClause(onKeyword, exceptionType, catchKeyword, l
eftParenthesis, exceptionParameter, comma, stackTraceParameter, rightParenthesis
, catchBody)); |
| 6560 } | 6560 } |
| 6561 Token finallyKeyword = null; | 6561 Token finallyKeyword = null; |
| 6562 if (_matchesKeyword(Keyword.FINALLY)) { | 6562 if (_matchesKeyword(Keyword.FINALLY)) { |
| 6563 finallyKeyword = andAdvance; | 6563 finallyKeyword = andAdvance; |
| 6564 finallyClause = parseBlock(); | 6564 finallyClause = parseBlock(); |
| 6565 } else { | 6565 } else { |
| 6566 if (catchClauses.isEmpty) { | 6566 if (catchClauses.isEmpty) { |
| 6567 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY, []
); | 6567 _reportErrorForCurrentToken(ParserErrorCode.MISSING_CATCH_OR_FINALLY); |
| 6568 } | 6568 } |
| 6569 } | 6569 } |
| 6570 return new TryStatement(tryKeyword, body, catchClauses, finallyKeyword, fina
llyClause); | 6570 return new TryStatement(tryKeyword, body, catchClauses, finallyKeyword, fina
llyClause); |
| 6571 } | 6571 } |
| 6572 | 6572 |
| 6573 /** | 6573 /** |
| 6574 * Parse a type alias. | 6574 * Parse a type alias. |
| 6575 * | 6575 * |
| 6576 * <pre> | 6576 * <pre> |
| 6577 * typeAlias ::= | 6577 * typeAlias ::= |
| (...skipping 20 matching lines...) Expand all Loading... |
| 6598 * @return the type alias that was parsed | 6598 * @return the type alias that was parsed |
| 6599 */ | 6599 */ |
| 6600 TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) { | 6600 TypeAlias _parseTypeAlias(CommentAndMetadata commentAndMetadata) { |
| 6601 Token keyword = _expectKeyword(Keyword.TYPEDEF); | 6601 Token keyword = _expectKeyword(Keyword.TYPEDEF); |
| 6602 if (_matchesIdentifier()) { | 6602 if (_matchesIdentifier()) { |
| 6603 Token next = _peek(); | 6603 Token next = _peek(); |
| 6604 if (_tokenMatches(next, TokenType.LT)) { | 6604 if (_tokenMatches(next, TokenType.LT)) { |
| 6605 next = _skipTypeParameterList(next); | 6605 next = _skipTypeParameterList(next); |
| 6606 if (next != null && _tokenMatches(next, TokenType.EQ)) { | 6606 if (next != null && _tokenMatches(next, TokenType.EQ)) { |
| 6607 TypeAlias typeAlias = _parseClassTypeAlias(commentAndMetadata, null, k
eyword); | 6607 TypeAlias typeAlias = _parseClassTypeAlias(commentAndMetadata, null, k
eyword); |
| 6608 _reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyw
ord, []); | 6608 _reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keyw
ord); |
| 6609 return typeAlias; | 6609 return typeAlias; |
| 6610 } | 6610 } |
| 6611 } else if (_tokenMatches(next, TokenType.EQ)) { | 6611 } else if (_tokenMatches(next, TokenType.EQ)) { |
| 6612 TypeAlias typeAlias = _parseClassTypeAlias(commentAndMetadata, null, key
word); | 6612 TypeAlias typeAlias = _parseClassTypeAlias(commentAndMetadata, null, key
word); |
| 6613 _reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keywor
d, []); | 6613 _reportErrorForToken(ParserErrorCode.DEPRECATED_CLASS_TYPE_ALIAS, keywor
d); |
| 6614 return typeAlias; | 6614 return typeAlias; |
| 6615 } | 6615 } |
| 6616 } | 6616 } |
| 6617 return _parseFunctionTypeAlias(commentAndMetadata, keyword); | 6617 return _parseFunctionTypeAlias(commentAndMetadata, keyword); |
| 6618 } | 6618 } |
| 6619 | 6619 |
| 6620 /** | 6620 /** |
| 6621 * Parse a unary expression. | 6621 * Parse a unary expression. |
| 6622 * | 6622 * |
| 6623 * <pre> | 6623 * <pre> |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6667 operator.previous.setNext(firstOperator); | 6667 operator.previous.setNext(firstOperator); |
| 6668 return new PrefixExpression(firstOperator, new PrefixExpression(second
Operator, new SuperExpression(andAdvance))); | 6668 return new PrefixExpression(firstOperator, new PrefixExpression(second
Operator, new SuperExpression(andAdvance))); |
| 6669 } else { | 6669 } else { |
| 6670 // Invalid operator before 'super' | 6670 // Invalid operator before 'super' |
| 6671 _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER
, [operator.lexeme]); | 6671 _reportErrorForCurrentToken(ParserErrorCode.INVALID_OPERATOR_FOR_SUPER
, [operator.lexeme]); |
| 6672 return new PrefixExpression(operator, new SuperExpression(andAdvance))
; | 6672 return new PrefixExpression(operator, new SuperExpression(andAdvance))
; |
| 6673 } | 6673 } |
| 6674 } | 6674 } |
| 6675 return new PrefixExpression(operator, _parseAssignableExpression(false)); | 6675 return new PrefixExpression(operator, _parseAssignableExpression(false)); |
| 6676 } else if (_matches(TokenType.PLUS)) { | 6676 } else if (_matches(TokenType.PLUS)) { |
| 6677 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER, []); | 6677 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); |
| 6678 return _createSyntheticIdentifier(); | 6678 return _createSyntheticIdentifier(); |
| 6679 } else if (_matchesString(_AWAIT)) { | 6679 } else if (_matchesString(_AWAIT)) { |
| 6680 return _parseAwaitExpression(); | 6680 return _parseAwaitExpression(); |
| 6681 } | 6681 } |
| 6682 return _parsePostfixExpression(); | 6682 return _parsePostfixExpression(); |
| 6683 } | 6683 } |
| 6684 | 6684 |
| 6685 /** | 6685 /** |
| 6686 * Parse a variable declaration. | 6686 * Parse a variable declaration. |
| 6687 * | 6687 * |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6730 * | 6730 * |
| 6731 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration list, or | 6731 * @param commentAndMetadata the metadata to be associated with the variable d
eclaration list, or |
| 6732 * `null` if there is no attempt at parsing the comment and metadata | 6732 * `null` if there is no attempt at parsing the comment and metadata |
| 6733 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if | 6733 * @param keyword the token representing the 'final', 'const' or 'var' keyword
, or `null` if |
| 6734 * there is no keyword | 6734 * there is no keyword |
| 6735 * @param type the type of the variables in the list | 6735 * @param type the type of the variables in the list |
| 6736 * @return the variable declaration list that was parsed | 6736 * @return the variable declaration list that was parsed |
| 6737 */ | 6737 */ |
| 6738 VariableDeclarationList _parseVariableDeclarationListAfterType(CommentAndMetad
ata commentAndMetadata, Token keyword, TypeName type) { | 6738 VariableDeclarationList _parseVariableDeclarationListAfterType(CommentAndMetad
ata commentAndMetadata, Token keyword, TypeName type) { |
| 6739 if (type != null && keyword != null && _tokenMatchesKeyword(keyword, Keyword
.VAR)) { | 6739 if (type != null && keyword != null && _tokenMatchesKeyword(keyword, Keyword
.VAR)) { |
| 6740 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword, []); | 6740 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, keyword); |
| 6741 } | 6741 } |
| 6742 List<VariableDeclaration> variables = new List<VariableDeclaration>(); | 6742 List<VariableDeclaration> variables = new List<VariableDeclaration>(); |
| 6743 variables.add(_parseVariableDeclaration()); | 6743 variables.add(_parseVariableDeclaration()); |
| 6744 while (_matches(TokenType.COMMA)) { | 6744 while (_matches(TokenType.COMMA)) { |
| 6745 _advance(); | 6745 _advance(); |
| 6746 variables.add(_parseVariableDeclaration()); | 6746 variables.add(_parseVariableDeclaration()); |
| 6747 } | 6747 } |
| 6748 return new VariableDeclarationList(commentAndMetadata != null ? commentAndMe
tadata.comment : null, commentAndMetadata != null ? commentAndMetadata.metadata
: null, keyword, type, variables); | 6748 return new VariableDeclarationList(commentAndMetadata != null ? commentAndMe
tadata.comment : null, commentAndMetadata != null ? commentAndMetadata.metadata
: null, keyword, type, variables); |
| 6749 } | 6749 } |
| 6750 | 6750 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6874 } | 6874 } |
| 6875 _errorListener.onError(error); | 6875 _errorListener.onError(error); |
| 6876 } | 6876 } |
| 6877 | 6877 |
| 6878 /** | 6878 /** |
| 6879 * Report an error with the given error code and arguments. | 6879 * Report an error with the given error code and arguments. |
| 6880 * | 6880 * |
| 6881 * @param errorCode the error code of the error to be reported | 6881 * @param errorCode the error code of the error to be reported |
| 6882 * @param arguments the arguments to the error, used to compose the error mess
age | 6882 * @param arguments the arguments to the error, used to compose the error mess
age |
| 6883 */ | 6883 */ |
| 6884 void _reportErrorForCurrentToken(ParserErrorCode errorCode, List<Object> argum
ents) { | 6884 void _reportErrorForCurrentToken(ParserErrorCode errorCode, [List<Object> argu
ments]) { |
| 6885 _reportErrorForToken(errorCode, _currentToken, arguments); | 6885 _reportErrorForToken(errorCode, _currentToken, arguments); |
| 6886 } | 6886 } |
| 6887 | 6887 |
| 6888 /** | 6888 /** |
| 6889 * Report an error with the given error code and arguments. | 6889 * Report an error with the given error code and arguments. |
| 6890 * | 6890 * |
| 6891 * @param errorCode the error code of the error to be reported | 6891 * @param errorCode the error code of the error to be reported |
| 6892 * @param node the node specifying the location of the error | 6892 * @param node the node specifying the location of the error |
| 6893 * @param arguments the arguments to the error, used to compose the error mess
age | 6893 * @param arguments the arguments to the error, used to compose the error mess
age |
| 6894 */ | 6894 */ |
| 6895 void _reportErrorForNode(ParserErrorCode errorCode, AstNode node, List<Object>
arguments) { | 6895 void _reportErrorForNode(ParserErrorCode errorCode, AstNode node, [List<Object
> arguments]) { |
| 6896 _reportError(new AnalysisError.con2(_source, node.offset, node.length, error
Code, arguments)); | 6896 _reportError(new AnalysisError.con2(_source, node.offset, node.length, error
Code, arguments)); |
| 6897 } | 6897 } |
| 6898 | 6898 |
| 6899 /** | 6899 /** |
| 6900 * Report an error with the given error code and arguments. | 6900 * Report an error with the given error code and arguments. |
| 6901 * | 6901 * |
| 6902 * @param errorCode the error code of the error to be reported | 6902 * @param errorCode the error code of the error to be reported |
| 6903 * @param token the token specifying the location of the error | 6903 * @param token the token specifying the location of the error |
| 6904 * @param arguments the arguments to the error, used to compose the error mess
age | 6904 * @param arguments the arguments to the error, used to compose the error mess
age |
| 6905 */ | 6905 */ |
| 6906 void _reportErrorForToken(ErrorCode errorCode, Token token, List<Object> argum
ents) { | 6906 void _reportErrorForToken(ErrorCode errorCode, Token token, [List<Object> argu
ments]) { |
| 6907 if (token.type == TokenType.EOF) { | 6907 if (token.type == TokenType.EOF) { |
| 6908 token = token.previous; | 6908 token = token.previous; |
| 6909 } | 6909 } |
| 6910 _reportError(new AnalysisError.con2(_source, token.offset, math.max(token.le
ngth, 1), errorCode, arguments)); | 6910 _reportError(new AnalysisError.con2(_source, token.offset, math.max(token.le
ngth, 1), errorCode, arguments)); |
| 6911 } | 6911 } |
| 6912 | 6912 |
| 6913 /** | 6913 /** |
| 6914 * Skips a block with all containing blocks. | 6914 * Skips a block with all containing blocks. |
| 6915 */ | 6915 */ |
| 6916 void _skipBlock() { | 6916 void _skipBlock() { |
| (...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7427 // backspace | 7427 // backspace |
| 7428 } else if (currentChar == 0x74) { | 7428 } else if (currentChar == 0x74) { |
| 7429 buffer.writeCharCode(0x9); | 7429 buffer.writeCharCode(0x9); |
| 7430 // tab | 7430 // tab |
| 7431 } else if (currentChar == 0x76) { | 7431 } else if (currentChar == 0x76) { |
| 7432 buffer.writeCharCode(0xB); | 7432 buffer.writeCharCode(0xB); |
| 7433 // vertical tab | 7433 // vertical tab |
| 7434 } else if (currentChar == 0x78) { | 7434 } else if (currentChar == 0x78) { |
| 7435 if (currentIndex + 2 >= length) { | 7435 if (currentIndex + 2 >= length) { |
| 7436 // Illegal escape sequence: not enough hex digits | 7436 // Illegal escape sequence: not enough hex digits |
| 7437 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []); | 7437 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE); |
| 7438 return length; | 7438 return length; |
| 7439 } | 7439 } |
| 7440 int firstDigit = lexeme.codeUnitAt(currentIndex + 1); | 7440 int firstDigit = lexeme.codeUnitAt(currentIndex + 1); |
| 7441 int secondDigit = lexeme.codeUnitAt(currentIndex + 2); | 7441 int secondDigit = lexeme.codeUnitAt(currentIndex + 2); |
| 7442 if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) { | 7442 if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) { |
| 7443 // Illegal escape sequence: invalid hex digit | 7443 // Illegal escape sequence: invalid hex digit |
| 7444 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE, []); | 7444 _reportErrorForCurrentToken(ParserErrorCode.INVALID_HEX_ESCAPE); |
| 7445 } else { | 7445 } else { |
| 7446 int charCode = (Character.digit(firstDigit, 16) << 4) | 7446 int charCode = (Character.digit(firstDigit, 16) << 4) |
| 7447 + Character.digit(secondDigit, 16); | 7447 + Character.digit(secondDigit, 16); |
| 7448 buffer.writeCharCode(charCode); | 7448 buffer.writeCharCode(charCode); |
| 7449 } | 7449 } |
| 7450 return currentIndex + 3; | 7450 return currentIndex + 3; |
| 7451 } else if (currentChar == 0x75) { | 7451 } else if (currentChar == 0x75) { |
| 7452 currentIndex++; | 7452 currentIndex++; |
| 7453 if (currentIndex >= length) { | 7453 if (currentIndex >= length) { |
| 7454 // Illegal escape sequence: not enough hex digits | 7454 // Illegal escape sequence: not enough hex digits |
| 7455 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []); | 7455 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7456 return length; | 7456 return length; |
| 7457 } | 7457 } |
| 7458 currentChar = lexeme.codeUnitAt(currentIndex); | 7458 currentChar = lexeme.codeUnitAt(currentIndex); |
| 7459 if (currentChar == 0x7B) { | 7459 if (currentChar == 0x7B) { |
| 7460 currentIndex++; | 7460 currentIndex++; |
| 7461 if (currentIndex >= length) { | 7461 if (currentIndex >= length) { |
| 7462 // Illegal escape sequence: incomplete escape | 7462 // Illegal escape sequence: incomplete escape |
| 7463 _reportErrorForCurrentToken( | 7463 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7464 ParserErrorCode.INVALID_UNICODE_ESCAPE, | |
| 7465 []); | |
| 7466 return length; | 7464 return length; |
| 7467 } | 7465 } |
| 7468 currentChar = lexeme.codeUnitAt(currentIndex); | 7466 currentChar = lexeme.codeUnitAt(currentIndex); |
| 7469 int digitCount = 0; | 7467 int digitCount = 0; |
| 7470 int value = 0; | 7468 int value = 0; |
| 7471 while (currentChar != 0x7D) { | 7469 while (currentChar != 0x7D) { |
| 7472 if (!_isHexDigit(currentChar)) { | 7470 if (!_isHexDigit(currentChar)) { |
| 7473 // Illegal escape sequence: invalid hex digit | 7471 // Illegal escape sequence: invalid hex digit |
| 7474 _reportErrorForCurrentToken( | 7472 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7475 ParserErrorCode.INVALID_UNICODE_ESCAPE, | |
| 7476 []); | |
| 7477 currentIndex++; | 7473 currentIndex++; |
| 7478 while (currentIndex < length | 7474 while (currentIndex < length |
| 7479 && lexeme.codeUnitAt(currentIndex) != 0x7D) { | 7475 && lexeme.codeUnitAt(currentIndex) != 0x7D) { |
| 7480 currentIndex++; | 7476 currentIndex++; |
| 7481 } | 7477 } |
| 7482 return currentIndex + 1; | 7478 return currentIndex + 1; |
| 7483 } | 7479 } |
| 7484 digitCount++; | 7480 digitCount++; |
| 7485 value = (value << 4) + Character.digit(currentChar, 16); | 7481 value = (value << 4) + Character.digit(currentChar, 16); |
| 7486 currentIndex++; | 7482 currentIndex++; |
| 7487 if (currentIndex >= length) { | 7483 if (currentIndex >= length) { |
| 7488 // Illegal escape sequence: incomplete escape | 7484 // Illegal escape sequence: incomplete escape |
| 7489 _reportErrorForCurrentToken( | 7485 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7490 ParserErrorCode.INVALID_UNICODE_ESCAPE, | |
| 7491 []); | |
| 7492 return length; | 7486 return length; |
| 7493 } | 7487 } |
| 7494 currentChar = lexeme.codeUnitAt(currentIndex); | 7488 currentChar = lexeme.codeUnitAt(currentIndex); |
| 7495 } | 7489 } |
| 7496 if (digitCount < 1 || digitCount > 6) { | 7490 if (digitCount < 1 || digitCount > 6) { |
| 7497 // Illegal escape sequence: not enough or too many hex digits | 7491 // Illegal escape sequence: not enough or too many hex digits |
| 7498 _reportErrorForCurrentToken( | 7492 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7499 ParserErrorCode.INVALID_UNICODE_ESCAPE, | |
| 7500 []); | |
| 7501 } | 7493 } |
| 7502 _appendScalarValue( | 7494 _appendScalarValue( |
| 7503 buffer, | 7495 buffer, |
| 7504 lexeme.substring(index, currentIndex + 1), | 7496 lexeme.substring(index, currentIndex + 1), |
| 7505 value, | 7497 value, |
| 7506 index, | 7498 index, |
| 7507 currentIndex); | 7499 currentIndex); |
| 7508 return currentIndex + 1; | 7500 return currentIndex + 1; |
| 7509 } else { | 7501 } else { |
| 7510 if (currentIndex + 3 >= length) { | 7502 if (currentIndex + 3 >= length) { |
| 7511 // Illegal escape sequence: not enough hex digits | 7503 // Illegal escape sequence: not enough hex digits |
| 7512 _reportErrorForCurrentToken( | 7504 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7513 ParserErrorCode.INVALID_UNICODE_ESCAPE, | |
| 7514 []); | |
| 7515 return length; | 7505 return length; |
| 7516 } | 7506 } |
| 7517 int firstDigit = currentChar; | 7507 int firstDigit = currentChar; |
| 7518 int secondDigit = lexeme.codeUnitAt(currentIndex + 1); | 7508 int secondDigit = lexeme.codeUnitAt(currentIndex + 1); |
| 7519 int thirdDigit = lexeme.codeUnitAt(currentIndex + 2); | 7509 int thirdDigit = lexeme.codeUnitAt(currentIndex + 2); |
| 7520 int fourthDigit = lexeme.codeUnitAt(currentIndex + 3); | 7510 int fourthDigit = lexeme.codeUnitAt(currentIndex + 3); |
| 7521 if (!_isHexDigit(firstDigit) | 7511 if (!_isHexDigit(firstDigit) |
| 7522 || !_isHexDigit(secondDigit) | 7512 || !_isHexDigit(secondDigit) |
| 7523 || !_isHexDigit(thirdDigit) | 7513 || !_isHexDigit(thirdDigit) |
| 7524 || !_isHexDigit(fourthDigit)) { | 7514 || !_isHexDigit(fourthDigit)) { |
| 7525 // Illegal escape sequence: invalid hex digits | 7515 // Illegal escape sequence: invalid hex digits |
| 7526 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE, []
); | 7516 _reportErrorForCurrentToken(ParserErrorCode.INVALID_UNICODE_ESCAPE); |
| 7527 } else { | 7517 } else { |
| 7528 _appendScalarValue( | 7518 _appendScalarValue( |
| 7529 buffer, | 7519 buffer, |
| 7530 lexeme.substring(index, currentIndex + 1), | 7520 lexeme.substring(index, currentIndex + 1), |
| 7531 (((((Character.digit(firstDigit, 16) << 4) | 7521 (((((Character.digit(firstDigit, 16) << 4) |
| 7532 + Character.digit(secondDigit, 16)) << 4) | 7522 + Character.digit(secondDigit, 16)) << 4) |
| 7533 + Character.digit(thirdDigit, 16)) << 4) | 7523 + Character.digit(thirdDigit, 16)) << 4) |
| 7534 + Character.digit(fourthDigit, 16), | 7524 + Character.digit(fourthDigit, 16), |
| 7535 index, | 7525 index, |
| 7536 currentIndex + 3); | 7526 currentIndex + 3); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 7555 } | 7545 } |
| 7556 | 7546 |
| 7557 /** | 7547 /** |
| 7558 * Validate that the given parameter list does not contain any field initializ
ers. | 7548 * Validate that the given parameter list does not contain any field initializ
ers. |
| 7559 * | 7549 * |
| 7560 * @param parameterList the parameter list to be validated | 7550 * @param parameterList the parameter list to be validated |
| 7561 */ | 7551 */ |
| 7562 void _validateFormalParameterList(FormalParameterList parameterList) { | 7552 void _validateFormalParameterList(FormalParameterList parameterList) { |
| 7563 for (FormalParameter parameter in parameterList.parameters) { | 7553 for (FormalParameter parameter in parameterList.parameters) { |
| 7564 if (parameter is FieldFormalParameter) { | 7554 if (parameter is FieldFormalParameter) { |
| 7565 _reportErrorForNode(ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTO
R, parameter.identifier, []); | 7555 _reportErrorForNode(ParserErrorCode.FIELD_INITIALIZER_OUTSIDE_CONSTRUCTO
R, parameter.identifier); |
| 7566 } | 7556 } |
| 7567 } | 7557 } |
| 7568 } | 7558 } |
| 7569 | 7559 |
| 7570 /** | 7560 /** |
| 7571 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' | 7561 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' |
| 7572 * keyword if there is one. | 7562 * keyword if there is one. |
| 7573 * | 7563 * |
| 7574 * @param modifiers the modifiers being validated | 7564 * @param modifiers the modifiers being validated |
| 7575 */ | 7565 */ |
| 7576 Token _validateModifiersForClass(Modifiers modifiers) { | 7566 Token _validateModifiersForClass(Modifiers modifiers) { |
| 7577 _validateModifiersForTopLevelDeclaration(modifiers); | 7567 _validateModifiersForTopLevelDeclaration(modifiers); |
| 7578 if (modifiers.constKeyword != null) { | 7568 if (modifiers.constKeyword != null) { |
| 7579 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword,
[]); | 7569 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword); |
| 7580 } | 7570 } |
| 7581 if (modifiers.externalKeyword != null) { | 7571 if (modifiers.externalKeyword != null) { |
| 7582 _reportErrorForToken(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKey
word, []); | 7572 _reportErrorForToken(ParserErrorCode.EXTERNAL_CLASS, modifiers.externalKey
word); |
| 7583 } | 7573 } |
| 7584 if (modifiers.finalKeyword != null) { | 7574 if (modifiers.finalKeyword != null) { |
| 7585 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword,
[]); | 7575 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword); |
| 7586 } | 7576 } |
| 7587 if (modifiers.varKeyword != null) { | 7577 if (modifiers.varKeyword != null) { |
| 7588 _reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword, []); | 7578 _reportErrorForToken(ParserErrorCode.VAR_CLASS, modifiers.varKeyword); |
| 7589 } | 7579 } |
| 7590 return modifiers.abstractKeyword; | 7580 return modifiers.abstractKeyword; |
| 7591 } | 7581 } |
| 7592 | 7582 |
| 7593 /** | 7583 /** |
| 7594 * Validate that the given set of modifiers is appropriate for a constructor a
nd return the | 7584 * Validate that the given set of modifiers is appropriate for a constructor a
nd return the |
| 7595 * 'const' keyword if there is one. | 7585 * 'const' keyword if there is one. |
| 7596 * | 7586 * |
| 7597 * @param modifiers the modifiers being validated | 7587 * @param modifiers the modifiers being validated |
| 7598 * @return the 'const' or 'final' keyword associated with the constructor | 7588 * @return the 'const' or 'final' keyword associated with the constructor |
| 7599 */ | 7589 */ |
| 7600 Token _validateModifiersForConstructor(Modifiers modifiers) { | 7590 Token _validateModifiersForConstructor(Modifiers modifiers) { |
| 7601 if (modifiers.abstractKeyword != null) { | 7591 if (modifiers.abstractKeyword != null) { |
| 7602 _reportErrorForToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, modifiers.abst
ractKeyword, []); | 7592 _reportErrorForToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, modifiers.abst
ractKeyword); |
| 7603 } | 7593 } |
| 7604 if (modifiers.finalKeyword != null) { | 7594 if (modifiers.finalKeyword != null) { |
| 7605 _reportErrorForToken(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKey
word, []); | 7595 _reportErrorForToken(ParserErrorCode.FINAL_CONSTRUCTOR, modifiers.finalKey
word); |
| 7606 } | 7596 } |
| 7607 if (modifiers.staticKeyword != null) { | 7597 if (modifiers.staticKeyword != null) { |
| 7608 _reportErrorForToken(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticK
eyword, []); | 7598 _reportErrorForToken(ParserErrorCode.STATIC_CONSTRUCTOR, modifiers.staticK
eyword); |
| 7609 } | 7599 } |
| 7610 if (modifiers.varKeyword != null) { | 7600 if (modifiers.varKeyword != null) { |
| 7611 _reportErrorForToken(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifie
rs.varKeyword, []); | 7601 _reportErrorForToken(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, modifie
rs.varKeyword); |
| 7612 } | 7602 } |
| 7613 Token externalKeyword = modifiers.externalKeyword; | 7603 Token externalKeyword = modifiers.externalKeyword; |
| 7614 Token constKeyword = modifiers.constKeyword; | 7604 Token constKeyword = modifiers.constKeyword; |
| 7615 Token factoryKeyword = modifiers.factoryKeyword; | 7605 Token factoryKeyword = modifiers.factoryKeyword; |
| 7616 if (externalKeyword != null && constKeyword != null && constKeyword.offset <
externalKeyword.offset) { | 7606 if (externalKeyword != null && constKeyword != null && constKeyword.offset <
externalKeyword.offset) { |
| 7617 _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword
, []); | 7607 _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_CONST, externalKeyword
); |
| 7618 } | 7608 } |
| 7619 if (externalKeyword != null && factoryKeyword != null && factoryKeyword.offs
et < externalKeyword.offset) { | 7609 if (externalKeyword != null && factoryKeyword != null && factoryKeyword.offs
et < externalKeyword.offset) { |
| 7620 _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeywo
rd, []); | 7610 _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_FACTORY, externalKeywo
rd); |
| 7621 } | 7611 } |
| 7622 return constKeyword; | 7612 return constKeyword; |
| 7623 } | 7613 } |
| 7624 | 7614 |
| 7625 /** | 7615 /** |
| 7626 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' | 7616 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' |
| 7627 * keyword if there is one. | 7617 * keyword if there is one. |
| 7628 * | 7618 * |
| 7629 * @param modifiers the modifiers being validated | 7619 * @param modifiers the modifiers being validated |
| 7630 */ | 7620 */ |
| 7631 void _validateModifiersForEnum(Modifiers modifiers) { | 7621 void _validateModifiersForEnum(Modifiers modifiers) { |
| 7632 _validateModifiersForTopLevelDeclaration(modifiers); | 7622 _validateModifiersForTopLevelDeclaration(modifiers); |
| 7633 if (modifiers.abstractKeyword != null) { | 7623 if (modifiers.abstractKeyword != null) { |
| 7634 _reportErrorForToken(ParserErrorCode.ABSTRACT_ENUM, modifiers.abstractKeyw
ord, []); | 7624 _reportErrorForToken(ParserErrorCode.ABSTRACT_ENUM, modifiers.abstractKeyw
ord); |
| 7635 } | 7625 } |
| 7636 if (modifiers.constKeyword != null) { | 7626 if (modifiers.constKeyword != null) { |
| 7637 _reportErrorForToken(ParserErrorCode.CONST_ENUM, modifiers.constKeyword, [
]); | 7627 _reportErrorForToken(ParserErrorCode.CONST_ENUM, modifiers.constKeyword); |
| 7638 } | 7628 } |
| 7639 if (modifiers.externalKeyword != null) { | 7629 if (modifiers.externalKeyword != null) { |
| 7640 _reportErrorForToken(ParserErrorCode.EXTERNAL_ENUM, modifiers.externalKeyw
ord, []); | 7630 _reportErrorForToken(ParserErrorCode.EXTERNAL_ENUM, modifiers.externalKeyw
ord); |
| 7641 } | 7631 } |
| 7642 if (modifiers.finalKeyword != null) { | 7632 if (modifiers.finalKeyword != null) { |
| 7643 _reportErrorForToken(ParserErrorCode.FINAL_ENUM, modifiers.finalKeyword, [
]); | 7633 _reportErrorForToken(ParserErrorCode.FINAL_ENUM, modifiers.finalKeyword); |
| 7644 } | 7634 } |
| 7645 if (modifiers.varKeyword != null) { | 7635 if (modifiers.varKeyword != null) { |
| 7646 _reportErrorForToken(ParserErrorCode.VAR_ENUM, modifiers.varKeyword, []); | 7636 _reportErrorForToken(ParserErrorCode.VAR_ENUM, modifiers.varKeyword); |
| 7647 } | 7637 } |
| 7648 } | 7638 } |
| 7649 | 7639 |
| 7650 /** | 7640 /** |
| 7651 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', | 7641 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', |
| 7652 * 'const' or 'var' keyword if there is one. | 7642 * 'const' or 'var' keyword if there is one. |
| 7653 * | 7643 * |
| 7654 * @param modifiers the modifiers being validated | 7644 * @param modifiers the modifiers being validated |
| 7655 * @return the 'final', 'const' or 'var' keyword associated with the field | 7645 * @return the 'final', 'const' or 'var' keyword associated with the field |
| 7656 */ | 7646 */ |
| 7657 Token _validateModifiersForField(Modifiers modifiers) { | 7647 Token _validateModifiersForField(Modifiers modifiers) { |
| 7658 if (modifiers.abstractKeyword != null) { | 7648 if (modifiers.abstractKeyword != null) { |
| 7659 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []); | 7649 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); |
| 7660 } | 7650 } |
| 7661 if (modifiers.externalKeyword != null) { | 7651 if (modifiers.externalKeyword != null) { |
| 7662 _reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKey
word, []); | 7652 _reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKey
word); |
| 7663 } | 7653 } |
| 7664 if (modifiers.factoryKeyword != null) { | 7654 if (modifiers.factoryKeyword != null) { |
| 7665 _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.fa
ctoryKeyword, []); | 7655 _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.fa
ctoryKeyword); |
| 7666 } | 7656 } |
| 7667 Token staticKeyword = modifiers.staticKeyword; | 7657 Token staticKeyword = modifiers.staticKeyword; |
| 7668 Token constKeyword = modifiers.constKeyword; | 7658 Token constKeyword = modifiers.constKeyword; |
| 7669 Token finalKeyword = modifiers.finalKeyword; | 7659 Token finalKeyword = modifiers.finalKeyword; |
| 7670 Token varKeyword = modifiers.varKeyword; | 7660 Token varKeyword = modifiers.varKeyword; |
| 7671 if (constKeyword != null) { | 7661 if (constKeyword != null) { |
| 7672 if (finalKeyword != null) { | 7662 if (finalKeyword != null) { |
| 7673 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []); | 7663 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword); |
| 7674 } | 7664 } |
| 7675 if (varKeyword != null) { | 7665 if (varKeyword != null) { |
| 7676 _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword, []); | 7666 _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword); |
| 7677 } | 7667 } |
| 7678 if (staticKeyword != null && constKeyword.offset < staticKeyword.offset) { | 7668 if (staticKeyword != null && constKeyword.offset < staticKeyword.offset) { |
| 7679 _reportErrorForToken(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword,
[]); | 7669 _reportErrorForToken(ParserErrorCode.STATIC_AFTER_CONST, staticKeyword); |
| 7680 } | 7670 } |
| 7681 } else if (finalKeyword != null) { | 7671 } else if (finalKeyword != null) { |
| 7682 if (varKeyword != null) { | 7672 if (varKeyword != null) { |
| 7683 _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword, []); | 7673 _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword); |
| 7684 } | 7674 } |
| 7685 if (staticKeyword != null && finalKeyword.offset < staticKeyword.offset) { | 7675 if (staticKeyword != null && finalKeyword.offset < staticKeyword.offset) { |
| 7686 _reportErrorForToken(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword,
[]); | 7676 _reportErrorForToken(ParserErrorCode.STATIC_AFTER_FINAL, staticKeyword); |
| 7687 } | 7677 } |
| 7688 } else if (varKeyword != null && staticKeyword != null && varKeyword.offset
< staticKeyword.offset) { | 7678 } else if (varKeyword != null && staticKeyword != null && varKeyword.offset
< staticKeyword.offset) { |
| 7689 _reportErrorForToken(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword, []); | 7679 _reportErrorForToken(ParserErrorCode.STATIC_AFTER_VAR, staticKeyword); |
| 7690 } | 7680 } |
| 7691 return _lexicallyFirst([constKeyword, finalKeyword, varKeyword]); | 7681 return _lexicallyFirst([constKeyword, finalKeyword, varKeyword]); |
| 7692 } | 7682 } |
| 7693 | 7683 |
| 7694 /** | 7684 /** |
| 7695 * Validate that the given set of modifiers is appropriate for a local functio
n. | 7685 * Validate that the given set of modifiers is appropriate for a local functio
n. |
| 7696 * | 7686 * |
| 7697 * @param modifiers the modifiers being validated | 7687 * @param modifiers the modifiers being validated |
| 7698 */ | 7688 */ |
| 7699 void _validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) { | 7689 void _validateModifiersForFunctionDeclarationStatement(Modifiers modifiers) { |
| 7700 if (modifiers.abstractKeyword != null || modifiers.constKeyword != null || m
odifiers.externalKeyword != null || modifiers.factoryKeyword != null || modifier
s.finalKeyword != null || modifiers.staticKeyword != null || modifiers.varKeywor
d != null) { | 7690 if (modifiers.abstractKeyword != null || modifiers.constKeyword != null || m
odifiers.externalKeyword != null || modifiers.factoryKeyword != null || modifier
s.finalKeyword != null || modifiers.staticKeyword != null || modifiers.varKeywor
d != null) { |
| 7701 _reportErrorForCurrentToken(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MOD
IFIER, []); | 7691 _reportErrorForCurrentToken(ParserErrorCode.LOCAL_FUNCTION_DECLARATION_MOD
IFIER); |
| 7702 } | 7692 } |
| 7703 } | 7693 } |
| 7704 | 7694 |
| 7705 /** | 7695 /** |
| 7706 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. | 7696 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. |
| 7707 * | 7697 * |
| 7708 * @param modifiers the modifiers being validated | 7698 * @param modifiers the modifiers being validated |
| 7709 */ | 7699 */ |
| 7710 void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) { | 7700 void _validateModifiersForGetterOrSetterOrMethod(Modifiers modifiers) { |
| 7711 if (modifiers.abstractKeyword != null) { | 7701 if (modifiers.abstractKeyword != null) { |
| 7712 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []); | 7702 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); |
| 7713 } | 7703 } |
| 7714 if (modifiers.constKeyword != null) { | 7704 if (modifiers.constKeyword != null) { |
| 7715 _reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword,
[]); | 7705 _reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword)
; |
| 7716 } | 7706 } |
| 7717 if (modifiers.factoryKeyword != null) { | 7707 if (modifiers.factoryKeyword != null) { |
| 7718 _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.fa
ctoryKeyword, []); | 7708 _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.fa
ctoryKeyword); |
| 7719 } | 7709 } |
| 7720 if (modifiers.finalKeyword != null) { | 7710 if (modifiers.finalKeyword != null) { |
| 7721 _reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword,
[]); | 7711 _reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword)
; |
| 7722 } | 7712 } |
| 7723 if (modifiers.varKeyword != null) { | 7713 if (modifiers.varKeyword != null) { |
| 7724 _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword
, []); | 7714 _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword
); |
| 7725 } | 7715 } |
| 7726 Token externalKeyword = modifiers.externalKeyword; | 7716 Token externalKeyword = modifiers.externalKeyword; |
| 7727 Token staticKeyword = modifiers.staticKeyword; | 7717 Token staticKeyword = modifiers.staticKeyword; |
| 7728 if (externalKeyword != null && staticKeyword != null && staticKeyword.offset
< externalKeyword.offset) { | 7718 if (externalKeyword != null && staticKeyword != null && staticKeyword.offset
< externalKeyword.offset) { |
| 7729 _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeywor
d, []); | 7719 _reportErrorForToken(ParserErrorCode.EXTERNAL_AFTER_STATIC, externalKeywor
d); |
| 7730 } | 7720 } |
| 7731 } | 7721 } |
| 7732 | 7722 |
| 7733 /** | 7723 /** |
| 7734 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. | 7724 * Validate that the given set of modifiers is appropriate for a getter, sette
r, or method. |
| 7735 * | 7725 * |
| 7736 * @param modifiers the modifiers being validated | 7726 * @param modifiers the modifiers being validated |
| 7737 */ | 7727 */ |
| 7738 void _validateModifiersForOperator(Modifiers modifiers) { | 7728 void _validateModifiersForOperator(Modifiers modifiers) { |
| 7739 if (modifiers.abstractKeyword != null) { | 7729 if (modifiers.abstractKeyword != null) { |
| 7740 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER, []); | 7730 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_CLASS_MEMBER); |
| 7741 } | 7731 } |
| 7742 if (modifiers.constKeyword != null) { | 7732 if (modifiers.constKeyword != null) { |
| 7743 _reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword,
[]); | 7733 _reportErrorForToken(ParserErrorCode.CONST_METHOD, modifiers.constKeyword)
; |
| 7744 } | 7734 } |
| 7745 if (modifiers.factoryKeyword != null) { | 7735 if (modifiers.factoryKeyword != null) { |
| 7746 _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.fa
ctoryKeyword, []); | 7736 _reportErrorForToken(ParserErrorCode.NON_CONSTRUCTOR_FACTORY, modifiers.fa
ctoryKeyword); |
| 7747 } | 7737 } |
| 7748 if (modifiers.finalKeyword != null) { | 7738 if (modifiers.finalKeyword != null) { |
| 7749 _reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword,
[]); | 7739 _reportErrorForToken(ParserErrorCode.FINAL_METHOD, modifiers.finalKeyword)
; |
| 7750 } | 7740 } |
| 7751 if (modifiers.staticKeyword != null) { | 7741 if (modifiers.staticKeyword != null) { |
| 7752 _reportErrorForToken(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyw
ord, []); | 7742 _reportErrorForToken(ParserErrorCode.STATIC_OPERATOR, modifiers.staticKeyw
ord); |
| 7753 } | 7743 } |
| 7754 if (modifiers.varKeyword != null) { | 7744 if (modifiers.varKeyword != null) { |
| 7755 _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword
, []); | 7745 _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword
); |
| 7756 } | 7746 } |
| 7757 } | 7747 } |
| 7758 | 7748 |
| 7759 /** | 7749 /** |
| 7760 * Validate that the given set of modifiers is appropriate for a top-level dec
laration. | 7750 * Validate that the given set of modifiers is appropriate for a top-level dec
laration. |
| 7761 * | 7751 * |
| 7762 * @param modifiers the modifiers being validated | 7752 * @param modifiers the modifiers being validated |
| 7763 */ | 7753 */ |
| 7764 void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) { | 7754 void _validateModifiersForTopLevelDeclaration(Modifiers modifiers) { |
| 7765 if (modifiers.factoryKeyword != null) { | 7755 if (modifiers.factoryKeyword != null) { |
| 7766 _reportErrorForToken(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifi
ers.factoryKeyword, []); | 7756 _reportErrorForToken(ParserErrorCode.FACTORY_TOP_LEVEL_DECLARATION, modifi
ers.factoryKeyword); |
| 7767 } | 7757 } |
| 7768 if (modifiers.staticKeyword != null) { | 7758 if (modifiers.staticKeyword != null) { |
| 7769 _reportErrorForToken(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifie
rs.staticKeyword, []); | 7759 _reportErrorForToken(ParserErrorCode.STATIC_TOP_LEVEL_DECLARATION, modifie
rs.staticKeyword); |
| 7770 } | 7760 } |
| 7771 } | 7761 } |
| 7772 | 7762 |
| 7773 /** | 7763 /** |
| 7774 * Validate that the given set of modifiers is appropriate for a top-level fun
ction. | 7764 * Validate that the given set of modifiers is appropriate for a top-level fun
ction. |
| 7775 * | 7765 * |
| 7776 * @param modifiers the modifiers being validated | 7766 * @param modifiers the modifiers being validated |
| 7777 */ | 7767 */ |
| 7778 void _validateModifiersForTopLevelFunction(Modifiers modifiers) { | 7768 void _validateModifiersForTopLevelFunction(Modifiers modifiers) { |
| 7779 _validateModifiersForTopLevelDeclaration(modifiers); | 7769 _validateModifiersForTopLevelDeclaration(modifiers); |
| 7780 if (modifiers.abstractKeyword != null) { | 7770 if (modifiers.abstractKeyword != null) { |
| 7781 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION, [
]); | 7771 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_FUNCTION); |
| 7782 } | 7772 } |
| 7783 if (modifiers.constKeyword != null) { | 7773 if (modifiers.constKeyword != null) { |
| 7784 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword,
[]); | 7774 _reportErrorForToken(ParserErrorCode.CONST_CLASS, modifiers.constKeyword); |
| 7785 } | 7775 } |
| 7786 if (modifiers.finalKeyword != null) { | 7776 if (modifiers.finalKeyword != null) { |
| 7787 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword,
[]); | 7777 _reportErrorForToken(ParserErrorCode.FINAL_CLASS, modifiers.finalKeyword); |
| 7788 } | 7778 } |
| 7789 if (modifiers.varKeyword != null) { | 7779 if (modifiers.varKeyword != null) { |
| 7790 _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword
, []); | 7780 _reportErrorForToken(ParserErrorCode.VAR_RETURN_TYPE, modifiers.varKeyword
); |
| 7791 } | 7781 } |
| 7792 } | 7782 } |
| 7793 | 7783 |
| 7794 /** | 7784 /** |
| 7795 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', | 7785 * Validate that the given set of modifiers is appropriate for a field and ret
urn the 'final', |
| 7796 * 'const' or 'var' keyword if there is one. | 7786 * 'const' or 'var' keyword if there is one. |
| 7797 * | 7787 * |
| 7798 * @param modifiers the modifiers being validated | 7788 * @param modifiers the modifiers being validated |
| 7799 * @return the 'final', 'const' or 'var' keyword associated with the field | 7789 * @return the 'final', 'const' or 'var' keyword associated with the field |
| 7800 */ | 7790 */ |
| 7801 Token _validateModifiersForTopLevelVariable(Modifiers modifiers) { | 7791 Token _validateModifiersForTopLevelVariable(Modifiers modifiers) { |
| 7802 _validateModifiersForTopLevelDeclaration(modifiers); | 7792 _validateModifiersForTopLevelDeclaration(modifiers); |
| 7803 if (modifiers.abstractKeyword != null) { | 7793 if (modifiers.abstractKeyword != null) { |
| 7804 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE, [
]); | 7794 _reportErrorForCurrentToken(ParserErrorCode.ABSTRACT_TOP_LEVEL_VARIABLE); |
| 7805 } | 7795 } |
| 7806 if (modifiers.externalKeyword != null) { | 7796 if (modifiers.externalKeyword != null) { |
| 7807 _reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKey
word, []); | 7797 _reportErrorForToken(ParserErrorCode.EXTERNAL_FIELD, modifiers.externalKey
word); |
| 7808 } | 7798 } |
| 7809 Token constKeyword = modifiers.constKeyword; | 7799 Token constKeyword = modifiers.constKeyword; |
| 7810 Token finalKeyword = modifiers.finalKeyword; | 7800 Token finalKeyword = modifiers.finalKeyword; |
| 7811 Token varKeyword = modifiers.varKeyword; | 7801 Token varKeyword = modifiers.varKeyword; |
| 7812 if (constKeyword != null) { | 7802 if (constKeyword != null) { |
| 7813 if (finalKeyword != null) { | 7803 if (finalKeyword != null) { |
| 7814 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword, []); | 7804 _reportErrorForToken(ParserErrorCode.CONST_AND_FINAL, finalKeyword); |
| 7815 } | 7805 } |
| 7816 if (varKeyword != null) { | 7806 if (varKeyword != null) { |
| 7817 _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword, []); | 7807 _reportErrorForToken(ParserErrorCode.CONST_AND_VAR, varKeyword); |
| 7818 } | 7808 } |
| 7819 } else if (finalKeyword != null) { | 7809 } else if (finalKeyword != null) { |
| 7820 if (varKeyword != null) { | 7810 if (varKeyword != null) { |
| 7821 _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword, []); | 7811 _reportErrorForToken(ParserErrorCode.FINAL_AND_VAR, varKeyword); |
| 7822 } | 7812 } |
| 7823 } | 7813 } |
| 7824 return _lexicallyFirst([constKeyword, finalKeyword, varKeyword]); | 7814 return _lexicallyFirst([constKeyword, finalKeyword, varKeyword]); |
| 7825 } | 7815 } |
| 7826 | 7816 |
| 7827 /** | 7817 /** |
| 7828 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' | 7818 * Validate that the given set of modifiers is appropriate for a class and ret
urn the 'abstract' |
| 7829 * keyword if there is one. | 7819 * keyword if there is one. |
| 7830 * | 7820 * |
| 7831 * @param modifiers the modifiers being validated | 7821 * @param modifiers the modifiers being validated |
| 7832 */ | 7822 */ |
| 7833 void _validateModifiersForTypedef(Modifiers modifiers) { | 7823 void _validateModifiersForTypedef(Modifiers modifiers) { |
| 7834 _validateModifiersForTopLevelDeclaration(modifiers); | 7824 _validateModifiersForTopLevelDeclaration(modifiers); |
| 7835 if (modifiers.abstractKeyword != null) { | 7825 if (modifiers.abstractKeyword != null) { |
| 7836 _reportErrorForToken(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractK
eyword, []); | 7826 _reportErrorForToken(ParserErrorCode.ABSTRACT_TYPEDEF, modifiers.abstractK
eyword); |
| 7837 } | 7827 } |
| 7838 if (modifiers.constKeyword != null) { | 7828 if (modifiers.constKeyword != null) { |
| 7839 _reportErrorForToken(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword
, []); | 7829 _reportErrorForToken(ParserErrorCode.CONST_TYPEDEF, modifiers.constKeyword
); |
| 7840 } | 7830 } |
| 7841 if (modifiers.externalKeyword != null) { | 7831 if (modifiers.externalKeyword != null) { |
| 7842 _reportErrorForToken(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalK
eyword, []); | 7832 _reportErrorForToken(ParserErrorCode.EXTERNAL_TYPEDEF, modifiers.externalK
eyword); |
| 7843 } | 7833 } |
| 7844 if (modifiers.finalKeyword != null) { | 7834 if (modifiers.finalKeyword != null) { |
| 7845 _reportErrorForToken(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword
, []); | 7835 _reportErrorForToken(ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword
); |
| 7846 } | 7836 } |
| 7847 if (modifiers.varKeyword != null) { | 7837 if (modifiers.varKeyword != null) { |
| 7848 _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword, []
); | 7838 _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword); |
| 7849 } | 7839 } |
| 7850 } | 7840 } |
| 7851 } | 7841 } |
| 7852 | 7842 |
| 7853 /** | 7843 /** |
| 7854 * The enumeration `ParserErrorCode` defines the error codes used for errors | 7844 * The enumeration `ParserErrorCode` defines the error codes used for errors |
| 7855 * detected by the parser. The convention for this class is for the name of the | 7845 * detected by the parser. The convention for this class is for the name of the |
| 7856 * error code to indicate the problem that caused the error to be generated and | 7846 * error code to indicate the problem that caused the error to be generated and |
| 7857 * for the error message to explain what is wrong and, when appropriate, how the | 7847 * for the error message to explain what is wrong and, when appropriate, how the |
| 7858 * problem can be corrected. | 7848 * problem can be corrected. |
| (...skipping 1947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9806 return trampoline(target, arguments[0], arguments[1]); | 9796 return trampoline(target, arguments[0], arguments[1]); |
| 9807 case 3: | 9797 case 3: |
| 9808 return trampoline(target, arguments[0], arguments[1], arguments[2]); | 9798 return trampoline(target, arguments[0], arguments[1], arguments[2]); |
| 9809 case 4: | 9799 case 4: |
| 9810 return trampoline(target, arguments[0], arguments[1], arguments[2], argu
ments[3]); | 9800 return trampoline(target, arguments[0], arguments[1], arguments[2], argu
ments[3]); |
| 9811 default: | 9801 default: |
| 9812 throw new IllegalArgumentException("Not implemented for > 4 arguments"); | 9802 throw new IllegalArgumentException("Not implemented for > 4 arguments"); |
| 9813 } | 9803 } |
| 9814 } | 9804 } |
| 9815 } | 9805 } |
| OLD | NEW |