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:math" as math; | 11 import "dart:math" as math; |
11 import 'dart:collection'; | |
12 | 12 |
13 import 'ast.dart'; | 13 import 'ast.dart'; |
14 import 'engine.dart' show AnalysisEngine, AnalysisOptionsImpl; | 14 import 'engine.dart' show AnalysisEngine, AnalysisOptionsImpl; |
15 import 'error.dart'; | 15 import 'error.dart'; |
16 import 'java_core.dart'; | 16 import 'java_core.dart'; |
17 import 'java_engine.dart'; | 17 import 'java_engine.dart'; |
18 import 'scanner.dart'; | 18 import 'scanner.dart'; |
19 import 'source.dart'; | 19 import 'source.dart'; |
20 import 'utilities_collection.dart' show TokenMap; | 20 import 'utilities_collection.dart' show TokenMap; |
21 import 'utilities_dart.dart'; | 21 import 'utilities_dart.dart'; |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 'parseLibraryName_2': new MethodTrampoline( | 256 'parseLibraryName_2': new MethodTrampoline( |
257 2, (Parser target, arg0, arg1) => target._parseLibraryName(arg0, arg1)), | 257 2, (Parser target, arg0, arg1) => target._parseLibraryName(arg0, arg1)), |
258 'parseListLiteral_2': new MethodTrampoline( | 258 'parseListLiteral_2': new MethodTrampoline( |
259 2, (Parser target, arg0, arg1) => target._parseListLiteral(arg0, arg1)), | 259 2, (Parser target, arg0, arg1) => target._parseListLiteral(arg0, arg1)), |
260 'parseListOrMapLiteral_1': new MethodTrampoline( | 260 'parseListOrMapLiteral_1': new MethodTrampoline( |
261 1, (Parser target, arg0) => target._parseListOrMapLiteral(arg0)), | 261 1, (Parser target, arg0) => target._parseListOrMapLiteral(arg0)), |
262 'parseLogicalAndExpression_0': new MethodTrampoline( | 262 'parseLogicalAndExpression_0': new MethodTrampoline( |
263 0, (Parser target) => target._parseLogicalAndExpression()), | 263 0, (Parser target) => target._parseLogicalAndExpression()), |
264 'parseMapLiteral_2': new MethodTrampoline( | 264 'parseMapLiteral_2': new MethodTrampoline( |
265 2, (Parser target, arg0, arg1) => target._parseMapLiteral(arg0, arg1)), | 265 2, (Parser target, arg0, arg1) => target._parseMapLiteral(arg0, arg1)), |
266 'parseMethodDeclarationAfterParameters_6': new MethodTrampoline(6, | 266 'parseMethodDeclarationAfterParameters_7': new MethodTrampoline(7, |
267 (Parser target, arg0, arg1, arg2, arg3, arg4, arg5) => target | 267 (Parser target, arg0, arg1, arg2, arg3, arg4, arg5, arg6) => target |
268 ._parseMethodDeclarationAfterParameters( | 268 ._parseMethodDeclarationAfterParameters( |
269 arg0, arg1, arg2, arg3, arg4, arg5)), | 269 arg0, arg1, arg2, arg3, arg4, arg5, arg6)), |
270 'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline(4, | 270 'parseMethodDeclarationAfterReturnType_4': new MethodTrampoline(4, |
271 (Parser target, arg0, arg1, arg2, arg3) => target | 271 (Parser target, arg0, arg1, arg2, arg3) => target |
272 ._parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3)), | 272 ._parseMethodDeclarationAfterReturnType(arg0, arg1, arg2, arg3)), |
273 'parseModifiers_0': | 273 'parseModifiers_0': |
274 new MethodTrampoline(0, (Parser target) => target._parseModifiers()), | 274 new MethodTrampoline(0, (Parser target) => target._parseModifiers()), |
275 'parseMultiplicativeExpression_0': new MethodTrampoline( | 275 'parseMultiplicativeExpression_0': new MethodTrampoline( |
276 0, (Parser target) => target._parseMultiplicativeExpression()), | 276 0, (Parser target) => target._parseMultiplicativeExpression()), |
277 'parseNativeClause_0': | 277 'parseNativeClause_0': |
278 new MethodTrampoline(0, (Parser target) => target._parseNativeClause()), | 278 new MethodTrampoline(0, (Parser target) => target._parseNativeClause()), |
279 'parseNewExpression_0': | 279 'parseNewExpression_0': |
(...skipping 1793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2073 */ | 2073 */ |
2074 bool _inSwitch = false; | 2074 bool _inSwitch = false; |
2075 | 2075 |
2076 /** | 2076 /** |
2077 * A flag indicating whether the parser is currently in a constructor field | 2077 * A flag indicating whether the parser is currently in a constructor field |
2078 * initializer, with no intervening parens, braces, or brackets. | 2078 * initializer, with no intervening parens, braces, or brackets. |
2079 */ | 2079 */ |
2080 bool _inInitializer = false; | 2080 bool _inInitializer = false; |
2081 | 2081 |
2082 /** | 2082 /** |
| 2083 * A flag indicating whether the parser is to parse generic method syntax. |
| 2084 */ |
| 2085 bool parseGenericMethods = false; |
| 2086 |
| 2087 /** |
2083 * Initialize a newly created parser to parse the content of the given | 2088 * Initialize a newly created parser to parse the content of the given |
2084 * [_source] and to report any errors that are found to the given | 2089 * [_source] and to report any errors that are found to the given |
2085 * [_errorListener]. | 2090 * [_errorListener]. |
2086 */ | 2091 */ |
2087 Parser(this._source, this._errorListener); | 2092 Parser(this._source, this._errorListener); |
2088 | 2093 |
2089 void set currentToken(Token currentToken) { | 2094 void set currentToken(Token currentToken) { |
2090 this._currentToken = currentToken; | 2095 this._currentToken = currentToken; |
2091 } | 2096 } |
2092 | 2097 |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2433 if (commentAndMetadata.comment != null || | 2438 if (commentAndMetadata.comment != null || |
2434 !commentAndMetadata.metadata.isEmpty) { | 2439 !commentAndMetadata.metadata.isEmpty) { |
2435 // | 2440 // |
2436 // We appear to have found an incomplete declaration at the end of the | 2441 // We appear to have found an incomplete declaration at the end of the |
2437 // class. At this point it consists of a metadata, which we don't want | 2442 // class. At this point it consists of a metadata, which we don't want |
2438 // to loose, so we'll treat it as a method declaration with a missing | 2443 // to loose, so we'll treat it as a method declaration with a missing |
2439 // name, parameters and empty body. | 2444 // name, parameters and empty body. |
2440 // | 2445 // |
2441 return new MethodDeclaration(commentAndMetadata.comment, | 2446 return new MethodDeclaration(commentAndMetadata.comment, |
2442 commentAndMetadata.metadata, null, null, null, null, null, | 2447 commentAndMetadata.metadata, null, null, null, null, null, |
2443 _createSyntheticIdentifier(), new FormalParameterList( | 2448 _createSyntheticIdentifier(), null, new FormalParameterList( |
2444 null, new List<FormalParameter>(), null, null, null), | 2449 null, new List<FormalParameter>(), null, null, null), |
2445 new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); | 2450 new EmptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); |
2446 } | 2451 } |
2447 return null; | 2452 return null; |
2448 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && | 2453 } else if (_tokenMatches(_peek(), TokenType.PERIOD) && |
2449 _tokenMatchesIdentifier(_peekAt(2)) && | 2454 _tokenMatchesIdentifier(_peekAt(2)) && |
2450 _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { | 2455 _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { |
2451 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, | 2456 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, |
2452 _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, | 2457 _validateModifiersForConstructor(modifiers), modifiers.factoryKeyword, |
2453 parseSimpleIdentifier(), getAndAdvance(), parseSimpleIdentifier(), | 2458 parseSimpleIdentifier(), getAndAdvance(), parseSimpleIdentifier(), |
2454 parseFormalParameterList()); | 2459 parseFormalParameterList()); |
2455 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { | 2460 } else if (_tokenMatches(_peek(), TokenType.OPEN_PAREN)) { |
2456 SimpleIdentifier methodName = parseSimpleIdentifier(); | 2461 SimpleIdentifier methodName = parseSimpleIdentifier(); |
2457 FormalParameterList parameters = parseFormalParameterList(); | 2462 FormalParameterList parameters = parseFormalParameterList(); |
2458 if (_matches(TokenType.COLON) || | 2463 if (_matches(TokenType.COLON) || |
2459 modifiers.factoryKeyword != null || | 2464 modifiers.factoryKeyword != null || |
2460 methodName.name == className) { | 2465 methodName.name == className) { |
2461 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, | 2466 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, |
2462 _validateModifiersForConstructor(modifiers), | 2467 _validateModifiersForConstructor(modifiers), |
2463 modifiers.factoryKeyword, methodName, null, null, parameters); | 2468 modifiers.factoryKeyword, methodName, null, null, parameters); |
2464 } | 2469 } |
2465 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2470 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
2466 _validateFormalParameterList(parameters); | 2471 _validateFormalParameterList(parameters); |
2467 return _parseMethodDeclarationAfterParameters(commentAndMetadata, | 2472 return _parseMethodDeclarationAfterParameters(commentAndMetadata, |
2468 modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, | 2473 modifiers.externalKeyword, modifiers.staticKeyword, null, methodName, |
2469 parameters); | 2474 null, parameters); |
2470 } else if (_peek() | 2475 } else if (_peek() |
2471 .matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { | 2476 .matchesAny([TokenType.EQ, TokenType.COMMA, TokenType.SEMICOLON])) { |
2472 if (modifiers.constKeyword == null && | 2477 if (modifiers.constKeyword == null && |
2473 modifiers.finalKeyword == null && | 2478 modifiers.finalKeyword == null && |
2474 modifiers.varKeyword == null) { | 2479 modifiers.varKeyword == null) { |
2475 _reportErrorForCurrentToken( | 2480 _reportErrorForCurrentToken( |
2476 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); | 2481 ParserErrorCode.MISSING_CONST_FINAL_VAR_OR_TYPE); |
2477 } | 2482 } |
2478 return _parseInitializedIdentifierList(commentAndMetadata, | 2483 return _parseInitializedIdentifierList(commentAndMetadata, |
2479 modifiers.staticKeyword, _validateModifiersForField(modifiers), null); | 2484 modifiers.staticKeyword, _validateModifiersForField(modifiers), null); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2539 if (methodName.name == className) { | 2544 if (methodName.name == className) { |
2540 _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type); | 2545 _reportErrorForNode(ParserErrorCode.CONSTRUCTOR_WITH_RETURN_TYPE, type); |
2541 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, | 2546 return _parseConstructor(commentAndMetadata, modifiers.externalKeyword, |
2542 _validateModifiersForConstructor(modifiers), | 2547 _validateModifiersForConstructor(modifiers), |
2543 modifiers.factoryKeyword, methodName, null, null, parameters); | 2548 modifiers.factoryKeyword, methodName, null, null, parameters); |
2544 } | 2549 } |
2545 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2550 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
2546 _validateFormalParameterList(parameters); | 2551 _validateFormalParameterList(parameters); |
2547 return _parseMethodDeclarationAfterParameters(commentAndMetadata, | 2552 return _parseMethodDeclarationAfterParameters(commentAndMetadata, |
2548 modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, | 2553 modifiers.externalKeyword, modifiers.staticKeyword, type, methodName, |
2549 parameters); | 2554 null, parameters); |
2550 } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) { | 2555 } else if (_tokenMatches(_peek(), TokenType.OPEN_CURLY_BRACKET)) { |
2551 // We have found "TypeName identifier {", and are guessing that this is a | 2556 // We have found "TypeName identifier {", and are guessing that this is a |
2552 // getter without the keyword 'get'. | 2557 // getter without the keyword 'get'. |
2553 _validateModifiersForGetterOrSetterOrMethod(modifiers); | 2558 _validateModifiersForGetterOrSetterOrMethod(modifiers); |
2554 _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET); | 2559 _reportErrorForCurrentToken(ParserErrorCode.MISSING_GET); |
2555 _currentToken = _injectToken( | 2560 _currentToken = _injectToken( |
2556 new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset)); | 2561 new Parser_SyntheticKeywordToken(Keyword.GET, _currentToken.offset)); |
2557 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, | 2562 return _parseGetter(commentAndMetadata, modifiers.externalKeyword, |
2558 modifiers.staticKeyword, type); | 2563 modifiers.staticKeyword, type); |
2559 } | 2564 } |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3036 * parsed. | 3041 * parsed. |
3037 * | 3042 * |
3038 * functionExpression ::= | 3043 * functionExpression ::= |
3039 * formalParameterList functionExpressionBody | 3044 * formalParameterList functionExpressionBody |
3040 */ | 3045 */ |
3041 FunctionExpression parseFunctionExpression() { | 3046 FunctionExpression parseFunctionExpression() { |
3042 FormalParameterList parameters = parseFormalParameterList(); | 3047 FormalParameterList parameters = parseFormalParameterList(); |
3043 _validateFormalParameterList(parameters); | 3048 _validateFormalParameterList(parameters); |
3044 FunctionBody body = | 3049 FunctionBody body = |
3045 _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true); | 3050 _parseFunctionBody(false, ParserErrorCode.MISSING_FUNCTION_BODY, true); |
3046 return new FunctionExpression(parameters, body); | 3051 return new FunctionExpression(null, parameters, body); |
3047 } | 3052 } |
3048 | 3053 |
3049 /** | 3054 /** |
3050 * Parse an if-null expression. Return the if-null expression that was | 3055 * Parse an if-null expression. Return the if-null expression that was |
3051 * parsed. | 3056 * parsed. |
3052 * | 3057 * |
3053 * ifNullExpression ::= logicalOrExpression ('??' logicalOrExpression)* | 3058 * ifNullExpression ::= logicalOrExpression ('??' logicalOrExpression)* |
3054 */ | 3059 */ |
3055 Expression parseIfNullExpression() { | 3060 Expression parseIfNullExpression() { |
3056 Expression expression = parseLogicalOrExpression(); | 3061 Expression expression = parseLogicalOrExpression(); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3166 } | 3171 } |
3167 SimpleIdentifier identifier = parseSimpleIdentifier(); | 3172 SimpleIdentifier identifier = parseSimpleIdentifier(); |
3168 if (_matches(TokenType.OPEN_PAREN)) { | 3173 if (_matches(TokenType.OPEN_PAREN)) { |
3169 FormalParameterList parameters = parseFormalParameterList(); | 3174 FormalParameterList parameters = parseFormalParameterList(); |
3170 if (thisKeyword == null) { | 3175 if (thisKeyword == null) { |
3171 if (holder.keyword != null) { | 3176 if (holder.keyword != null) { |
3172 _reportErrorForToken( | 3177 _reportErrorForToken( |
3173 ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword); | 3178 ParserErrorCode.FUNCTION_TYPED_PARAMETER_VAR, holder.keyword); |
3174 } | 3179 } |
3175 return new FunctionTypedFormalParameter(commentAndMetadata.comment, | 3180 return new FunctionTypedFormalParameter(commentAndMetadata.comment, |
3176 commentAndMetadata.metadata, holder.type, identifier, parameters); | 3181 commentAndMetadata.metadata, holder.type, identifier, null, |
| 3182 parameters); |
3177 } else { | 3183 } else { |
3178 return new FieldFormalParameter(commentAndMetadata.comment, | 3184 return new FieldFormalParameter(commentAndMetadata.comment, |
3179 commentAndMetadata.metadata, holder.keyword, holder.type, | 3185 commentAndMetadata.metadata, holder.keyword, holder.type, |
3180 thisKeyword, period, identifier, parameters); | 3186 thisKeyword, period, identifier, null, parameters); |
3181 } | 3187 } |
3182 } | 3188 } |
3183 TypeName type = holder.type; | 3189 TypeName type = holder.type; |
3184 if (type != null) { | 3190 if (type != null) { |
3185 if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) { | 3191 if (_tokenMatchesKeyword(type.name.beginToken, Keyword.VOID)) { |
3186 _reportErrorForToken( | 3192 _reportErrorForToken( |
3187 ParserErrorCode.VOID_PARAMETER, type.name.beginToken); | 3193 ParserErrorCode.VOID_PARAMETER, type.name.beginToken); |
3188 } else if (holder.keyword != null && | 3194 } else if (holder.keyword != null && |
3189 _tokenMatchesKeyword(holder.keyword, Keyword.VAR)) { | 3195 _tokenMatchesKeyword(holder.keyword, Keyword.VAR)) { |
3190 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword); | 3196 _reportErrorForToken(ParserErrorCode.VAR_AND_TYPE, holder.keyword); |
3191 } | 3197 } |
3192 } | 3198 } |
3193 if (thisKeyword != null) { | 3199 if (thisKeyword != null) { |
3194 return new FieldFormalParameter(commentAndMetadata.comment, | 3200 return new FieldFormalParameter(commentAndMetadata.comment, |
3195 commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, | 3201 commentAndMetadata.metadata, holder.keyword, holder.type, thisKeyword, |
3196 period, identifier, null); | 3202 period, identifier, null, null); |
3197 } | 3203 } |
3198 return new SimpleFormalParameter(commentAndMetadata.comment, | 3204 return new SimpleFormalParameter(commentAndMetadata.comment, |
3199 commentAndMetadata.metadata, holder.keyword, holder.type, identifier); | 3205 commentAndMetadata.metadata, holder.keyword, holder.type, identifier); |
3200 } | 3206 } |
3201 | 3207 |
3202 /** | 3208 /** |
3203 * Parse a prefixed identifier. Return the prefixed identifier that was | 3209 * Parse a prefixed identifier. Return the prefixed identifier that was |
3204 * parsed. | 3210 * parsed. |
3205 * | 3211 * |
3206 * prefixedIdentifier ::= | 3212 * prefixedIdentifier ::= |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3475 } | 3481 } |
3476 | 3482 |
3477 /** | 3483 /** |
3478 * Convert the given [method] declaration into the nearest valid top-level | 3484 * Convert the given [method] declaration into the nearest valid top-level |
3479 * function declaration (that is, the function declaration that most closely | 3485 * function declaration (that is, the function declaration that most closely |
3480 * captures the components of the given method declaration). | 3486 * captures the components of the given method declaration). |
3481 */ | 3487 */ |
3482 FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) => | 3488 FunctionDeclaration _convertToFunctionDeclaration(MethodDeclaration method) => |
3483 new FunctionDeclaration(method.documentationComment, method.metadata, | 3489 new FunctionDeclaration(method.documentationComment, method.metadata, |
3484 method.externalKeyword, method.returnType, method.propertyKeyword, | 3490 method.externalKeyword, method.returnType, method.propertyKeyword, |
3485 method.name, new FunctionExpression(method.parameters, method.body)); | 3491 method.name, new FunctionExpression( |
| 3492 method.typeParameters, method.parameters, method.body)); |
3486 | 3493 |
3487 /** | 3494 /** |
3488 * Return `true` if the current token could be the start of a compilation unit | 3495 * Return `true` if the current token could be the start of a compilation unit |
3489 * member. This method is used for recovery purposes to decide when to stop | 3496 * member. This method is used for recovery purposes to decide when to stop |
3490 * skipping tokens after finding an error while parsing a compilation unit | 3497 * skipping tokens after finding an error while parsing a compilation unit |
3491 * member. | 3498 * member. |
3492 */ | 3499 */ |
3493 bool _couldBeStartOfCompilationUnitMember() { | 3500 bool _couldBeStartOfCompilationUnitMember() { |
3494 if ((_matchesKeyword(Keyword.IMPORT) || | 3501 if ((_matchesKeyword(Keyword.IMPORT) || |
3495 _matchesKeyword(Keyword.EXPORT) || | 3502 _matchesKeyword(Keyword.EXPORT) || |
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4174 // ambiguity by determining whether the primary consists of anything other | 4181 // ambiguity by determining whether the primary consists of anything other |
4175 // than an identifier and/or is followed by an assignableSelector. | 4182 // than an identifier and/or is followed by an assignableSelector. |
4176 // | 4183 // |
4177 Expression expression = _parsePrimaryExpression(); | 4184 Expression expression = _parsePrimaryExpression(); |
4178 bool isOptional = primaryAllowed || expression is SimpleIdentifier; | 4185 bool isOptional = primaryAllowed || expression is SimpleIdentifier; |
4179 while (true) { | 4186 while (true) { |
4180 while (_matches(TokenType.OPEN_PAREN)) { | 4187 while (_matches(TokenType.OPEN_PAREN)) { |
4181 ArgumentList argumentList = parseArgumentList(); | 4188 ArgumentList argumentList = parseArgumentList(); |
4182 if (expression is SimpleIdentifier) { | 4189 if (expression is SimpleIdentifier) { |
4183 expression = new MethodInvocation( | 4190 expression = new MethodInvocation( |
4184 null, null, expression as SimpleIdentifier, argumentList); | 4191 null, null, expression as SimpleIdentifier, null, argumentList); |
4185 } else if (expression is PrefixedIdentifier) { | 4192 } else if (expression is PrefixedIdentifier) { |
4186 PrefixedIdentifier identifier = expression as PrefixedIdentifier; | 4193 PrefixedIdentifier identifier = expression as PrefixedIdentifier; |
4187 expression = new MethodInvocation(identifier.prefix, | 4194 expression = new MethodInvocation(identifier.prefix, |
4188 identifier.period, identifier.identifier, argumentList); | 4195 identifier.period, identifier.identifier, null, argumentList); |
4189 } else if (expression is PropertyAccess) { | 4196 } else if (expression is PropertyAccess) { |
4190 PropertyAccess access = expression as PropertyAccess; | 4197 PropertyAccess access = expression as PropertyAccess; |
4191 expression = new MethodInvocation(access.target, access.operator, | 4198 expression = new MethodInvocation(access.target, access.operator, |
4192 access.propertyName, argumentList); | 4199 access.propertyName, null, argumentList); |
4193 } else { | 4200 } else { |
4194 expression = | 4201 expression = |
4195 new FunctionExpressionInvocation(expression, argumentList); | 4202 new FunctionExpressionInvocation(expression, null, argumentList); |
4196 } | 4203 } |
4197 if (!primaryAllowed) { | 4204 if (!primaryAllowed) { |
4198 isOptional = false; | 4205 isOptional = false; |
4199 } | 4206 } |
4200 } | 4207 } |
4201 Expression selectorExpression = _parseAssignableSelector( | 4208 Expression selectorExpression = _parseAssignableSelector( |
4202 expression, isOptional || (expression is PrefixedIdentifier)); | 4209 expression, isOptional || (expression is PrefixedIdentifier)); |
4203 if (identical(selectorExpression, expression)) { | 4210 if (identical(selectorExpression, expression)) { |
4204 if (!isOptional && (expression is PrefixedIdentifier)) { | 4211 if (!isOptional && (expression is PrefixedIdentifier)) { |
4205 PrefixedIdentifier identifier = expression as PrefixedIdentifier; | 4212 PrefixedIdentifier identifier = expression as PrefixedIdentifier; |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4376 _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, | 4383 _reportErrorForToken(ParserErrorCode.MISSING_IDENTIFIER, _currentToken, |
4377 [_currentToken.lexeme]); | 4384 [_currentToken.lexeme]); |
4378 functionName = _createSyntheticIdentifier(); | 4385 functionName = _createSyntheticIdentifier(); |
4379 } | 4386 } |
4380 assert((expression == null && functionName != null) || | 4387 assert((expression == null && functionName != null) || |
4381 (expression != null && functionName == null)); | 4388 (expression != null && functionName == null)); |
4382 if (_currentToken.type == TokenType.OPEN_PAREN) { | 4389 if (_currentToken.type == TokenType.OPEN_PAREN) { |
4383 while (_currentToken.type == TokenType.OPEN_PAREN) { | 4390 while (_currentToken.type == TokenType.OPEN_PAREN) { |
4384 if (functionName != null) { | 4391 if (functionName != null) { |
4385 expression = new MethodInvocation( | 4392 expression = new MethodInvocation( |
4386 expression, period, functionName, parseArgumentList()); | 4393 expression, period, functionName, null, parseArgumentList()); |
4387 period = null; | 4394 period = null; |
4388 functionName = null; | 4395 functionName = null; |
4389 } else if (expression == null) { | 4396 } else if (expression == null) { |
4390 // It should not be possible to get here. | 4397 // It should not be possible to get here. |
4391 expression = new MethodInvocation(expression, period, | 4398 expression = new MethodInvocation(expression, period, |
4392 _createSyntheticIdentifier(), parseArgumentList()); | 4399 _createSyntheticIdentifier(), null, parseArgumentList()); |
4393 } else { | 4400 } else { |
4394 expression = | 4401 expression = new FunctionExpressionInvocation( |
4395 new FunctionExpressionInvocation(expression, parseArgumentList()); | 4402 expression, null, parseArgumentList()); |
4396 } | 4403 } |
4397 } | 4404 } |
4398 } else if (functionName != null) { | 4405 } else if (functionName != null) { |
4399 expression = new PropertyAccess(expression, period, functionName); | 4406 expression = new PropertyAccess(expression, period, functionName); |
4400 period = null; | 4407 period = null; |
4401 } | 4408 } |
4402 assert(expression != null); | 4409 assert(expression != null); |
4403 bool progress = true; | 4410 bool progress = true; |
4404 while (progress) { | 4411 while (progress) { |
4405 progress = false; | 4412 progress = false; |
4406 Expression selector = _parseAssignableSelector(expression, true); | 4413 Expression selector = _parseAssignableSelector(expression, true); |
4407 if (!identical(selector, expression)) { | 4414 if (!identical(selector, expression)) { |
4408 expression = selector; | 4415 expression = selector; |
4409 progress = true; | 4416 progress = true; |
4410 while (_currentToken.type == TokenType.OPEN_PAREN) { | 4417 while (_currentToken.type == TokenType.OPEN_PAREN) { |
4411 if (expression is PropertyAccess) { | 4418 if (expression is PropertyAccess) { |
4412 PropertyAccess propertyAccess = expression as PropertyAccess; | 4419 PropertyAccess propertyAccess = expression as PropertyAccess; |
4413 expression = new MethodInvocation(propertyAccess.target, | 4420 expression = new MethodInvocation(propertyAccess.target, |
4414 propertyAccess.operator, propertyAccess.propertyName, | 4421 propertyAccess.operator, propertyAccess.propertyName, null, |
4415 parseArgumentList()); | 4422 parseArgumentList()); |
4416 } else { | 4423 } else { |
4417 expression = new FunctionExpressionInvocation( | 4424 expression = new FunctionExpressionInvocation( |
4418 expression, parseArgumentList()); | 4425 expression, null, parseArgumentList()); |
4419 } | 4426 } |
4420 } | 4427 } |
4421 } | 4428 } |
4422 } | 4429 } |
4423 if (_currentToken.type.isAssignmentOperator) { | 4430 if (_currentToken.type.isAssignmentOperator) { |
4424 Token operator = getAndAdvance(); | 4431 Token operator = getAndAdvance(); |
4425 _ensureAssignable(expression); | 4432 _ensureAssignable(expression); |
4426 expression = new AssignmentExpression( | 4433 expression = new AssignmentExpression( |
4427 expression, operator, parseExpressionWithoutCascade()); | 4434 expression, operator, parseExpressionWithoutCascade()); |
4428 } | 4435 } |
(...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5774 } else { | 5781 } else { |
5775 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); | 5782 body = new EmptyFunctionBody(_expect(TokenType.SEMICOLON)); |
5776 } | 5783 } |
5777 // if (!isStatement && matches(TokenType.SEMICOLON)) { | 5784 // if (!isStatement && matches(TokenType.SEMICOLON)) { |
5778 // // TODO(brianwilkerson) Improve this error message. | 5785 // // TODO(brianwilkerson) Improve this error message. |
5779 // reportError(ParserErrorCode.UNEXPECTED_TOKEN, currentToken.getLexeme
()); | 5786 // reportError(ParserErrorCode.UNEXPECTED_TOKEN, currentToken.getLexeme
()); |
5780 // advance(); | 5787 // advance(); |
5781 // } | 5788 // } |
5782 return new FunctionDeclaration(commentAndMetadata.comment, | 5789 return new FunctionDeclaration(commentAndMetadata.comment, |
5783 commentAndMetadata.metadata, externalKeyword, returnType, keyword, name, | 5790 commentAndMetadata.metadata, externalKeyword, returnType, keyword, name, |
5784 new FunctionExpression(parameters, body)); | 5791 new FunctionExpression(null, parameters, body)); |
5785 } | 5792 } |
5786 | 5793 |
5787 /** | 5794 /** |
5788 * Parse a function declaration statement. Return the function declaration | 5795 * Parse a function declaration statement. Return the function declaration |
5789 * statement that was parsed. | 5796 * statement that was parsed. |
5790 * | 5797 * |
5791 * functionDeclarationStatement ::= | 5798 * functionDeclarationStatement ::= |
5792 * functionSignature functionBody | 5799 * functionSignature functionBody |
5793 */ | 5800 */ |
5794 Statement _parseFunctionDeclarationStatement() { | 5801 Statement _parseFunctionDeclarationStatement() { |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5901 _advance(); | 5908 _advance(); |
5902 } | 5909 } |
5903 FunctionBody body = _parseFunctionBody( | 5910 FunctionBody body = _parseFunctionBody( |
5904 externalKeyword != null || staticKeyword == null, | 5911 externalKeyword != null || staticKeyword == null, |
5905 ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false); | 5912 ParserErrorCode.STATIC_GETTER_WITHOUT_BODY, false); |
5906 if (externalKeyword != null && body is! EmptyFunctionBody) { | 5913 if (externalKeyword != null && body is! EmptyFunctionBody) { |
5907 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY); | 5914 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_GETTER_WITH_BODY); |
5908 } | 5915 } |
5909 return new MethodDeclaration(commentAndMetadata.comment, | 5916 return new MethodDeclaration(commentAndMetadata.comment, |
5910 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, | 5917 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, |
5911 propertyKeyword, null, name, null, body); | 5918 propertyKeyword, null, name, null, null, body); |
5912 } | 5919 } |
5913 | 5920 |
5914 /** | 5921 /** |
5915 * Parse a list of identifiers. Return the list of identifiers that were | 5922 * Parse a list of identifiers. Return the list of identifiers that were |
5916 * parsed. | 5923 * parsed. |
5917 * | 5924 * |
5918 * identifierList ::= | 5925 * identifierList ::= |
5919 * identifier (',' identifier)* | 5926 * identifier (',' identifier)* |
5920 */ | 5927 */ |
5921 List<SimpleIdentifier> _parseIdentifierList() { | 5928 List<SimpleIdentifier> _parseIdentifierList() { |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6222 * [parameters] is the parameters to the method. Return the method declaration | 6229 * [parameters] is the parameters to the method. Return the method declaration |
6223 * that was parsed. | 6230 * that was parsed. |
6224 * | 6231 * |
6225 * functionDeclaration ::= | 6232 * functionDeclaration ::= |
6226 * ('external' 'static'?)? functionSignature functionBody | 6233 * ('external' 'static'?)? functionSignature functionBody |
6227 * | 'external'? functionSignature ';' | 6234 * | 'external'? functionSignature ';' |
6228 */ | 6235 */ |
6229 MethodDeclaration _parseMethodDeclarationAfterParameters( | 6236 MethodDeclaration _parseMethodDeclarationAfterParameters( |
6230 CommentAndMetadata commentAndMetadata, Token externalKeyword, | 6237 CommentAndMetadata commentAndMetadata, Token externalKeyword, |
6231 Token staticKeyword, TypeName returnType, SimpleIdentifier name, | 6238 Token staticKeyword, TypeName returnType, SimpleIdentifier name, |
6232 FormalParameterList parameters) { | 6239 TypeParameterList typeParameters, FormalParameterList parameters) { |
6233 FunctionBody body = _parseFunctionBody( | 6240 FunctionBody body = _parseFunctionBody( |
6234 externalKeyword != null || staticKeyword == null, | 6241 externalKeyword != null || staticKeyword == null, |
6235 ParserErrorCode.MISSING_FUNCTION_BODY, false); | 6242 ParserErrorCode.MISSING_FUNCTION_BODY, false); |
6236 if (externalKeyword != null) { | 6243 if (externalKeyword != null) { |
6237 if (body is! EmptyFunctionBody) { | 6244 if (body is! EmptyFunctionBody) { |
6238 _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body); | 6245 _reportErrorForNode(ParserErrorCode.EXTERNAL_METHOD_WITH_BODY, body); |
6239 } | 6246 } |
6240 } else if (staticKeyword != null) { | 6247 } else if (staticKeyword != null) { |
6241 if (body is EmptyFunctionBody && _parseFunctionBodies) { | 6248 if (body is EmptyFunctionBody && _parseFunctionBodies) { |
6242 _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body); | 6249 _reportErrorForNode(ParserErrorCode.ABSTRACT_STATIC_METHOD, body); |
6243 } | 6250 } |
6244 } | 6251 } |
6245 return new MethodDeclaration(commentAndMetadata.comment, | 6252 return new MethodDeclaration(commentAndMetadata.comment, |
6246 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, | 6253 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, |
6247 null, null, name, parameters, body); | 6254 null, null, name, typeParameters, parameters, body); |
6248 } | 6255 } |
6249 | 6256 |
6250 /** | 6257 /** |
6251 * Parse a method declaration. The [commentAndMetadata] is the documentation | 6258 * Parse a method declaration. The [commentAndMetadata] is the documentation |
6252 * comment and metadata to be associated with the declaration. The | 6259 * comment and metadata to be associated with the declaration. The |
6253 * [externalKeyword] is the 'external' token. The [staticKeyword] is the | 6260 * [externalKeyword] is the 'external' token. The [staticKeyword] is the |
6254 * static keyword, or `null` if the getter is not static. The [returnType] is | 6261 * static keyword, or `null` if the getter is not static. The [returnType] is |
6255 * the return type of the method. Return the method declaration that was | 6262 * the return type of the method. Return the method declaration that was |
6256 * parsed. | 6263 * parsed. |
6257 * | 6264 * |
(...skipping 12 matching lines...) Expand all Loading... |
6270 _reportErrorForToken( | 6277 _reportErrorForToken( |
6271 ParserErrorCode.MISSING_METHOD_PARAMETERS, _currentToken.previous); | 6278 ParserErrorCode.MISSING_METHOD_PARAMETERS, _currentToken.previous); |
6272 parameters = new FormalParameterList( | 6279 parameters = new FormalParameterList( |
6273 _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, | 6280 _createSyntheticToken(TokenType.OPEN_PAREN), null, null, null, |
6274 _createSyntheticToken(TokenType.CLOSE_PAREN)); | 6281 _createSyntheticToken(TokenType.CLOSE_PAREN)); |
6275 } else { | 6282 } else { |
6276 parameters = parseFormalParameterList(); | 6283 parameters = parseFormalParameterList(); |
6277 } | 6284 } |
6278 _validateFormalParameterList(parameters); | 6285 _validateFormalParameterList(parameters); |
6279 return _parseMethodDeclarationAfterParameters(commentAndMetadata, | 6286 return _parseMethodDeclarationAfterParameters(commentAndMetadata, |
6280 externalKeyword, staticKeyword, returnType, methodName, parameters); | 6287 externalKeyword, staticKeyword, returnType, methodName, null, |
| 6288 parameters); |
6281 } | 6289 } |
6282 | 6290 |
6283 /** | 6291 /** |
6284 * Parse the modifiers preceding a declaration. This method allows the | 6292 * Parse the modifiers preceding a declaration. This method allows the |
6285 * modifiers to appear in any order but does generate errors for duplicated | 6293 * modifiers to appear in any order but does generate errors for duplicated |
6286 * modifiers. Checks for other problems, such as having the modifiers appear | 6294 * modifiers. Checks for other problems, such as having the modifiers appear |
6287 * in the wrong order or specifying both 'const' and 'final', are reported in | 6295 * in the wrong order or specifying both 'const' and 'final', are reported in |
6288 * one of the methods whose name is prefixed with `validateModifiersFor`. | 6296 * one of the methods whose name is prefixed with `validateModifiersFor`. |
6289 * Return the modifiers that were parsed. | 6297 * Return the modifiers that were parsed. |
6290 * | 6298 * |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6626 } | 6634 } |
6627 FormalParameterList parameters = parseFormalParameterList(); | 6635 FormalParameterList parameters = parseFormalParameterList(); |
6628 _validateFormalParameterList(parameters); | 6636 _validateFormalParameterList(parameters); |
6629 FunctionBody body = | 6637 FunctionBody body = |
6630 _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false); | 6638 _parseFunctionBody(true, ParserErrorCode.MISSING_FUNCTION_BODY, false); |
6631 if (externalKeyword != null && body is! EmptyFunctionBody) { | 6639 if (externalKeyword != null && body is! EmptyFunctionBody) { |
6632 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY); | 6640 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_OPERATOR_WITH_BODY); |
6633 } | 6641 } |
6634 return new MethodDeclaration(commentAndMetadata.comment, | 6642 return new MethodDeclaration(commentAndMetadata.comment, |
6635 commentAndMetadata.metadata, externalKeyword, null, returnType, null, | 6643 commentAndMetadata.metadata, externalKeyword, null, returnType, null, |
6636 operatorKeyword, name, parameters, body); | 6644 operatorKeyword, name, null, parameters, body); |
6637 } | 6645 } |
6638 | 6646 |
6639 /** | 6647 /** |
6640 * Parse a return type if one is given, otherwise return `null` without | 6648 * Parse a return type if one is given, otherwise return `null` without |
6641 * advancing. Return the return type that was parsed. | 6649 * advancing. Return the return type that was parsed. |
6642 */ | 6650 */ |
6643 TypeName _parseOptionalReturnType() { | 6651 TypeName _parseOptionalReturnType() { |
6644 if (_matchesKeyword(Keyword.VOID)) { | 6652 if (_matchesKeyword(Keyword.VOID)) { |
6645 return parseReturnType(); | 6653 return parseReturnType(); |
6646 } else if (_matchesIdentifier() && | 6654 } else if (_matchesIdentifier() && |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6704 if (_matches(TokenType.OPEN_SQUARE_BRACKET) || | 6712 if (_matches(TokenType.OPEN_SQUARE_BRACKET) || |
6705 _matches(TokenType.PERIOD) || | 6713 _matches(TokenType.PERIOD) || |
6706 _matches(TokenType.QUESTION_PERIOD) || | 6714 _matches(TokenType.QUESTION_PERIOD) || |
6707 _matches(TokenType.OPEN_PAREN)) { | 6715 _matches(TokenType.OPEN_PAREN)) { |
6708 do { | 6716 do { |
6709 if (_matches(TokenType.OPEN_PAREN)) { | 6717 if (_matches(TokenType.OPEN_PAREN)) { |
6710 ArgumentList argumentList = parseArgumentList(); | 6718 ArgumentList argumentList = parseArgumentList(); |
6711 if (operand is PropertyAccess) { | 6719 if (operand is PropertyAccess) { |
6712 PropertyAccess access = operand as PropertyAccess; | 6720 PropertyAccess access = operand as PropertyAccess; |
6713 operand = new MethodInvocation(access.target, access.operator, | 6721 operand = new MethodInvocation(access.target, access.operator, |
6714 access.propertyName, argumentList); | 6722 access.propertyName, null, argumentList); |
6715 } else { | 6723 } else { |
6716 operand = new FunctionExpressionInvocation(operand, argumentList); | 6724 operand = |
| 6725 new FunctionExpressionInvocation(operand, null, argumentList); |
6717 } | 6726 } |
6718 } else { | 6727 } else { |
6719 operand = _parseAssignableSelector(operand, true); | 6728 operand = _parseAssignableSelector(operand, true); |
6720 } | 6729 } |
6721 } while (_matches(TokenType.OPEN_SQUARE_BRACKET) || | 6730 } while (_matches(TokenType.OPEN_SQUARE_BRACKET) || |
6722 _matches(TokenType.PERIOD) || | 6731 _matches(TokenType.PERIOD) || |
6723 _matches(TokenType.QUESTION_PERIOD) || | 6732 _matches(TokenType.QUESTION_PERIOD) || |
6724 _matches(TokenType.OPEN_PAREN)); | 6733 _matches(TokenType.OPEN_PAREN)); |
6725 return operand; | 6734 return operand; |
6726 } | 6735 } |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6964 FormalParameterList parameters = parseFormalParameterList(); | 6973 FormalParameterList parameters = parseFormalParameterList(); |
6965 _validateFormalParameterList(parameters); | 6974 _validateFormalParameterList(parameters); |
6966 FunctionBody body = _parseFunctionBody( | 6975 FunctionBody body = _parseFunctionBody( |
6967 externalKeyword != null || staticKeyword == null, | 6976 externalKeyword != null || staticKeyword == null, |
6968 ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false); | 6977 ParserErrorCode.STATIC_SETTER_WITHOUT_BODY, false); |
6969 if (externalKeyword != null && body is! EmptyFunctionBody) { | 6978 if (externalKeyword != null && body is! EmptyFunctionBody) { |
6970 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY); | 6979 _reportErrorForCurrentToken(ParserErrorCode.EXTERNAL_SETTER_WITH_BODY); |
6971 } | 6980 } |
6972 return new MethodDeclaration(commentAndMetadata.comment, | 6981 return new MethodDeclaration(commentAndMetadata.comment, |
6973 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, | 6982 commentAndMetadata.metadata, externalKeyword, staticKeyword, returnType, |
6974 propertyKeyword, null, name, parameters, body); | 6983 propertyKeyword, null, name, null, parameters, body); |
6975 } | 6984 } |
6976 | 6985 |
6977 /** | 6986 /** |
6978 * Parse a shift expression. Return the shift expression that was parsed. | 6987 * Parse a shift expression. Return the shift expression that was parsed. |
6979 * | 6988 * |
6980 * shiftExpression ::= | 6989 * shiftExpression ::= |
6981 * additiveExpression (shiftOperator additiveExpression)* | 6990 * additiveExpression (shiftOperator additiveExpression)* |
6982 * | 'super' (shiftOperator additiveExpression)+ | 6991 * | 'super' (shiftOperator additiveExpression)+ |
6983 */ | 6992 */ |
6984 Expression _parseShiftExpression() { | 6993 Expression _parseShiftExpression() { |
(...skipping 3602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10587 } | 10596 } |
10588 | 10597 |
10589 /** | 10598 /** |
10590 * Copy resolution data from the [fromNode] to the [toNode]. | 10599 * Copy resolution data from the [fromNode] to the [toNode]. |
10591 */ | 10600 */ |
10592 static void copyResolutionData(AstNode fromNode, AstNode toNode) { | 10601 static void copyResolutionData(AstNode fromNode, AstNode toNode) { |
10593 ResolutionCopier copier = new ResolutionCopier(); | 10602 ResolutionCopier copier = new ResolutionCopier(); |
10594 copier._isEqualNodes(fromNode, toNode); | 10603 copier._isEqualNodes(fromNode, toNode); |
10595 } | 10604 } |
10596 } | 10605 } |
OLD | NEW |