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

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: add flag 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 | « pkg/analyzer/lib/src/generated/engine.dart ('k') | pkg/analyzer/lib/src/task/dart.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 2117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2128 * during the parse. 2128 * during the parse.
2129 */ 2129 */
2130 final AnalysisErrorListener _errorListener; 2130 final AnalysisErrorListener _errorListener;
2131 2131
2132 /** 2132 /**
2133 * An [_errorListener] lock, if more than `0`, then errors are not reported. 2133 * An [_errorListener] lock, if more than `0`, then errors are not reported.
2134 */ 2134 */
2135 int _errorListenerLock = 0; 2135 int _errorListenerLock = 0;
2136 2136
2137 /** 2137 /**
2138 * A flag indicating whether the parser is to parse asserts in the initializer
2139 * list of a constructor.
2140 */
2141 bool _enableAssertInitializer = false;
2142
2143 /**
2138 * A flag indicating whether the parser is to parse the async support. 2144 * A flag indicating whether the parser is to parse the async support.
2139 */ 2145 */
2140 bool _parseAsync = true; 2146 bool _parseAsync = true;
2141 2147
2142 /** 2148 /**
2143 * A flag indicating whether parser is to parse function bodies. 2149 * A flag indicating whether parser is to parse function bodies.
2144 */ 2150 */
2145 bool _parseFunctionBodies = true; 2151 bool _parseFunctionBodies = true;
2146 2152
2147 /** 2153 /**
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2195 Parser(this._source, this._errorListener); 2201 Parser(this._source, this._errorListener);
2196 2202
2197 /** 2203 /**
2198 * Set the token with which the parse is to begin to the given [token]. 2204 * Set the token with which the parse is to begin to the given [token].
2199 */ 2205 */
2200 void set currentToken(Token token) { 2206 void set currentToken(Token token) {
2201 this._currentToken = token; 2207 this._currentToken = token;
2202 } 2208 }
2203 2209
2204 /** 2210 /**
2211 * Return `true` if the parser is to parse asserts in the initializer list of
2212 * a constructor.
2213 */
2214 bool get enableAssertInitializer => _enableAssertInitializer;
2215
2216 /**
2217 * Set whether the parser is to parse asserts in the initializer list of a
2218 * constructor to match the given [enable] flag.
2219 */
2220 void set enableAssertInitializer(bool enable) {
2221 _enableAssertInitializer = enable;
2222 }
2223
2224 /**
2205 * Return `true` if the current token is the first token of a return type that 2225 * Return `true` if the current token is the first token of a return type that
2206 * is followed by an identifier, possibly followed by a list of type 2226 * is followed by an identifier, possibly followed by a list of type
2207 * parameters, followed by a left-parenthesis. This is used by 2227 * parameters, followed by a left-parenthesis. This is used by
2208 * [_parseTypeAlias] to determine whether or not to parse a return type. 2228 * [_parseTypeAlias] to determine whether or not to parse a return type.
2209 */ 2229 */
2210 @deprecated 2230 @deprecated
2211 bool get hasReturnTypeInTypeAlias { 2231 bool get hasReturnTypeInTypeAlias {
2212 Token next = _skipReturnType(_currentToken); 2232 Token next = _skipReturnType(_currentToken);
2213 if (next == null) { 2233 if (next == null) {
2214 return false; 2234 return false;
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
2855 partDirectiveFound = true; 2875 partDirectiveFound = true;
2856 return _parsePartDirective(commentAndMetadata); 2876 return _parsePartDirective(commentAndMetadata);
2857 } 2877 }
2858 } else { 2878 } else {
2859 // Internal error: this method should not have been invoked if the 2879 // Internal error: this method should not have been invoked if the
2860 // current token was something other than one of the above. 2880 // current token was something other than one of the above.
2861 throw new IllegalStateException( 2881 throw new IllegalStateException(
2862 "parseDirective invoked in an invalid state (currentToken = $_cu rrentToken)"); 2882 "parseDirective invoked in an invalid state (currentToken = $_cu rrentToken)");
2863 } 2883 }
2864 } 2884 }
2885
2865 Directive directive = parseDirective(); 2886 Directive directive = parseDirective();
2866 if (declarations.length > 0 && !directiveFoundAfterDeclaration) { 2887 if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
2867 _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION, 2888 _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
2868 directive.beginToken); 2889 directive.beginToken);
2869 directiveFoundAfterDeclaration = true; 2890 directiveFoundAfterDeclaration = true;
2870 } 2891 }
2871 directives.add(directive); 2892 directives.add(directive);
2872 } else if (type == TokenType.SEMICOLON) { 2893 } else if (type == TokenType.SEMICOLON) {
2873 // TODO(brianwilkerson) Consider moving this error detection into 2894 // TODO(brianwilkerson) Consider moving this error detection into
2874 // _parseCompilationUnitMember (in the places where EXPECTED_EXECUTABLE 2895 // _parseCompilationUnitMember (in the places where EXPECTED_EXECUTABLE
(...skipping 1464 matching lines...) Expand 10 before | Expand all | Expand 10 after
4339 } 4360 }
4340 _reportErrorForCurrentToken( 4361 _reportErrorForCurrentToken(
4341 ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_PAREN.lexeme]); 4362 ParserErrorCode.EXPECTED_TOKEN, [TokenType.OPEN_PAREN.lexeme]);
4342 // Recovery: Look to see whether there is a close paren that isn't matched 4363 // 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. 4364 // to an open paren and if so parse the list of arguments as normal.
4344 return new ArgumentList(_createSyntheticToken(TokenType.OPEN_PAREN), null, 4365 return new ArgumentList(_createSyntheticToken(TokenType.OPEN_PAREN), null,
4345 _createSyntheticToken(TokenType.CLOSE_PAREN)); 4366 _createSyntheticToken(TokenType.CLOSE_PAREN));
4346 } 4367 }
4347 4368
4348 /** 4369 /**
4370 * Parse an assert within a constructor's initializer list. Return the assert.
4371 *
4372 * This method assumes that the current token matches `Keyword.ASSERT`.
4373 *
4374 * assertInitializer ::=
4375 * 'assert' '(' expression [',' expression] ')'
4376 */
4377 void _parseAssertInitializer() {
4378 // TODO(brianwilkerson) Capture the syntax in the AST using a new class,
4379 // such as AssertInitializer
4380 Token keyword = getAndAdvance();
4381 Token leftParen = _expect(TokenType.OPEN_PAREN);
4382 Expression expression = parseExpression2();
4383 Token comma;
4384 Expression message;
4385 if (_matches(TokenType.COMMA)) {
4386 comma = getAndAdvance();
4387 message = parseExpression2();
4388 }
4389 Token rightParen = _expect(TokenType.CLOSE_PAREN);
4390 // return new AssertInitializer(
4391 // keyword, leftParen, expression, comma, message, rightParen);
4392 }
4393
4394 /**
4349 * Parse an assert statement. Return the assert statement. 4395 * Parse an assert statement. Return the assert statement.
4350 * 4396 *
4351 * This method assumes that the current token matches `Keyword.ASSERT`. 4397 * This method assumes that the current token matches `Keyword.ASSERT`.
4352 * 4398 *
4353 * assertStatement ::= 4399 * assertStatement ::=
4354 * 'assert' '(' expression [',' expression] ')' ';' 4400 * 'assert' '(' expression [',' expression] ')' ';'
4355 */ 4401 */
4356 AssertStatement _parseAssertStatement() { 4402 AssertStatement _parseAssertStatement() {
4357 Token keyword = getAndAdvance(); 4403 Token keyword = getAndAdvance();
4358 Token leftParen = _expect(TokenType.OPEN_PAREN); 4404 Token leftParen = _expect(TokenType.OPEN_PAREN);
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
5495 bodyAllowed = false; 5541 bodyAllowed = false;
5496 initializers.add(_parseRedirectingConstructorInvocation(true)); 5542 initializers.add(_parseRedirectingConstructorInvocation(true));
5497 } else { 5543 } else {
5498 initializers.add(_parseConstructorFieldInitializer(true)); 5544 initializers.add(_parseConstructorFieldInitializer(true));
5499 } 5545 }
5500 } else if (keyword == Keyword.SUPER) { 5546 } else if (keyword == Keyword.SUPER) {
5501 initializers.add(_parseSuperConstructorInvocation()); 5547 initializers.add(_parseSuperConstructorInvocation());
5502 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) || 5548 } else if (_matches(TokenType.OPEN_CURLY_BRACKET) ||
5503 _matches(TokenType.FUNCTION)) { 5549 _matches(TokenType.FUNCTION)) {
5504 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER); 5550 _reportErrorForCurrentToken(ParserErrorCode.MISSING_INITIALIZER);
5551 } else if (_enableAssertInitializer &&
5552 _matchesKeyword(Keyword.ASSERT)) {
5553 _parseAssertInitializer();
5505 } else { 5554 } else {
5506 initializers.add(_parseConstructorFieldInitializer(false)); 5555 initializers.add(_parseConstructorFieldInitializer(false));
5507 } 5556 }
5508 } while (_optional(TokenType.COMMA)); 5557 } while (_optional(TokenType.COMMA));
5509 if (factoryKeyword != null) { 5558 if (factoryKeyword != null) {
5510 _reportErrorForToken( 5559 _reportErrorForToken(
5511 ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword); 5560 ParserErrorCode.FACTORY_WITH_INITIALIZERS, factoryKeyword);
5512 } 5561 }
5513 } 5562 }
5514 ConstructorName redirectedConstructor = null; 5563 ConstructorName redirectedConstructor = null;
(...skipping 2760 matching lines...) Expand 10 before | Expand all | Expand 10 after
8275 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT); 8324 _reportErrorForCurrentToken(ParserErrorCode.EXPECTED_CASE_OR_DEFAULT);
8276 bool atEndOrNextMember() { 8325 bool atEndOrNextMember() {
8277 TokenType type = _currentToken.type; 8326 TokenType type = _currentToken.type;
8278 if (type == TokenType.EOF || 8327 if (type == TokenType.EOF ||
8279 type == TokenType.CLOSE_CURLY_BRACKET) { 8328 type == TokenType.CLOSE_CURLY_BRACKET) {
8280 return true; 8329 return true;
8281 } 8330 }
8282 Keyword keyword = _currentToken.keyword; 8331 Keyword keyword = _currentToken.keyword;
8283 return keyword == Keyword.CASE || keyword == Keyword.DEFAULT; 8332 return keyword == Keyword.CASE || keyword == Keyword.DEFAULT;
8284 } 8333 }
8334
8285 while (!atEndOrNextMember()) { 8335 while (!atEndOrNextMember()) {
8286 _advance(); 8336 _advance();
8287 } 8337 }
8288 } 8338 }
8289 type = _currentToken.type; 8339 type = _currentToken.type;
8290 } 8340 }
8291 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET); 8341 Token rightBracket = _expect(TokenType.CLOSE_CURLY_BRACKET);
8292 return new SwitchStatement(keyword, leftParenthesis, expression, 8342 return new SwitchStatement(keyword, leftParenthesis, expression,
8293 rightParenthesis, leftBracket, members, rightBracket); 8343 rightParenthesis, leftBracket, members, rightBracket);
8294 } finally { 8344 } finally {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
8618 bool isValidInUri(Token token) { 8668 bool isValidInUri(Token token) {
8619 TokenType type = token.type; 8669 TokenType type = token.type;
8620 return type == TokenType.COLON || 8670 return type == TokenType.COLON ||
8621 type == TokenType.SLASH || 8671 type == TokenType.SLASH ||
8622 type == TokenType.PERIOD || 8672 type == TokenType.PERIOD ||
8623 type == TokenType.PERIOD_PERIOD || 8673 type == TokenType.PERIOD_PERIOD ||
8624 type == TokenType.PERIOD_PERIOD_PERIOD || 8674 type == TokenType.PERIOD_PERIOD_PERIOD ||
8625 type == TokenType.INT || 8675 type == TokenType.INT ||
8626 type == TokenType.DOUBLE; 8676 type == TokenType.DOUBLE;
8627 } 8677 }
8678
8628 while ((_tokenMatchesIdentifier(token) && !isKeywordAfterUri(token)) || 8679 while ((_tokenMatchesIdentifier(token) && !isKeywordAfterUri(token)) ||
8629 isValidInUri(token)) { 8680 isValidInUri(token)) {
8630 token = token.next; 8681 token = token.next;
8631 } 8682 }
8632 if (_tokenMatches(token, TokenType.SEMICOLON) || 8683 if (_tokenMatches(token, TokenType.SEMICOLON) ||
8633 isKeywordAfterUri(token)) { 8684 isKeywordAfterUri(token)) {
8634 Token endToken = token.previous; 8685 Token endToken = token.previous;
8635 token = _currentToken; 8686 token = _currentToken;
8636 int endOffset = token.end; 8687 int endOffset = token.end;
8637 StringBuffer buffer = new StringBuffer(); 8688 StringBuffer buffer = new StringBuffer();
(...skipping 1841 matching lines...) Expand 10 before | Expand all | Expand 10 after
10479 */ 10530 */
10480 const ParserErrorCode(String name, String message, [String correction]) 10531 const ParserErrorCode(String name, String message, [String correction])
10481 : super(name, message, correction); 10532 : super(name, message, correction);
10482 10533
10483 @override 10534 @override
10484 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR; 10535 ErrorSeverity get errorSeverity => ErrorSeverity.ERROR;
10485 10536
10486 @override 10537 @override
10487 ErrorType get type => ErrorType.SYNTACTIC_ERROR; 10538 ErrorType get type => ErrorType.SYNTACTIC_ERROR;
10488 } 10539 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/engine.dart ('k') | pkg/analyzer/lib/src/task/dart.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698