Chromium Code Reviews| 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 2732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2743 * parsed. | 2743 * parsed. |
| 2744 * | 2744 * |
| 2745 * This method assumes that the current token matches `Keyword.EXTENDS`. | 2745 * This method assumes that the current token matches `Keyword.EXTENDS`. |
| 2746 * | 2746 * |
| 2747 * classExtendsClause ::= | 2747 * classExtendsClause ::= |
| 2748 * 'extends' type | 2748 * 'extends' type |
| 2749 */ | 2749 */ |
| 2750 ExtendsClause parseExtendsClause() { | 2750 ExtendsClause parseExtendsClause() { |
| 2751 Token keyword = getAndAdvance(); | 2751 Token keyword = getAndAdvance(); |
| 2752 TypeName superclass = parseTypeName(false); | 2752 TypeName superclass = parseTypeName(false); |
| 2753 _mustNotBeNullable(superclass, ParserErrorCode.NULLABLE_TYPE_IN_EXTENDS); | |
| 2753 return new ExtendsClause(keyword, superclass); | 2754 return new ExtendsClause(keyword, superclass); |
| 2754 } | 2755 } |
| 2755 | 2756 |
| 2756 /** | 2757 /** |
| 2757 * Parse the 'final', 'const', 'var' or type preceding a variable declaration. | 2758 * Parse the 'final', 'const', 'var' or type preceding a variable declaration. |
| 2758 * The [optional] is `true` if the keyword and type are optional. Return the | 2759 * The [optional] is `true` if the keyword and type are optional. Return the |
| 2759 * 'final', 'const', 'var' or type that was parsed. | 2760 * 'final', 'const', 'var' or type that was parsed. |
| 2760 * | 2761 * |
| 2761 * finalConstVarOrType ::= | 2762 * finalConstVarOrType ::= |
| 2762 * 'final' type? | 2763 * 'final' type? |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3354 * Parse an implements clause. Return the implements clause that was parsed. | 3355 * Parse an implements clause. Return the implements clause that was parsed. |
| 3355 * | 3356 * |
| 3356 * This method assumes that the current token matches `Keyword.IMPLEMENTS`. | 3357 * This method assumes that the current token matches `Keyword.IMPLEMENTS`. |
| 3357 * | 3358 * |
| 3358 * implementsClause ::= | 3359 * implementsClause ::= |
| 3359 * 'implements' type (',' type)* | 3360 * 'implements' type (',' type)* |
| 3360 */ | 3361 */ |
| 3361 ImplementsClause parseImplementsClause() { | 3362 ImplementsClause parseImplementsClause() { |
| 3362 Token keyword = getAndAdvance(); | 3363 Token keyword = getAndAdvance(); |
| 3363 List<TypeName> interfaces = <TypeName>[]; | 3364 List<TypeName> interfaces = <TypeName>[]; |
| 3364 interfaces.add(parseTypeName(false)); | 3365 do { |
| 3365 while (_optional(TokenType.COMMA)) { | 3366 TypeName typeName = parseTypeName(false); |
| 3366 interfaces.add(parseTypeName(false)); | 3367 _mustNotBeNullable(typeName, ParserErrorCode.NULLABLE_TYPE_IN_IMPLEMENTS); |
| 3367 } | 3368 interfaces.add(typeName); |
| 3369 } while (_optional(TokenType.COMMA)); | |
| 3368 return new ImplementsClause(keyword, interfaces); | 3370 return new ImplementsClause(keyword, interfaces); |
| 3369 } | 3371 } |
| 3370 | 3372 |
| 3371 /** | 3373 /** |
| 3372 * Parse an import directive. The [commentAndMetadata] is the metadata to be | 3374 * Parse an import directive. The [commentAndMetadata] is the metadata to be |
| 3373 * associated with the directive. Return the import directive that was parsed. | 3375 * associated with the directive. Return the import directive that was parsed. |
| 3374 * | 3376 * |
| 3375 * This method assumes that the current token matches `Keyword.IMPORT`. | 3377 * This method assumes that the current token matches `Keyword.IMPORT`. |
| 3376 * | 3378 * |
| 3377 * importDirective ::= | 3379 * importDirective ::= |
| (...skipping 1542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4920 | 4922 |
| 4921 /** | 4923 /** |
| 4922 * Parse a type parameter. Return the type parameter that was parsed. | 4924 * Parse a type parameter. Return the type parameter that was parsed. |
| 4923 * | 4925 * |
| 4924 * typeParameter ::= | 4926 * typeParameter ::= |
| 4925 * metadata name ('extends' bound)? | 4927 * metadata name ('extends' bound)? |
| 4926 */ | 4928 */ |
| 4927 TypeParameter parseTypeParameter() { | 4929 TypeParameter parseTypeParameter() { |
| 4928 CommentAndMetadata commentAndMetadata = parseCommentAndMetadata(); | 4930 CommentAndMetadata commentAndMetadata = parseCommentAndMetadata(); |
| 4929 SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true); | 4931 SimpleIdentifier name = parseSimpleIdentifier(isDeclaration: true); |
| 4932 if (_matches(TokenType.QUESTION)) { | |
| 4933 _reportErrorForCurrentToken(ParserErrorCode.NULLABLE_TYPE_PARAMETER); | |
| 4934 _advance(); | |
| 4935 } | |
| 4930 if (_matchesKeyword(Keyword.EXTENDS)) { | 4936 if (_matchesKeyword(Keyword.EXTENDS)) { |
| 4931 Token keyword = getAndAdvance(); | 4937 Token keyword = getAndAdvance(); |
| 4932 TypeName bound = parseTypeName(false); | 4938 TypeName bound = parseTypeName(false); |
| 4933 return new TypeParameter(commentAndMetadata.comment, | 4939 return new TypeParameter(commentAndMetadata.comment, |
| 4934 commentAndMetadata.metadata, name, keyword, bound); | 4940 commentAndMetadata.metadata, name, keyword, bound); |
| 4935 } | 4941 } |
| 4936 return new TypeParameter(commentAndMetadata.comment, | 4942 return new TypeParameter(commentAndMetadata.comment, |
| 4937 commentAndMetadata.metadata, name, null, null); | 4943 commentAndMetadata.metadata, name, null, null); |
| 4938 } | 4944 } |
| 4939 | 4945 |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5153 /** | 5159 /** |
| 5154 * Parse a with clause. Return the with clause that was parsed. | 5160 * Parse a with clause. Return the with clause that was parsed. |
| 5155 * | 5161 * |
| 5156 * This method assumes that the current token matches `Keyword.WITH`. | 5162 * This method assumes that the current token matches `Keyword.WITH`. |
| 5157 * | 5163 * |
| 5158 * withClause ::= | 5164 * withClause ::= |
| 5159 * 'with' typeName (',' typeName)* | 5165 * 'with' typeName (',' typeName)* |
| 5160 */ | 5166 */ |
| 5161 WithClause parseWithClause() { | 5167 WithClause parseWithClause() { |
| 5162 Token withKeyword = getAndAdvance(); | 5168 Token withKeyword = getAndAdvance(); |
| 5163 List<TypeName> types = <TypeName>[parseTypeName(false)]; | 5169 List<TypeName> types = <TypeName>[]; |
| 5164 while (_optional(TokenType.COMMA)) { | 5170 do { |
| 5165 types.add(parseTypeName(false)); | 5171 TypeName typeName = parseTypeName(false); |
| 5166 } | 5172 _mustNotBeNullable(typeName, ParserErrorCode.NULLABLE_TYPE_IN_WITH); |
| 5173 types.add(typeName); | |
| 5174 } while (_optional(TokenType.COMMA)); | |
| 5167 return new WithClause(withKeyword, types); | 5175 return new WithClause(withKeyword, types); |
| 5168 } | 5176 } |
| 5169 | 5177 |
| 5170 /** | 5178 /** |
| 5171 * Parse a yield statement. Return the yield statement that was parsed. | 5179 * Parse a yield statement. Return the yield statement that was parsed. |
| 5172 * | 5180 * |
| 5173 * This method assumes that the current token matches [Keyword.YIELD]. | 5181 * This method assumes that the current token matches [Keyword.YIELD]. |
| 5174 * | 5182 * |
| 5175 * yieldStatement ::= | 5183 * yieldStatement ::= |
| 5176 * 'yield' '*'? expression ';' | 5184 * 'yield' '*'? expression ';' |
| (...skipping 770 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5947 _tokenMatchesKeyword(_currentToken, keyword); | 5955 _tokenMatchesKeyword(_currentToken, keyword); |
| 5948 | 5956 |
| 5949 /** | 5957 /** |
| 5950 * Return `true` if the current token matches the given [identifier]. | 5958 * Return `true` if the current token matches the given [identifier]. |
| 5951 */ | 5959 */ |
| 5952 bool _matchesString(String identifier) => | 5960 bool _matchesString(String identifier) => |
| 5953 _currentToken.type == TokenType.IDENTIFIER && | 5961 _currentToken.type == TokenType.IDENTIFIER && |
| 5954 _currentToken.lexeme == identifier; | 5962 _currentToken.lexeme == identifier; |
| 5955 | 5963 |
| 5956 /** | 5964 /** |
| 5965 * Report an error with the given [errorCode] if the given [typeName] has been | |
| 5966 * marked as nullable. | |
| 5967 */ | |
| 5968 void _mustNotBeNullable(TypeName typeName, ParserErrorCode errorCode) { | |
| 5969 if (typeName.question != null) { | |
| 5970 _reportErrorForToken(errorCode, typeName.question); | |
| 5971 } | |
| 5972 } | |
| 5973 | |
| 5974 /** | |
| 5957 * If the current token has the given [type], then advance to the next token | 5975 * If the current token has the given [type], then advance to the next token |
| 5958 * and return `true`. Otherwise, return `false` without advancing. This method | 5976 * and return `true`. Otherwise, return `false` without advancing. This method |
| 5959 * should not be invoked with an argument value of [TokenType.GT]. | 5977 * should not be invoked with an argument value of [TokenType.GT]. |
| 5960 */ | 5978 */ |
| 5961 bool _optional(TokenType type) { | 5979 bool _optional(TokenType type) { |
| 5962 if (_currentToken.type == type) { | 5980 if (_currentToken.type == type) { |
| 5963 _advance(); | 5981 _advance(); |
| 5964 return true; | 5982 return true; |
| 5965 } | 5983 } |
| 5966 return false; | 5984 return false; |
| (...skipping 2649 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8616 "Enclose the URI in either single or double quotes."); | 8634 "Enclose the URI in either single or double quotes."); |
| 8617 | 8635 |
| 8618 static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = | 8636 static const ParserErrorCode NON_USER_DEFINABLE_OPERATOR = |
| 8619 const ParserErrorCode('NON_USER_DEFINABLE_OPERATOR', | 8637 const ParserErrorCode('NON_USER_DEFINABLE_OPERATOR', |
| 8620 "The operator '{0}' is not user definable"); | 8638 "The operator '{0}' is not user definable"); |
| 8621 | 8639 |
| 8622 static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = | 8640 static const ParserErrorCode NORMAL_BEFORE_OPTIONAL_PARAMETERS = |
| 8623 const ParserErrorCode('NORMAL_BEFORE_OPTIONAL_PARAMETERS', | 8641 const ParserErrorCode('NORMAL_BEFORE_OPTIONAL_PARAMETERS', |
| 8624 "Normal parameters must occur before optional parameters"); | 8642 "Normal parameters must occur before optional parameters"); |
| 8625 | 8643 |
| 8644 static const ParserErrorCode NULLABLE_TYPE_IN_EXTENDS = const ParserErrorCode( | |
| 8645 'NULLABLE_TYPE_IN_EXTENDS', | |
| 8646 "A nullable type cannot be used in an extends clause", | |
| 8647 "Remove the '?' from the type name"); | |
| 8648 | |
| 8649 static const ParserErrorCode NULLABLE_TYPE_IN_IMPLEMENTS = | |
| 8650 const ParserErrorCode( | |
| 8651 'NULLABLE_TYPE_IN_IMPLEMENTS', | |
| 8652 "A nullable type cannot be used in an implements clause", | |
| 8653 "Remove the '?' from the type name"); | |
| 8654 | |
| 8655 static const ParserErrorCode NULLABLE_TYPE_IN_WITH = const ParserErrorCode( | |
| 8656 'NULLABLE_TYPE_IN_WITH', | |
| 8657 "A nullable type cannot be used in an with clause", | |
|
scheglov
2016/09/22 20:30:43
"a with"?
Brian Wilkerson
2016/09/22 20:43:13
Done
| |
| 8658 "Remove the '?' from the type name"); | |
| 8659 | |
| 8660 static const ParserErrorCode NULLABLE_TYPE_PARAMETER = const ParserErrorCode( | |
| 8661 'NULLABLE_TYPE_PARAMETER', | |
| 8662 "Type parameters cannot be nullable", | |
| 8663 "Remove the '?' from the type name"); | |
| 8664 | |
| 8626 static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = | 8665 static const ParserErrorCode POSITIONAL_AFTER_NAMED_ARGUMENT = |
| 8627 const ParserErrorCode('POSITIONAL_AFTER_NAMED_ARGUMENT', | 8666 const ParserErrorCode('POSITIONAL_AFTER_NAMED_ARGUMENT', |
| 8628 "Positional arguments must occur before named arguments"); | 8667 "Positional arguments must occur before named arguments"); |
| 8629 | 8668 |
| 8630 static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = | 8669 static const ParserErrorCode POSITIONAL_PARAMETER_OUTSIDE_GROUP = |
| 8631 const ParserErrorCode('POSITIONAL_PARAMETER_OUTSIDE_GROUP', | 8670 const ParserErrorCode('POSITIONAL_PARAMETER_OUTSIDE_GROUP', |
| 8632 "Positional parameters must be enclosed in square brackets ('[' and '] ')"); | 8671 "Positional parameters must be enclosed in square brackets ('[' and '] ')"); |
| 8633 | 8672 |
| 8634 static const ParserErrorCode REDIRECTING_CONSTRUCTOR_WITH_BODY = | 8673 static const ParserErrorCode REDIRECTING_CONSTRUCTOR_WITH_BODY = |
| 8635 const ParserErrorCode('REDIRECTING_CONSTRUCTOR_WITH_BODY', | 8674 const ParserErrorCode('REDIRECTING_CONSTRUCTOR_WITH_BODY', |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8748 */ | 8787 */ |
| 8749 const ParserErrorCode(String name, String message, [String correction]) | 8788 const ParserErrorCode(String name, String message, [String correction]) |
| 8750 : super(name, message, correction); | 8789 : super(name, message, correction); |
| 8751 | 8790 |
| 8752 @override | 8791 @override |
| 8753 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; | 8792 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; |
| 8754 | 8793 |
| 8755 @override | 8794 @override |
| 8756 ErrorType get type => ErrorType.SYNTACTIC_ERROR; | 8795 ErrorType get type => ErrorType.SYNTACTIC_ERROR; |
| 8757 } | 8796 } |
| OLD | NEW |