@@ -4809,7 +4809,7 @@ namespace ts {
48094809 node . decorators = decorators ;
48104810 setModifiers ( node , modifiers ) ;
48114811 parseExpected ( SyntaxKind . ClassKeyword ) ;
4812- node . name = parseOptionalIdentifier ( ) ;
4812+ node . name = parseNameOfClassDeclarationOrExpression ( ) ;
48134813 node . typeParameters = parseTypeParameters ( ) ;
48144814 node . heritageClauses = parseHeritageClauses ( /*isClassHeritageClause*/ true ) ;
48154815
@@ -4825,7 +4825,22 @@ namespace ts {
48254825
48264826 return finishNode ( node ) ;
48274827 }
4828-
4828+
4829+ function parseNameOfClassDeclarationOrExpression ( ) : Identifier {
4830+ // implements is a future reserved word so
4831+ // 'class implements' might mean either
4832+ // - class expression with omitted name, 'implements' starts heritage clause
4833+ // - class with name 'implements'
4834+ // 'isImplementsClause' helps to disambiguate between these two cases
4835+ return isIdentifier ( ) && ! isImplementsClause ( )
4836+ ? parseIdentifier ( )
4837+ : undefined ;
4838+ }
4839+
4840+ function isImplementsClause ( ) {
4841+ return token === SyntaxKind . ImplementsKeyword && lookAhead ( nextTokenIsIdentifierOrKeyword )
4842+ }
4843+
48294844 function parseHeritageClauses ( isClassHeritageClause : boolean ) : NodeArray < HeritageClause > {
48304845 // ClassTail[Yield,Await] : (Modified) See 14.5
48314846 // ClassHeritage[?Yield,?Await]opt { ClassBody[?Yield,?Await]opt }
0 commit comments