@@ -1355,10 +1355,29 @@ namespace ts {
13551355
13561356 function nextTokenCanFollowDefaultKeyword ( ) : boolean {
13571357 nextToken ( ) ;
1358- return token ( ) === SyntaxKind . ClassKeyword || token ( ) === SyntaxKind . FunctionKeyword ||
1359- token ( ) === SyntaxKind . InterfaceKeyword ||
1360- ( token ( ) === SyntaxKind . AbstractKeyword && lookAhead ( nextTokenIsClassKeywordOnSameLine ) ) ||
1361- ( token ( ) === SyntaxKind . AsyncKeyword && lookAhead ( nextTokenIsFunctionKeywordOnSameLine ) ) ;
1358+ switch ( token ( ) ) {
1359+ case SyntaxKind . ClassKeyword :
1360+ case SyntaxKind . FunctionKeyword :
1361+ case SyntaxKind . InterfaceKeyword :
1362+ case SyntaxKind . EnumKeyword :
1363+ case SyntaxKind . NamespaceKeyword :
1364+ case SyntaxKind . ModuleKeyword :
1365+ return true ;
1366+ case SyntaxKind . ConstKeyword :
1367+ return lookAhead ( ( ) => nextToken ( ) === SyntaxKind . EnumKeyword ) ;
1368+
1369+ // "abstract", "declare" and "async" aren't reserved keywords and could be identifiers.
1370+ // see https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#221-reserved-words
1371+ // Hence, we need to check whether it is followed by "class" or "function" on the same line,
1372+ // or if (for example) it should be parsed (with ASI) as "export default declare;"
1373+ case SyntaxKind . AbstractKeyword :
1374+ return lookAhead ( nextTokenIsClassKeywordOnSameLine ) ;
1375+ case SyntaxKind . DeclareKeyword :
1376+ // "export default declare class" and "export default declare abstract class" are both valid
1377+ return lookAhead ( nextTokenIsClassKeywordOnSameLine ) || lookAhead ( nextTokenIsAbstractKeywordOnSameLine ) ;
1378+ case SyntaxKind . AsyncKeyword :
1379+ return lookAhead ( nextTokenIsFunctionKeywordOnSameLine ) ;
1380+ }
13621381 }
13631382
13641383 // True if positioned at the start of a list element
@@ -4917,6 +4936,11 @@ namespace ts {
49174936 return token ( ) === SyntaxKind . FunctionKeyword && ! scanner . hasPrecedingLineBreak ( ) ;
49184937 }
49194938
4939+ function nextTokenIsAbstractKeywordOnSameLine ( ) {
4940+ nextToken ( ) ;
4941+ return token ( ) === SyntaxKind . AbstractKeyword && ! scanner . hasPrecedingLineBreak ( ) ;
4942+ }
4943+
49204944 function nextTokenIsIdentifierOrKeywordOrLiteralOnSameLine ( ) {
49214945 nextToken ( ) ;
49224946 return ( tokenIsIdentifierOrKeyword ( token ( ) ) || token ( ) === SyntaxKind . NumericLiteral || token ( ) === SyntaxKind . StringLiteral ) && ! scanner . hasPrecedingLineBreak ( ) ;
@@ -5697,8 +5721,8 @@ namespace ts {
56975721
56985722 function tryParseTypeArguments ( ) : NodeArray < TypeNode > | undefined {
56995723 return token ( ) === SyntaxKind . LessThanToken
5700- ? parseBracketedList ( ParsingContext . TypeArguments , parseType , SyntaxKind . LessThanToken , SyntaxKind . GreaterThanToken )
5701- : undefined ;
5724+ ? parseBracketedList ( ParsingContext . TypeArguments , parseType , SyntaxKind . LessThanToken , SyntaxKind . GreaterThanToken )
5725+ : undefined ;
57025726 }
57035727
57045728 function isHeritageClause ( ) : boolean {
0 commit comments