| Index: pkg/analyzer/lib/src/generated/parser.dart | 
| diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart | 
| index 0ff0c33660353d916d766e22e642c781b634a203..2c5cafc18caf2d8684e484e35ed5027f5392cfd4 100644 | 
| --- a/pkg/analyzer/lib/src/generated/parser.dart | 
| +++ b/pkg/analyzer/lib/src/generated/parser.dart | 
| @@ -1379,8 +1379,12 @@ class Parser { | 
| } | 
| return null; | 
| } else if (_tokenMatches(next, TokenType.PERIOD) && | 
| -        _tokenMatchesIdentifier(_peekAt(2)) && | 
| +        _tokenMatchesIdentifierOrKeyword(_peekAt(2)) && | 
| _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) { | 
| +      if (!_tokenMatchesIdentifier(_peekAt(2))) { | 
| +        _reportErrorForToken(ParserErrorCode.INVALID_CONSTRUCTOR_NAME, | 
| +            _peekAt(2), [_peekAt(2).lexeme]); | 
| +      } | 
| return _parseConstructor( | 
| commentAndMetadata, | 
| modifiers.externalKeyword, | 
| @@ -1388,7 +1392,7 @@ class Parser { | 
| modifiers.factoryKeyword, | 
| parseSimpleIdentifier(), | 
| getAndAdvance(), | 
| -          parseSimpleIdentifier(isDeclaration: true), | 
| +          parseSimpleIdentifier(allowKeyword: true, isDeclaration: true), | 
| parseFormalParameterList()); | 
| } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) { | 
| TypeName returnType = _parseOptionalTypeNameComment(); | 
| @@ -4682,8 +4686,10 @@ class Parser { | 
| *     identifier ::= | 
| *         IDENTIFIER | 
| */ | 
| -  SimpleIdentifier parseSimpleIdentifier({bool isDeclaration: false}) { | 
| -    if (_matchesIdentifier()) { | 
| +  SimpleIdentifier parseSimpleIdentifier( | 
| +      {bool allowKeyword: false, bool isDeclaration: false}) { | 
| +    if (_matchesIdentifier() || | 
| +        (allowKeyword && _tokenMatchesIdentifierOrKeyword(_currentToken))) { | 
| return _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration); | 
| } | 
| _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER); | 
| @@ -7962,6 +7968,13 @@ class Parser { | 
| _tokenMatchesPseudoKeyword(token); | 
|  | 
| /** | 
| +   * Return `true` if the given [token] is either an identifier or a keyword. | 
| +   */ | 
| +  bool _tokenMatchesIdentifierOrKeyword(Token token) => | 
| +      _tokenMatches(token, TokenType.IDENTIFIER) || | 
| +      _tokenMatches(token, TokenType.KEYWORD); | 
| + | 
| +  /** | 
| * Return `true` if the given [token] matches the given [keyword]. | 
| */ | 
| bool _tokenMatchesKeyword(Token token, Keyword keyword) => | 
|  |