Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1355)

Side by Side Diff: pkg/analyzer/lib/src/generated/parser.dart

Issue 2282233002: Add support for parsing, but not capturing, assers in constructor initializer lists (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/parser_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 2844 matching lines...) Expand 10 before | Expand all | Expand 10 after
2855 partDirectiveFound = true; 2855 partDirectiveFound = true;
2856 return _parsePartDirective(commentAndMetadata); 2856 return _parsePartDirective(commentAndMetadata);
2857 } 2857 }
2858 } else { 2858 } else {
2859 // Internal error: this method should not have been invoked if the 2859 // Internal error: this method should not have been invoked if the
2860 // current token was something other than one of the above. 2860 // current token was something other than one of the above.
2861 throw new IllegalStateException( 2861 throw new IllegalStateException(
2862 "parseDirective invoked in an invalid state (currentToken = $_cu rrentToken)"); 2862 "parseDirective invoked in an invalid state (currentToken = $_cu rrentToken)");
2863 } 2863 }
2864 } 2864 }
2865
2865 Directive directive = parseDirective(); 2866 Directive directive = parseDirective();
2866 if (declarations.length > 0 && !directiveFoundAfterDeclaration) { 2867 if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
2867 _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, 2868 _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
2868 directive.beginToken); 2869 directive.beginToken);
2869 directiveFoundAfterDeclaration = true; 2870 directiveFoundAfterDeclaration = true;
2870 } 2871 }
2871 directives.add(directive); 2872 directives.add(directive);
2872 } else if (type == TokenType.SEMICOLON) { 2873 } else if (type == TokenType.SEMICOLON) {
2873 // TODO(brianwilkerson) Consider moving this error detection into 2874 // TODO(brianwilkerson) Consider moving this error detection into
2874 // _parseCompilationUnitMember (in the places where EXPECTED_EXECUTABLE 2875 // _parseCompilationUnitMember (in the places where EXPECTED_EXECUTABLE
(...skipping 1464 matching lines...) Expand 10 before | Expand all | Expand 10 after
4339 } 4340 }
4340 _reportErrorForCurrentToken( 4341 _reportErrorForCurrentToken(
4341 ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_PAREN.lexeme]); 4342 ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_PAREN.lexeme]);
4342 // Recovery: Look to see whether there is a close paren that isn't matched 4343 // Recovery: Look to see whether there is a close paren that isn't matched
4343 // to an open paren and if so parse the list of arguments as normal. 4344 // to an open paren and if so parse the list of arguments as normal.
4344 return new ArgumentList(_createSyntheticToken(TokenType.OPEN_PAREN), null, 4345 return new ArgumentList(_createSyntheticToken(TokenType.OPEN_PAREN), null,
4345 _createSyntheticToken(TokenType.CLOSE_PAREN)); 4346 _createSyntheticToken(TokenType.CLOSE_PAREN));
4346 } 4347 }
4347 4348
4348 /** 4349 /**
4350 * Parse an assert within a constructor's initializer list. Return the assert.
4351 *
4352 * This method assumes that the current token matches `Keyword.ASSERT`.
4353 *
4354 * assertInitializer ::=
4355 * 'assert' '(' expression [',' expression] ')'
4356 */
4357 void _parseAssertInitializer() {
4358 // return AssertInitializer
scheglov 2016/08/27 00:06:45 I don't quite understand what this comment means.
Brian Wilkerson 2016/08/27 00:32:44 Done It was a reminder to "Capture the syntax in
4359 Token keyword = getAndAdvance();
4360 Token leftParen = _expect(TokenType.OPEN_PAREN);
4361 Expression expression = parseExpression2();
4362 Token comma;
4363 Expression message;
4364 if (_matches(TokenType.COMMA)) {
4365 comma = getAndAdvance();
4366 message = parseExpression2();
4367 }
4368 Token rightParen = _expect(TokenType.CLOSE_PAREN);
4369 // return new AssertInitializer(
4370 // keyword, leftParen, expression, comma, message, rightParen);
4371 }
4372
4373 /**
4349 * Parse an assert statement. Return the assert statement. 4374 * Parse an assert statement. Return the assert statement.
4350 * 4375 *
4351 * This method assumes that the current token matches `Keyword.ASSERT`. 4376 * This method assumes that the current token matches `Keyword.ASSERT`.
4352 * 4377 *
4353 * assertStatement ::= 4378 * assertStatement ::=
4354 * 'assert' '(' expression [',' expression] ')' ';' 4379 * 'assert' '(' expression [',' expression] ')' ';'
4355 */ 4380 */
4356 AssertStatement _parseAssertStatement() { 4381 AssertStatement _parseAssertStatement() {
4357 Token keyword = getAndAdvance(); 4382 Token keyword = getAndAdvance();
4358 Token leftParen = _expect(TokenType.OPEN_PAREN); 4383 Token leftParen = _expect(TokenType.OPEN_PAREN);
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
5495 bodyAllowed = false; 5520 bodyAllowed = false;
5496 initializers.add(_parseRedirectingConstructorInvocation(true)); 5521 initializers.add(_parseRedirectingConstructorInvocation(true));
5497 } else { 5522 } else {
5498 initializers.add(_parseConstructorFieldInitializer(true)); 5523 initializers.add(_parseConstructorFieldInitializer(true));
5499 } 5524 }
5500 } else if (keyword == Keyword.SUPER) { 5525 } else if (keyword == Keyword.SUPER) {
5501 initializers.add(_parseSuperConstructorInvocation()); 5526 initializers.add(_parseSuperConstructorInvocation());
5502 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) || 5527 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) ||
5503 _matches(TokenType.FUNCTION)) { 5528 _matches(TokenType.FUNCTION)) {
5504 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER); 5529 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER);
5530 } else if (_matchesKeyword(Keyword.ASSERT)) {
5531 _parseAssertInitializer();
5505 } else { 5532 } else {
5506 initializers.add(_parseConstructorFieldInitializer(false)); 5533 initializers.add(_parseConstructorFieldInitializer(false));
5507 } 5534 }
5508 } while (_optional(TokenType.COMMA)); 5535 } while (_optional(TokenType.COMMA));
5509 if (factoryKeyword != null) { 5536 if (factoryKeyword != null) {
5510 _reportErrorForToken( 5537 _reportErrorForToken(
5511 ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword); 5538 ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword);
5512 } 5539 }
5513 } 5540 }
5514 ConstructorName redirectedConstructor = null; 5541 ConstructorName redirectedConstructor = null;
(...skipping 2760 matching lines...) Expand 10 before | Expand all | Expand 10 after
8275 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT); 8302 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT);
8276 bool atEndOrNextMember() { 8303 bool atEndOrNextMember() {
8277 TokenType type = _currentToken.type; 8304 TokenType type = _currentToken.type;
8278 if (type == TokenType.EOF || 8305 if (type == TokenType.EOF ||
8279 type == TokenType.CLOSE_CURLY_BRACKET) { 8306 type == TokenType.CLOSE_CURLY_BRACKET) {
8280 return true; 8307 return true;
8281 } 8308 }
8282 Keyword keyword = _currentToken.keyword; 8309 Keyword keyword = _currentToken.keyword;
8283 return keyword == Keyword.CASE || keyword == Keyword.DEFAULT; 8310 return keyword == Keyword.CASE || keyword == Keyword.DEFAULT;
8284 } 8311 }
8312
8285 while (!atEndOrNextMember()) { 8313 while (!atEndOrNextMember()) {
8286 _advance(); 8314 _advance();
8287 } 8315 }
8288 } 8316 }
8289 type = _currentToken.type; 8317 type = _currentToken.type;
8290 } 8318 }
8291 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); 8319 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
8292 return new SwitchStatement(keyword, leftParenthesis, expression, 8320 return new SwitchStatement(keyword, leftParenthesis, expression,
8293 rightParenthesis, leftBracket, members, rightBracket); 8321 rightParenthesis, leftBracket, members, rightBracket);
8294 } finally { 8322 } finally {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
8618 bool isValidInUri(Token token) { 8646 bool isValidInUri(Token token) {
8619 TokenType type = token.type; 8647 TokenType type = token.type;
8620 return type == TokenType.COLON || 8648 return type == TokenType.COLON ||
8621 type == TokenType.SLASH || 8649 type == TokenType.SLASH ||
8622 type == TokenType.PERIOD || 8650 type == TokenType.PERIOD ||
8623 type == TokenType.PERIOD_PERIOD || 8651 type == TokenType.PERIOD_PERIOD ||
8624 type == TokenType.PERIOD_PERIOD_PERIOD || 8652 type == TokenType.PERIOD_PERIOD_PERIOD ||
8625 type == TokenType.INT || 8653 type == TokenType.INT ||
8626 type == TokenType.DOUBLE; 8654 type == TokenType.DOUBLE;
8627 } 8655 }
8656
8628 while ((_tokenMatchesIdentifier(token) && !isKeywordAfterUri(token)) || 8657 while ((_tokenMatchesIdentifier(token) && !isKeywordAfterUri(token)) ||
8629 isValidInUri(token)) { 8658 isValidInUri(token)) {
8630 token = token.next; 8659 token = token.next;
8631 } 8660 }
8632 if (_tokenMatches(token, TokenType.SEMICOLON) || 8661 if (_tokenMatches(token, TokenType.SEMICOLON) ||
8633 isKeywordAfterUri(token)) { 8662 isKeywordAfterUri(token)) {
8634 Token endToken = token.previous; 8663 Token endToken = token.previous;
8635 token = _currentToken; 8664 token = _currentToken;
8636 int endOffset = token.end; 8665 int endOffset = token.end;
8637 StringBuffer buffer = new StringBuffer(); 8666 StringBuffer buffer = new StringBuffer();
(...skipping 1841 matching lines...) Expand 10 before | Expand all | Expand 10 after
10479 */ 10508 */
10480 const ParserErrorCode(String name, String message, [String correction]) 10509 const ParserErrorCode(String name, String message, [String correction])
10481 : super(name, message, correction); 10510 : super(name, message, correction);
10482 10511
10483 @override 10512 @override
10484 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; 10513 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
10485 10514
10486 @override 10515 @override
10487 ErrorType get type => ErrorType.SYNTACTIC_ERROR; 10516 ErrorType get type => ErrorType.SYNTACTIC_ERROR;
10488 } 10517 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/parser_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698