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.parser; | 5 library analyzer.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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 | 173 |
174 static String _SHOW = Keyword.SHOW.lexeme; | 174 static String _SHOW = Keyword.SHOW.lexeme; |
175 | 175 |
176 static String SYNC = Keyword.SYNC.lexeme; | 176 static String SYNC = Keyword.SYNC.lexeme; |
177 | 177 |
178 static String _YIELD = Keyword.YIELD.lexeme; | 178 static String _YIELD = Keyword.YIELD.lexeme; |
179 | 179 |
180 static const int _MAX_TREE_DEPTH = 300; | 180 static const int _MAX_TREE_DEPTH = 300; |
181 | 181 |
182 /** | 182 /** |
| 183 * A flag indicating whether the analyzer [Parser] factory method |
| 184 * will return a fasta based parser or an analyzer based parser. |
| 185 */ |
| 186 static bool useFasta = const bool.fromEnvironment("useFastaParser"); |
| 187 |
| 188 /** |
183 * The source being parsed. | 189 * The source being parsed. |
184 */ | 190 */ |
185 final Source _source; | 191 final Source _source; |
186 | 192 |
187 /** | 193 /** |
188 * The error listener that will be informed of any errors that are found | 194 * The error listener that will be informed of any errors that are found |
189 * during the parse. | 195 * during the parse. |
190 */ | 196 */ |
191 final AnalysisErrorListener _errorListener; | 197 final AnalysisErrorListener _errorListener; |
192 | 198 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 @deprecated | 269 @deprecated |
264 bool parseGenericMethods = false; | 270 bool parseGenericMethods = false; |
265 | 271 |
266 /** | 272 /** |
267 * A flag indicating whether to parse generic method comments, of the form | 273 * A flag indicating whether to parse generic method comments, of the form |
268 * `/*=T*/` and `/*<T>*/`. | 274 * `/*=T*/` and `/*<T>*/`. |
269 */ | 275 */ |
270 bool parseGenericMethodComments = false; | 276 bool parseGenericMethodComments = false; |
271 | 277 |
272 /** | 278 /** |
273 * A flag indicating whether the analyzer [Parser] factory method | |
274 * will return a fasta based parser or an analyzer based parser. | |
275 */ | |
276 static bool useFasta = const bool.fromEnvironment("useFastaParser"); | |
277 | |
278 /** | |
279 * Initialize a newly created parser to parse tokens in the given [_source] | 279 * Initialize a newly created parser to parse tokens in the given [_source] |
280 * and to report any errors that are found to the given [_errorListener]. | 280 * and to report any errors that are found to the given [_errorListener]. |
281 */ | 281 */ |
282 factory Parser(Source source, AnalysisErrorListener errorListener, | 282 factory Parser(Source source, AnalysisErrorListener errorListener, |
283 {bool useFasta}) { | 283 {bool useFasta}) { |
284 if (useFasta ?? Parser.useFasta) { | 284 if (useFasta ?? Parser.useFasta) { |
285 return new _Parser2(source, errorListener); | 285 return new _Parser2(source, errorListener); |
286 } else { | 286 } else { |
287 return new Parser.withoutFasta(source, errorListener); | 287 return new Parser.withoutFasta(source, errorListener); |
288 } | 288 } |
(...skipping 2592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2881 type = _parseOptionalTypeNameComment(); | 2881 type = _parseOptionalTypeNameComment(); |
2882 if (type != null) { | 2882 if (type != null) { |
2883 // Clear the keyword to prevent an error. | 2883 // Clear the keyword to prevent an error. |
2884 keywordToken = null; | 2884 keywordToken = null; |
2885 } | 2885 } |
2886 } else if (_isTypedIdentifier(_currentToken)) { | 2886 } else if (_isTypedIdentifier(_currentToken)) { |
2887 type = parseReturnType(false); | 2887 type = parseReturnType(false); |
2888 } else if (inFunctionType && _matchesIdentifier()) { | 2888 } else if (inFunctionType && _matchesIdentifier()) { |
2889 type = parseTypeAnnotation(false); | 2889 type = parseTypeAnnotation(false); |
2890 } else if (!optional) { | 2890 } else if (!optional) { |
| 2891 // If there is a valid type immediately following an unexpected token, |
| 2892 // then report and skip the unexpected token. |
| 2893 Token next = _peek(); |
| 2894 Keyword nextKeyword = next.keyword; |
| 2895 if (nextKeyword == Keyword.FINAL || |
| 2896 nextKeyword == Keyword.CONST || |
| 2897 nextKeyword == Keyword.VAR || |
| 2898 _isTypedIdentifier(next) || |
| 2899 inFunctionType && _tokenMatchesIdentifier(next)) { |
| 2900 _reportErrorForCurrentToken( |
| 2901 ParserErrorCode.UNEXPECTED_TOKEN, [_currentToken.lexeme]); |
| 2902 _advance(); |
| 2903 return parseFinalConstVarOrType(optional, |
| 2904 inFunctionType: inFunctionType); |
| 2905 } |
2891 _reportErrorForCurrentToken( | 2906 _reportErrorForCurrentToken( |
2892 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); | 2907 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); |
2893 } else { | 2908 } else { |
2894 // Support parameters such as `(/*=K*/ key, /*=V*/ value)` | 2909 // Support parameters such as `(/*=K*/ key, /*=V*/ value)` |
2895 // This is not supported if the type is required. | 2910 // This is not supported if the type is required. |
2896 type = _parseOptionalTypeNameComment(); | 2911 type = _parseOptionalTypeNameComment(); |
2897 } | 2912 } |
2898 return new FinalConstVarOrType(keywordToken, type); | 2913 return new FinalConstVarOrType(keywordToken, type); |
2899 } | 2914 } |
2900 | 2915 |
(...skipping 5725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8626 } | 8641 } |
8627 } | 8642 } |
8628 } | 8643 } |
8629 | 8644 |
8630 /** | 8645 /** |
8631 * Instances of this class are thrown when the parser detects that AST has | 8646 * Instances of this class are thrown when the parser detects that AST has |
8632 * too many nested expressions to be parsed safely and avoid possibility of | 8647 * too many nested expressions to be parsed safely and avoid possibility of |
8633 * [StackOverflowError] in the parser or during later analysis. | 8648 * [StackOverflowError] in the parser or during later analysis. |
8634 */ | 8649 */ |
8635 class _TooDeepTreeError {} | 8650 class _TooDeepTreeError {} |
OLD | NEW |