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

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

Issue 2444453002: Improve error recovery (issue 27646) (Closed)
Patch Set: Created 4 years, 2 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 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 } else { 773 } else {
774 bool isQuestionPeriod = type == TokenType.QUESTION_PERIOD; 774 bool isQuestionPeriod = type == TokenType.QUESTION_PERIOD;
775 if (type == TokenType.PERIOD || isQuestionPeriod) { 775 if (type == TokenType.PERIOD || isQuestionPeriod) {
776 if (isQuestionPeriod && !allowConditional) { 776 if (isQuestionPeriod && !allowConditional) {
777 _reportErrorForCurrentToken( 777 _reportErrorForCurrentToken(
778 ParserErrorCode.INVALID_OPERATOR_FOR_SUPER, 778 ParserErrorCode.INVALID_OPERATOR_FOR_SUPER,
779 [_currentToken.lexeme]); 779 [_currentToken.lexeme]);
780 } 780 }
781 Token operator = getAndAdvance(); 781 Token operator = getAndAdvance();
782 return new PropertyAccess(prefix, operator, parseSimpleIdentifier()); 782 return new PropertyAccess(prefix, operator, parseSimpleIdentifier());
783 } else if (type == TokenType.INDEX) {
784 _splitIndex();
785 Token leftBracket = getAndAdvance();
786 Expression index = parseSimpleIdentifier();
787 Token rightBracket = getAndAdvance();
788 return new IndexExpression.forTarget(
789 prefix, leftBracket, index, rightBracket);
783 } else { 790 } else {
784 if (!optional) { 791 if (!optional) {
785 // Report the missing selector. 792 // Report the missing selector.
786 _reportErrorForCurrentToken( 793 _reportErrorForCurrentToken(
787 ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR); 794 ParserErrorCode.MISSING_ASSIGNABLE_SELECTOR);
788 } 795 }
789 return prefix; 796 return prefix;
790 } 797 }
791 } 798 }
792 } 799 }
(...skipping 2710 matching lines...) Expand 10 before | Expand all | Expand 10 after
3503 * no type arguments. Return the list literal that was parsed. 3510 * no type arguments. Return the list literal that was parsed.
3504 * 3511 *
3505 * This method assumes that the current token matches either 3512 * This method assumes that the current token matches either
3506 * `TokenType.OPEN_SQUARE_BRACKET` or `TokenType.INDEX`. 3513 * `TokenType.OPEN_SQUARE_BRACKET` or `TokenType.INDEX`.
3507 * 3514 *
3508 * listLiteral ::= 3515 * listLiteral ::=
3509 * 'const'? typeArguments? '[' (expressionList ','?)? ']' 3516 * 'const'? typeArguments? '[' (expressionList ','?)? ']'
3510 */ 3517 */
3511 ListLiteral parseListLiteral(Token modifier, TypeArgumentList typeArguments) { 3518 ListLiteral parseListLiteral(Token modifier, TypeArgumentList typeArguments) {
3512 if (_matches(TokenType.INDEX)) { 3519 if (_matches(TokenType.INDEX)) {
3513 // Split the token into two separate tokens. 3520 _splitIndex();
3514 BeginToken leftBracket = _createToken(
3515 _currentToken, TokenType.OPEN_SQUARE_BRACKET,
3516 isBegin: true);
3517 Token rightBracket =
3518 new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1);
3519 leftBracket.endToken = rightBracket;
3520 rightBracket.setNext(_currentToken.next);
3521 leftBracket.setNext(rightBracket);
3522 _currentToken.previous.setNext(leftBracket);
3523 _currentToken = _currentToken.next;
3524 return new ListLiteral( 3521 return new ListLiteral(
3525 modifier, typeArguments, leftBracket, null, rightBracket); 3522 modifier, typeArguments, getAndAdvance(), null, getAndAdvance());
3526 } 3523 }
3527 Token leftBracket = getAndAdvance(); 3524 Token leftBracket = getAndAdvance();
3528 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) { 3525 if (_matches(TokenType.CLOSE_SQUARE_BRACKET)) {
3529 return new ListLiteral( 3526 return new ListLiteral(
3530 modifier, typeArguments, leftBracket, null, getAndAdvance()); 3527 modifier, typeArguments, leftBracket, null, getAndAdvance());
3531 } 3528 }
3532 bool wasInInitializer = _inInitializer; 3529 bool wasInInitializer = _inInitializer;
3533 _inInitializer = false; 3530 _inInitializer = false;
3534 try { 3531 try {
3535 List<Expression> elements = <Expression>[parseExpression2()]; 3532 List<Expression> elements = <Expression>[parseExpression2()];
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
4112 * assignableSelector 4109 * assignableSelector
4113 * | argumentList 4110 * | argumentList
4114 */ 4111 */
4115 Expression parsePostfixExpression() { 4112 Expression parsePostfixExpression() {
4116 Expression operand = parseAssignableExpression(true); 4113 Expression operand = parseAssignableExpression(true);
4117 TokenType type = _currentToken.type; 4114 TokenType type = _currentToken.type;
4118 if (type == TokenType.OPEN_SQUARE_BRACKET || 4115 if (type == TokenType.OPEN_SQUARE_BRACKET ||
4119 type == TokenType.PERIOD || 4116 type == TokenType.PERIOD ||
4120 type == TokenType.QUESTION_PERIOD || 4117 type == TokenType.QUESTION_PERIOD ||
4121 type == TokenType.OPEN_PAREN || 4118 type == TokenType.OPEN_PAREN ||
4122 (parseGenericMethods && type == TokenType.LT)) { 4119 (parseGenericMethods && type == TokenType.LT) ||
4120 type == TokenType.INDEX) {
4123 do { 4121 do {
4124 if (_isLikelyArgumentList()) { 4122 if (_isLikelyArgumentList()) {
4125 TypeArgumentList typeArguments = _parseOptionalTypeArguments(); 4123 TypeArgumentList typeArguments = _parseOptionalTypeArguments();
4126 ArgumentList argumentList = parseArgumentList(); 4124 ArgumentList argumentList = parseArgumentList();
4127 Expression currentOperand = operand; 4125 Expression currentOperand = operand;
4128 if (currentOperand is PropertyAccess) { 4126 if (currentOperand is PropertyAccess) {
4129 operand = new MethodInvocation( 4127 operand = new MethodInvocation(
4130 currentOperand.target, 4128 currentOperand.target,
4131 currentOperand.operator, 4129 currentOperand.operator,
4132 currentOperand.propertyName, 4130 currentOperand.propertyName,
4133 typeArguments, 4131 typeArguments,
4134 argumentList); 4132 argumentList);
4135 } else { 4133 } else {
4136 operand = new FunctionExpressionInvocation( 4134 operand = new FunctionExpressionInvocation(
4137 operand, typeArguments, argumentList); 4135 operand, typeArguments, argumentList);
4138 } 4136 }
4139 } else { 4137 } else {
4140 operand = parseAssignableSelector(operand, true); 4138 operand = parseAssignableSelector(operand, true);
4141 } 4139 }
4142 type = _currentToken.type; 4140 type = _currentToken.type;
4143 } while (type == TokenType.OPEN_SQUARE_BRACKET || 4141 } while (type == TokenType.OPEN_SQUARE_BRACKET ||
4144 type == TokenType.PERIOD || 4142 type == TokenType.PERIOD ||
4145 type == TokenType.QUESTION_PERIOD || 4143 type == TokenType.QUESTION_PERIOD ||
4146 type == TokenType.OPEN_PAREN); 4144 type == TokenType.OPEN_PAREN ||
4145 type == TokenType.INDEX);
4147 return operand; 4146 return operand;
4148 } 4147 }
4149 if (!_currentToken.type.isIncrementOperator) { 4148 if (!_currentToken.type.isIncrementOperator) {
4150 return operand; 4149 return operand;
4151 } 4150 }
4152 _ensureAssignable(operand); 4151 _ensureAssignable(operand);
4153 Token operator = getAndAdvance(); 4152 Token operator = getAndAdvance();
4154 return new PostfixExpression(operand, operator); 4153 return new PostfixExpression(operand, operator);
4155 } 4154 }
4156 4155
(...skipping 3421 matching lines...) Expand 10 before | Expand all | Expand 10 after
7578 return fakeEquals; 7577 return fakeEquals;
7579 } 7578 }
7580 depth -= 2; 7579 depth -= 2;
7581 } 7580 }
7582 next = next.next; 7581 next = next.next;
7583 } 7582 }
7584 return next; 7583 return next;
7585 } 7584 }
7586 7585
7587 /** 7586 /**
7587 * Assuming that the current token is an index token ('[]'), split it into two
7588 * tokens ('[' and ']'), leaving the left bracket as the current token.
7589 */
7590 void _splitIndex() {
7591 // Split the token into two separate tokens.
7592 BeginToken leftBracket = _createToken(
7593 _currentToken, TokenType.OPEN_SQUARE_BRACKET,
7594 isBegin: true);
7595 Token rightBracket =
7596 new Token(TokenType.CLOSE_SQUARE_BRACKET, _currentToken.offset + 1);
7597 leftBracket.endToken = rightBracket;
7598 rightBracket.setNext(_currentToken.next);
7599 leftBracket.setNext(rightBracket);
7600 _currentToken.previous.setNext(leftBracket);
7601 _currentToken = leftBracket;
7602 }
7603
7604 /**
7588 * Return `true` if the given [token] has the given [type]. 7605 * Return `true` if the given [token] has the given [type].
7589 */ 7606 */
7590 bool _tokenMatches(Token token, TokenType type) => token.type == type; 7607 bool _tokenMatches(Token token, TokenType type) => token.type == type;
7591 7608
7592 /** 7609 /**
7593 * Return `true` if the given [token] is a valid identifier. Valid identifiers 7610 * Return `true` if the given [token] is a valid identifier. Valid identifiers
7594 * include built-in identifiers (pseudo-keywords). 7611 * include built-in identifiers (pseudo-keywords).
7595 */ 7612 */
7596 bool _tokenMatchesIdentifier(Token token) => 7613 bool _tokenMatchesIdentifier(Token token) =>
7597 _tokenMatches(token, TokenType.IDENTIFIER) || 7614 _tokenMatches(token, TokenType.IDENTIFIER) ||
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
8100 */ 8117 */
8101 Parser_SyntheticKeywordToken(Keyword keyword, int offset) 8118 Parser_SyntheticKeywordToken(Keyword keyword, int offset)
8102 : super(keyword, offset); 8119 : super(keyword, offset);
8103 8120
8104 @override 8121 @override
8105 int get length => 0; 8122 int get length => 0;
8106 8123
8107 @override 8124 @override
8108 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset); 8125 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
8109 } 8126 }
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