| 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 library analyzer.src.generated.parser; | 5 library analyzer.src.generated.parser; |
| 6 | 6 |
| 7 import 'dart:collection'; | 7 import 'dart:collection'; |
| 8 import "dart:math" as math; | 8 import "dart:math" as math; |
| 9 | 9 |
| 10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| (...skipping 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1227 * if what was found was not a valid class member. | 1227 * if what was found was not a valid class member. |
| 1228 * | 1228 * |
| 1229 * classMemberDefinition ::= | 1229 * classMemberDefinition ::= |
| 1230 * declaration ';' | 1230 * declaration ';' |
| 1231 * | methodSignature functionBody | 1231 * | methodSignature functionBody |
| 1232 */ | 1232 */ |
| 1233 ClassMember parseClassMember(String className) { | 1233 ClassMember parseClassMember(String className) { |
| 1234 CommentAndMetadata commentAndMetadata = parseCommentAndMetadata(); | 1234 CommentAndMetadata commentAndMetadata = parseCommentAndMetadata(); |
| 1235 Modifiers modifiers = parseModifiers(); | 1235 Modifiers modifiers = parseModifiers(); |
| 1236 Keyword keyword = _currentToken.keyword; | 1236 Keyword keyword = _currentToken.keyword; |
| 1237 if (keyword == Keyword.VOID) { | 1237 if (keyword == Keyword.VOID || |
| 1238 TypeName returnType = astFactory.typeName( | 1238 _atGenericFunctionTypeAfterReturnType(_currentToken)) { |
| 1239 astFactory.simpleIdentifier(getAndAdvance()), null); | 1239 TypeAnnotation returnType; |
| 1240 if (keyword == Keyword.VOID) { |
| 1241 if (_atGenericFunctionTypeAfterReturnType(_peek())) { |
| 1242 returnType = parseTypeAnnotation(false); |
| 1243 } else { |
| 1244 returnType = astFactory.typeName( |
| 1245 astFactory.simpleIdentifier(getAndAdvance()), null); |
| 1246 } |
| 1247 } else { |
| 1248 returnType = parseTypeAnnotation(false); |
| 1249 } |
| 1240 keyword = _currentToken.keyword; | 1250 keyword = _currentToken.keyword; |
| 1241 Token next = _peek(); | 1251 Token next = _peek(); |
| 1242 bool isFollowedByIdentifier = _tokenMatchesIdentifier(next); | 1252 bool isFollowedByIdentifier = _tokenMatchesIdentifier(next); |
| 1243 if (keyword == Keyword.GET && isFollowedByIdentifier) { | 1253 if (keyword == Keyword.GET && isFollowedByIdentifier) { |
| 1244 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1254 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1245 return parseGetter(commentAndMetadata, modifiers.externalKeyword, | 1255 return parseGetter(commentAndMetadata, modifiers.externalKeyword, |
| 1246 modifiers.staticKeyword, returnType); | 1256 modifiers.staticKeyword, returnType); |
| 1247 } else if (keyword == Keyword.SET && isFollowedByIdentifier) { | 1257 } else if (keyword == Keyword.SET && isFollowedByIdentifier) { |
| 1248 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 1258 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
| 1249 return parseSetter(commentAndMetadata, modifiers.externalKeyword, | 1259 return parseSetter(commentAndMetadata, modifiers.externalKeyword, |
| (...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2024 TokenType nextType = next.type; | 2034 TokenType nextType = next.type; |
| 2025 if (keyword == Keyword.TYPEDEF && | 2035 if (keyword == Keyword.TYPEDEF && |
| 2026 nextType != TokenType.PERIOD && | 2036 nextType != TokenType.PERIOD && |
| 2027 nextType != TokenType.LT && | 2037 nextType != TokenType.LT && |
| 2028 nextType != TokenType.OPEN_PAREN) { | 2038 nextType != TokenType.OPEN_PAREN) { |
| 2029 _validateModifiersForTypedef(modifiers); | 2039 _validateModifiersForTypedef(modifiers); |
| 2030 return parseTypeAlias(commentAndMetadata); | 2040 return parseTypeAlias(commentAndMetadata); |
| 2031 } else if (keyword == Keyword.ENUM) { | 2041 } else if (keyword == Keyword.ENUM) { |
| 2032 _validateModifiersForEnum(modifiers); | 2042 _validateModifiersForEnum(modifiers); |
| 2033 return parseEnumDeclaration(commentAndMetadata); | 2043 return parseEnumDeclaration(commentAndMetadata); |
| 2034 } else if (keyword == Keyword.VOID) { | 2044 } else if (keyword == Keyword.VOID || |
| 2035 TypeName returnType = astFactory.typeName( | 2045 _atGenericFunctionTypeAfterReturnType(_currentToken)) { |
| 2036 astFactory.simpleIdentifier(getAndAdvance()), null); | 2046 TypeAnnotation returnType; |
| 2047 if (keyword == Keyword.VOID) { |
| 2048 if (_atGenericFunctionTypeAfterReturnType(next)) { |
| 2049 returnType = parseTypeAnnotation(false); |
| 2050 } else { |
| 2051 returnType = astFactory.typeName( |
| 2052 astFactory.simpleIdentifier(getAndAdvance()), null); |
| 2053 } |
| 2054 } else { |
| 2055 returnType = parseTypeAnnotation(false); |
| 2056 } |
| 2037 keyword = _currentToken.keyword; | 2057 keyword = _currentToken.keyword; |
| 2038 next = _peek(); | 2058 next = _peek(); |
| 2039 if ((keyword == Keyword.GET || keyword == Keyword.SET) && | 2059 if ((keyword == Keyword.GET || keyword == Keyword.SET) && |
| 2040 _tokenMatchesIdentifier(next)) { | 2060 _tokenMatchesIdentifier(next)) { |
| 2041 _validateModifiersForTopLevelFunction(modifiers); | 2061 _validateModifiersForTopLevelFunction(modifiers); |
| 2042 return parseFunctionDeclaration( | 2062 return parseFunctionDeclaration( |
| 2043 commentAndMetadata, modifiers.externalKeyword, returnType); | 2063 commentAndMetadata, modifiers.externalKeyword, returnType); |
| 2044 } else if (keyword == Keyword.OPERATOR && _isOperator(next)) { | 2064 } else if (keyword == Keyword.OPERATOR && _isOperator(next)) { |
| 2045 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); | 2065 _reportErrorForToken(ParserErrorCode.TOP_LEVEL_OPERATOR, _currentToken); |
| 2046 return _convertToFunctionDeclaration(_parseOperatorAfterKeyword( | 2066 return _convertToFunctionDeclaration(_parseOperatorAfterKeyword( |
| (...skipping 1965 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4012 return astFactory.expressionStatement( | 4032 return astFactory.expressionStatement( |
| 4013 parseThrowExpression(), _expect(TokenType.SEMICOLON)); | 4033 parseThrowExpression(), _expect(TokenType.SEMICOLON)); |
| 4014 } else if (keyword == Keyword.TRY) { | 4034 } else if (keyword == Keyword.TRY) { |
| 4015 return parseTryStatement(); | 4035 return parseTryStatement(); |
| 4016 } else if (keyword == Keyword.WHILE) { | 4036 } else if (keyword == Keyword.WHILE) { |
| 4017 return parseWhileStatement(); | 4037 return parseWhileStatement(); |
| 4018 } else if (keyword == Keyword.VAR || keyword == Keyword.FINAL) { | 4038 } else if (keyword == Keyword.VAR || keyword == Keyword.FINAL) { |
| 4019 return parseVariableDeclarationStatementAfterMetadata( | 4039 return parseVariableDeclarationStatementAfterMetadata( |
| 4020 commentAndMetadata); | 4040 commentAndMetadata); |
| 4021 } else if (keyword == Keyword.VOID) { | 4041 } else if (keyword == Keyword.VOID) { |
| 4022 TypeName returnType = astFactory.typeName( | 4042 TypeAnnotation returnType; |
| 4023 astFactory.simpleIdentifier(getAndAdvance()), null); | 4043 if (_atGenericFunctionTypeAfterReturnType(_peek())) { |
| 4044 returnType = parseTypeAnnotation(false); |
| 4045 } else { |
| 4046 returnType = astFactory.typeName( |
| 4047 astFactory.simpleIdentifier(getAndAdvance()), null); |
| 4048 } |
| 4024 Token next = _currentToken.next; | 4049 Token next = _currentToken.next; |
| 4025 if (_matchesIdentifier() && | 4050 if (_matchesIdentifier() && |
| 4026 next.matchesAny(const <TokenType>[ | 4051 next.matchesAny(const <TokenType>[ |
| 4027 TokenType.OPEN_PAREN, | 4052 TokenType.OPEN_PAREN, |
| 4028 TokenType.OPEN_CURLY_BRACKET, | 4053 TokenType.OPEN_CURLY_BRACKET, |
| 4029 TokenType.FUNCTION, | 4054 TokenType.FUNCTION, |
| 4030 TokenType.LT | 4055 TokenType.LT |
| 4031 ])) { | 4056 ])) { |
| 4032 return _parseFunctionDeclarationStatementAfterReturnType( | 4057 return _parseFunctionDeclarationStatementAfterReturnType( |
| 4033 commentAndMetadata, returnType); | 4058 commentAndMetadata, returnType); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4094 return astFactory.expressionStatement( | 4119 return astFactory.expressionStatement( |
| 4095 parseExpression2(), _expect(TokenType.SEMICOLON)); | 4120 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 4096 } else { | 4121 } else { |
| 4097 // | 4122 // |
| 4098 // We have found an error of some kind. Try to recover. | 4123 // We have found an error of some kind. Try to recover. |
| 4099 // | 4124 // |
| 4100 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); | 4125 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 4101 return astFactory | 4126 return astFactory |
| 4102 .emptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); | 4127 .emptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 4103 } | 4128 } |
| 4129 } else if (_atGenericFunctionTypeAfterReturnType(_currentToken)) { |
| 4130 TypeAnnotation returnType = parseTypeAnnotation(false); |
| 4131 Token next = _currentToken.next; |
| 4132 if (_matchesIdentifier() && |
| 4133 next.matchesAny(const <TokenType>[ |
| 4134 TokenType.OPEN_PAREN, |
| 4135 TokenType.OPEN_CURLY_BRACKET, |
| 4136 TokenType.FUNCTION, |
| 4137 TokenType.LT |
| 4138 ])) { |
| 4139 return _parseFunctionDeclarationStatementAfterReturnType( |
| 4140 commentAndMetadata, returnType); |
| 4141 } else { |
| 4142 // |
| 4143 // We have found an error of some kind. Try to recover. |
| 4144 // |
| 4145 if (_matchesIdentifier()) { |
| 4146 if (next.matchesAny(const <TokenType>[ |
| 4147 TokenType.EQ, |
| 4148 TokenType.COMMA, |
| 4149 TokenType.SEMICOLON |
| 4150 ])) { |
| 4151 // |
| 4152 // We appear to have a variable declaration with a type of "void". |
| 4153 // |
| 4154 _reportErrorForNode(ParserErrorCode.VOID_VARIABLE, returnType); |
| 4155 return parseVariableDeclarationStatementAfterMetadata( |
| 4156 commentAndMetadata); |
| 4157 } |
| 4158 } else if (_matches(TokenType.CLOSE_CURLY_BRACKET)) { |
| 4159 // |
| 4160 // We appear to have found an incomplete statement at the end of a |
| 4161 // block. Parse it as a variable declaration. |
| 4162 // |
| 4163 return _parseVariableDeclarationStatementAfterType( |
| 4164 commentAndMetadata, null, returnType); |
| 4165 } |
| 4166 _reportErrorForCurrentToken(ParserErrorCode.MISSING_STATEMENT); |
| 4167 // TODO(brianwilkerson) Recover from this error. |
| 4168 return astFactory |
| 4169 .emptyStatement(_createSyntheticToken(TokenType.SEMICOLON)); |
| 4170 } |
| 4104 } else if (_inGenerator && _matchesKeyword(Keyword.YIELD)) { | 4171 } else if (_inGenerator && _matchesKeyword(Keyword.YIELD)) { |
| 4105 return parseYieldStatement(); | 4172 return parseYieldStatement(); |
| 4106 } else if (_inAsync && _matchesKeyword(Keyword.AWAIT)) { | 4173 } else if (_inAsync && _matchesKeyword(Keyword.AWAIT)) { |
| 4107 if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) { | 4174 if (_tokenMatchesKeyword(_peek(), Keyword.FOR)) { |
| 4108 return parseForStatement(); | 4175 return parseForStatement(); |
| 4109 } | 4176 } |
| 4110 return astFactory.expressionStatement( | 4177 return astFactory.expressionStatement( |
| 4111 parseExpression2(), _expect(TokenType.SEMICOLON)); | 4178 parseExpression2(), _expect(TokenType.SEMICOLON)); |
| 4112 } else if (_matchesKeyword(Keyword.AWAIT) && | 4179 } else if (_matchesKeyword(Keyword.AWAIT) && |
| 4113 _tokenMatchesKeyword(_peek(), Keyword.FOR)) { | 4180 _tokenMatchesKeyword(_peek(), Keyword.FOR)) { |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4611 | 4678 |
| 4612 /** | 4679 /** |
| 4613 * Parse a return type. Return the return type that was parsed. | 4680 * Parse a return type. Return the return type that was parsed. |
| 4614 * | 4681 * |
| 4615 * returnType ::= | 4682 * returnType ::= |
| 4616 * 'void' | 4683 * 'void' |
| 4617 * | type | 4684 * | type |
| 4618 */ | 4685 */ |
| 4619 TypeAnnotation parseReturnType(bool inExpression) { | 4686 TypeAnnotation parseReturnType(bool inExpression) { |
| 4620 if (_currentToken.keyword == Keyword.VOID) { | 4687 if (_currentToken.keyword == Keyword.VOID) { |
| 4621 return astFactory.typeName( | 4688 if (_atGenericFunctionTypeAfterReturnType(_peek())) { |
| 4622 astFactory.simpleIdentifier(getAndAdvance()), null); | 4689 return parseTypeAnnotation(false); |
| 4690 } else { |
| 4691 return astFactory.typeName( |
| 4692 astFactory.simpleIdentifier(getAndAdvance()), null); |
| 4693 } |
| 4623 } else { | 4694 } else { |
| 4624 return parseTypeAnnotation(inExpression); | 4695 return parseTypeAnnotation(inExpression); |
| 4625 } | 4696 } |
| 4626 } | 4697 } |
| 4627 | 4698 |
| 4628 /** | 4699 /** |
| 4629 * Parse a setter. The [commentAndMetadata] is the documentation comment and | 4700 * Parse a setter. The [commentAndMetadata] is the documentation comment and |
| 4630 * metadata to be associated with the declaration. The [externalKeyword] is | 4701 * metadata to be associated with the declaration. The [externalKeyword] is |
| 4631 * the 'external' token. The [staticKeyword] is the static keyword, or `null` | 4702 * the 'external' token. The [staticKeyword] is the static keyword, or `null` |
| 4632 * if the setter is not static. The [returnType] is the return type that has | 4703 * if the setter is not static. The [returnType] is the return type that has |
| (...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5473 * not the first token in a valid return type. | 5544 * not the first token in a valid return type. |
| 5474 * | 5545 * |
| 5475 * This method must be kept in sync with [parseReturnType]. | 5546 * This method must be kept in sync with [parseReturnType]. |
| 5476 * | 5547 * |
| 5477 * returnType ::= | 5548 * returnType ::= |
| 5478 * 'void' | 5549 * 'void' |
| 5479 * | type | 5550 * | type |
| 5480 */ | 5551 */ |
| 5481 Token skipReturnType(Token startToken) { | 5552 Token skipReturnType(Token startToken) { |
| 5482 if (_tokenMatchesKeyword(startToken, Keyword.VOID)) { | 5553 if (_tokenMatchesKeyword(startToken, Keyword.VOID)) { |
| 5554 if (_atGenericFunctionTypeAfterReturnType(_peek())) { |
| 5555 return skipTypeAnnotation(startToken); |
| 5556 } |
| 5483 return startToken.next; | 5557 return startToken.next; |
| 5484 } else { | 5558 } else { |
| 5485 return skipTypeAnnotation(startToken); | 5559 return skipTypeAnnotation(startToken); |
| 5486 } | 5560 } |
| 5487 } | 5561 } |
| 5488 | 5562 |
| 5489 /** | 5563 /** |
| 5490 * Parse a simple identifier, starting at the [startToken], without actually | 5564 * Parse a simple identifier, starting at the [startToken], without actually |
| 5491 * creating a simple identifier or changing the current token. Return the | 5565 * creating a simple identifier or changing the current token. Return the |
| 5492 * token following the simple identifier that was parsed, or `null` if the | 5566 * token following the simple identifier that was parsed, or `null` if the |
| (...skipping 1648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7141 * Parse a return type if one is given, otherwise return `null` without | 7215 * Parse a return type if one is given, otherwise return `null` without |
| 7142 * advancing. Return the return type that was parsed. | 7216 * advancing. Return the return type that was parsed. |
| 7143 */ | 7217 */ |
| 7144 TypeAnnotation _parseOptionalReturnType() { | 7218 TypeAnnotation _parseOptionalReturnType() { |
| 7145 TypeName typeComment = _parseOptionalTypeNameComment(); | 7219 TypeName typeComment = _parseOptionalTypeNameComment(); |
| 7146 if (typeComment != null) { | 7220 if (typeComment != null) { |
| 7147 return typeComment; | 7221 return typeComment; |
| 7148 } | 7222 } |
| 7149 Keyword keyword = _currentToken.keyword; | 7223 Keyword keyword = _currentToken.keyword; |
| 7150 if (keyword == Keyword.VOID) { | 7224 if (keyword == Keyword.VOID) { |
| 7225 if (_atGenericFunctionTypeAfterReturnType(_peek())) { |
| 7226 return parseTypeAnnotation(false); |
| 7227 } |
| 7151 return astFactory.typeName( | 7228 return astFactory.typeName( |
| 7152 astFactory.simpleIdentifier(getAndAdvance()), null); | 7229 astFactory.simpleIdentifier(getAndAdvance()), null); |
| 7153 } else if (_matchesIdentifier()) { | 7230 } else if (_matchesIdentifier()) { |
| 7154 Token next = _peek(); | 7231 Token next = _peek(); |
| 7155 if (keyword != Keyword.GET && | 7232 if (keyword != Keyword.GET && |
| 7156 keyword != Keyword.SET && | 7233 keyword != Keyword.SET && |
| 7157 keyword != Keyword.OPERATOR && | 7234 keyword != Keyword.OPERATOR && |
| 7158 (_tokenMatchesIdentifier(next) || | 7235 (_tokenMatchesIdentifier(next) || |
| 7159 _tokenMatches(next, TokenType.LT))) { | 7236 _tokenMatches(next, TokenType.LT))) { |
| 7160 Token afterTypeParameters = _skipTypeParameterList(next); | 7237 Token afterTypeParameters = _skipTypeParameterList(next); |
| (...skipping 1319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8480 } | 8557 } |
| 8481 if (modifiers.finalKeyword != null) { | 8558 if (modifiers.finalKeyword != null) { |
| 8482 _reportErrorForToken( | 8559 _reportErrorForToken( |
| 8483 ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword); | 8560 ParserErrorCode.FINAL_TYPEDEF, modifiers.finalKeyword); |
| 8484 } | 8561 } |
| 8485 if (modifiers.varKeyword != null) { | 8562 if (modifiers.varKeyword != null) { |
| 8486 _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword); | 8563 _reportErrorForToken(ParserErrorCode.VAR_TYPEDEF, modifiers.varKeyword); |
| 8487 } | 8564 } |
| 8488 } | 8565 } |
| 8489 } | 8566 } |
| OLD | NEW |