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

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

Issue 2700343003: Recover better from illegally named constructors (issue 28807) (Closed)
Patch Set: Created 3 years, 10 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
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 1361 matching lines...) Expand 10 before | Expand all | Expand 10 after
1372 _createSyntheticToken(TokenType.OPEN_PAREN), 1372 _createSyntheticToken(TokenType.OPEN_PAREN),
1373 <FormalParameter>[], 1373 <FormalParameter>[],
1374 null, 1374 null,
1375 null, 1375 null,
1376 _createSyntheticToken(TokenType.CLOSE_PAREN)), 1376 _createSyntheticToken(TokenType.CLOSE_PAREN)),
1377 astFactory 1377 astFactory
1378 .emptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON))); 1378 .emptyFunctionBody(_createSyntheticToken(TokenType.SEMICOLON)));
1379 } 1379 }
1380 return null; 1380 return null;
1381 } else if (_tokenMatches(next, TokenType.PERIOD) && 1381 } else if (_tokenMatches(next, TokenType.PERIOD) &&
1382 _tokenMatchesIdentifier(_peekAt(2)) && 1382 _tokenMatchesIdentifierOrKeyword(_peekAt(2)) &&
1383 _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { 1383 _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
1384 if (!_tokenMatchesIdentifier(_peekAt(2))) {
1385 _reportErrorForToken(ParserErrorCode.INVALID_CONSTRUCTOR_NAME,
1386 _peekAt(2), [_peekAt(2).lexeme]);
1387 }
1384 return _parseConstructor( 1388 return _parseConstructor(
1385 commentAndMetadata, 1389 commentAndMetadata,
1386 modifiers.externalKeyword, 1390 modifiers.externalKeyword,
1387 _validateModifiersForConstructor(modifiers), 1391 _validateModifiersForConstructor(modifiers),
1388 modifiers.factoryKeyword, 1392 modifiers.factoryKeyword,
1389 parseSimpleIdentifier(), 1393 parseSimpleIdentifier(),
1390 getAndAdvance(), 1394 getAndAdvance(),
1391 parseSimpleIdentifier(isDeclaration: true), 1395 parseSimpleIdentifier(allowKeyword: true, isDeclaration: true),
1392 parseFormalParameterList()); 1396 parseFormalParameterList());
1393 } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) { 1397 } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
1394 TypeName returnType = _parseOptionalTypeNameComment(); 1398 TypeName returnType = _parseOptionalTypeNameComment();
1395 SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true); 1399 SimpleIdentifier methodName = parseSimpleIdentifier(isDeclaration: true);
1396 TypeParameterList typeParameters = _parseGenericCommentTypeParameters(); 1400 TypeParameterList typeParameters = _parseGenericCommentTypeParameters();
1397 FormalParameterList parameters = parseFormalParameterList(); 1401 FormalParameterList parameters = parseFormalParameterList();
1398 if (_matches(TokenType.COLON) || 1402 if (_matches(TokenType.COLON) ||
1399 modifiers.factoryKeyword != null || 1403 modifiers.factoryKeyword != null ||
1400 methodName.name == className) { 1404 methodName.name == className) {
1401 return _parseConstructor( 1405 return _parseConstructor(
(...skipping 3273 matching lines...) Expand 10 before | Expand all | Expand 10 after
4675 } 4679 }
4676 return expression; 4680 return expression;
4677 } 4681 }
4678 4682
4679 /** 4683 /**
4680 * Parse a simple identifier. Return the simple identifier that was parsed. 4684 * Parse a simple identifier. Return the simple identifier that was parsed.
4681 * 4685 *
4682 * identifier ::= 4686 * identifier ::=
4683 * IDENTIFIER 4687 * IDENTIFIER
4684 */ 4688 */
4685 SimpleIdentifier parseSimpleIdentifier({bool isDeclaration: false}) { 4689 SimpleIdentifier parseSimpleIdentifier(
4686 if (_matchesIdentifier()) { 4690 {bool allowKeyword: false, bool isDeclaration: false}) {
4691 if (_matchesIdentifier() ||
4692 (allowKeyword && _tokenMatchesIdentifierOrKeyword(_currentToken))) {
4687 return _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration); 4693 return _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration);
4688 } 4694 }
4689 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); 4695 _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
4690 return createSyntheticIdentifier(isDeclaration: isDeclaration); 4696 return createSyntheticIdentifier(isDeclaration: isDeclaration);
4691 } 4697 }
4692 4698
4693 /** 4699 /**
4694 * Parse a statement, starting with the given [token]. Return the statement 4700 * Parse a statement, starting with the given [token]. Return the statement
4695 * that was parsed, or `null` if the tokens do not represent a recognizable 4701 * that was parsed, or `null` if the tokens do not represent a recognizable
4696 * statement. 4702 * statement.
(...skipping 3258 matching lines...) Expand 10 before | Expand all | Expand 10 after
7955 7961
7956 /** 7962 /**
7957 * Return `true` if the given [token] is a valid identifier. Valid identifiers 7963 * Return `true` if the given [token] is a valid identifier. Valid identifiers
7958 * include built-in identifiers (pseudo-keywords). 7964 * include built-in identifiers (pseudo-keywords).
7959 */ 7965 */
7960 bool _tokenMatchesIdentifier(Token token) => 7966 bool _tokenMatchesIdentifier(Token token) =>
7961 _tokenMatches(token, TokenType.IDENTIFIER) || 7967 _tokenMatches(token, TokenType.IDENTIFIER) ||
7962 _tokenMatchesPseudoKeyword(token); 7968 _tokenMatchesPseudoKeyword(token);
7963 7969
7964 /** 7970 /**
7971 * Return `true` if the given [token] is either an identifier or a keyword.
7972 */
7973 bool _tokenMatchesIdentifierOrKeyword(Token token) =>
7974 _tokenMatches(token, TokenType.IDENTIFIER) ||
7975 _tokenMatches(token, TokenType.KEYWORD);
7976
7977 /**
7965 * Return `true` if the given [token] matches the given [keyword]. 7978 * Return `true` if the given [token] matches the given [keyword].
7966 */ 7979 */
7967 bool _tokenMatchesKeyword(Token token, Keyword keyword) => 7980 bool _tokenMatchesKeyword(Token token, Keyword keyword) =>
7968 token.keyword == keyword; 7981 token.keyword == keyword;
7969 7982
7970 /** 7983 /**
7971 * Return `true` if the given [token] matches a pseudo keyword. 7984 * Return `true` if the given [token] matches a pseudo keyword.
7972 */ 7985 */
7973 bool _tokenMatchesPseudoKeyword(Token token) => 7986 bool _tokenMatchesPseudoKeyword(Token token) =>
7974 token.keyword?.isPseudoKeyword ?? false; 7987 token.keyword?.isPseudoKeyword ?? false;
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
8493 */ 8506 */
8494 Parser_SyntheticKeywordToken(Keyword keyword, int offset) 8507 Parser_SyntheticKeywordToken(Keyword keyword, int offset)
8495 : super(keyword, offset); 8508 : super(keyword, offset);
8496 8509
8497 @override 8510 @override
8498 int get length => 0; 8511 int get length => 0;
8499 8512
8500 @override 8513 @override
8501 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset); 8514 Token copy() => new Parser_SyntheticKeywordToken(keyword, offset);
8502 } 8515 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698