@@ -27,7 +27,7 @@ namespace ts {
2727 isReservedWord ( ) : boolean ;
2828 isUnterminated ( ) : boolean ;
2929 /* @internal */
30- getNumericLiteralFlags ( ) : NumericLiteralFlags ;
30+ getTokenFlags ( ) : TokenFlags ;
3131 reScanGreaterToken ( ) : SyntaxKind ;
3232 reScanSlashToken ( ) : SyntaxKind ;
3333 reScanTemplateToken ( ) : SyntaxKind ;
@@ -815,10 +815,7 @@ namespace ts {
815815
816816 let token : SyntaxKind ;
817817 let tokenValue : string ;
818- let precedingLineBreak : boolean ;
819- let hasExtendedUnicodeEscape : boolean ;
820- let tokenIsUnterminated : boolean ;
821- let numericLiteralFlags : NumericLiteralFlags ;
818+ let tokenFlags : TokenFlags ;
822819
823820 setText ( text , start , length ) ;
824821
@@ -829,12 +826,12 @@ namespace ts {
829826 getTokenPos : ( ) => tokenPos ,
830827 getTokenText : ( ) => text . substring ( tokenPos , pos ) ,
831828 getTokenValue : ( ) => tokenValue ,
832- hasExtendedUnicodeEscape : ( ) => hasExtendedUnicodeEscape ,
833- hasPrecedingLineBreak : ( ) => precedingLineBreak ,
829+ hasExtendedUnicodeEscape : ( ) => ( tokenFlags & TokenFlags . ExtendedUnicodeEscape ) !== 0 ,
830+ hasPrecedingLineBreak : ( ) => ( tokenFlags & TokenFlags . PrecedingLineBreak ) !== 0 ,
834831 isIdentifier : ( ) => token === SyntaxKind . Identifier || token > SyntaxKind . LastReservedWord ,
835832 isReservedWord : ( ) => token >= SyntaxKind . FirstReservedWord && token <= SyntaxKind . LastReservedWord ,
836- isUnterminated : ( ) => tokenIsUnterminated ,
837- getNumericLiteralFlags : ( ) => numericLiteralFlags ,
833+ isUnterminated : ( ) => ( tokenFlags & TokenFlags . Unterminated ) !== 0 ,
834+ getTokenFlags : ( ) => tokenFlags ,
838835 reScanGreaterToken,
839836 reScanSlashToken,
840837 reScanTemplateToken,
@@ -871,7 +868,7 @@ namespace ts {
871868 let end = pos ;
872869 if ( text . charCodeAt ( pos ) === CharacterCodes . E || text . charCodeAt ( pos ) === CharacterCodes . e ) {
873870 pos ++ ;
874- numericLiteralFlags = NumericLiteralFlags . Scientific ;
871+ tokenFlags |= TokenFlags . Scientific ;
875872 if ( text . charCodeAt ( pos ) === CharacterCodes . plus || text . charCodeAt ( pos ) === CharacterCodes . minus ) pos ++ ;
876873 if ( isDigit ( text . charCodeAt ( pos ) ) ) {
877874 pos ++ ;
@@ -943,7 +940,7 @@ namespace ts {
943940 while ( true ) {
944941 if ( pos >= end ) {
945942 result += text . substring ( start , pos ) ;
946- tokenIsUnterminated = true ;
943+ tokenFlags |= TokenFlags . Unterminated ;
947944 error ( Diagnostics . Unterminated_string_literal ) ;
948945 break ;
949946 }
@@ -961,7 +958,7 @@ namespace ts {
961958 }
962959 if ( isLineBreak ( ch ) ) {
963960 result += text . substring ( start , pos ) ;
964- tokenIsUnterminated = true ;
961+ tokenFlags |= TokenFlags . Unterminated ;
965962 error ( Diagnostics . Unterminated_string_literal ) ;
966963 break ;
967964 }
@@ -985,7 +982,7 @@ namespace ts {
985982 while ( true ) {
986983 if ( pos >= end ) {
987984 contents += text . substring ( start , pos ) ;
988- tokenIsUnterminated = true ;
985+ tokenFlags |= TokenFlags . Unterminated ;
989986 error ( Diagnostics . Unterminated_template_literal ) ;
990987 resultingToken = startedWithBacktick ? SyntaxKind . NoSubstitutionTemplateLiteral : SyntaxKind . TemplateTail ;
991988 break ;
@@ -1071,7 +1068,7 @@ namespace ts {
10711068 case CharacterCodes . u :
10721069 // '\u{DDDDDDDD}'
10731070 if ( pos < end && text . charCodeAt ( pos ) === CharacterCodes . openBrace ) {
1074- hasExtendedUnicodeEscape = true ;
1071+ tokenFlags |= TokenFlags . ExtendedUnicodeEscape ;
10751072 pos ++ ;
10761073 return scanExtendedUnicodeEscape ( ) ;
10771074 }
@@ -1240,10 +1237,7 @@ namespace ts {
12401237
12411238 function scan ( ) : SyntaxKind {
12421239 startPos = pos ;
1243- hasExtendedUnicodeEscape = false ;
1244- precedingLineBreak = false ;
1245- tokenIsUnterminated = false ;
1246- numericLiteralFlags = 0 ;
1240+ tokenFlags = 0 ;
12471241 while ( true ) {
12481242 tokenPos = pos ;
12491243 if ( pos >= end ) {
@@ -1265,7 +1259,7 @@ namespace ts {
12651259 switch ( ch ) {
12661260 case CharacterCodes . lineFeed :
12671261 case CharacterCodes . carriageReturn :
1268- precedingLineBreak = true ;
1262+ tokenFlags |= TokenFlags . PrecedingLineBreak ;
12691263 if ( skipTrivia ) {
12701264 pos ++ ;
12711265 continue ;
@@ -1396,6 +1390,9 @@ namespace ts {
13961390 // Multi-line comment
13971391 if ( text . charCodeAt ( pos + 1 ) === CharacterCodes . asterisk ) {
13981392 pos += 2 ;
1393+ if ( text . charCodeAt ( pos ) === CharacterCodes . asterisk && text . charCodeAt ( pos + 1 ) !== CharacterCodes . slash ) {
1394+ tokenFlags |= TokenFlags . PrecedingJSDocComment ;
1395+ }
13991396
14001397 let commentClosed = false ;
14011398 while ( pos < end ) {
@@ -1408,7 +1405,7 @@ namespace ts {
14081405 }
14091406
14101407 if ( isLineBreak ( ch ) ) {
1411- precedingLineBreak = true ;
1408+ tokenFlags |= TokenFlags . PrecedingLineBreak ;
14121409 }
14131410 pos ++ ;
14141411 }
@@ -1421,7 +1418,9 @@ namespace ts {
14211418 continue ;
14221419 }
14231420 else {
1424- tokenIsUnterminated = ! commentClosed ;
1421+ if ( ! commentClosed ) {
1422+ tokenFlags |= TokenFlags . Unterminated ;
1423+ }
14251424 return token = SyntaxKind . MultiLineCommentTrivia ;
14261425 }
14271426 }
@@ -1442,7 +1441,7 @@ namespace ts {
14421441 value = 0 ;
14431442 }
14441443 tokenValue = "" + value ;
1445- numericLiteralFlags = NumericLiteralFlags . HexSpecifier ;
1444+ tokenFlags |= TokenFlags . HexSpecifier ;
14461445 return token = SyntaxKind . NumericLiteral ;
14471446 }
14481447 else if ( pos + 2 < end && ( text . charCodeAt ( pos + 1 ) === CharacterCodes . B || text . charCodeAt ( pos + 1 ) === CharacterCodes . b ) ) {
@@ -1453,7 +1452,7 @@ namespace ts {
14531452 value = 0 ;
14541453 }
14551454 tokenValue = "" + value ;
1456- numericLiteralFlags = NumericLiteralFlags . BinarySpecifier ;
1455+ tokenFlags |= TokenFlags . BinarySpecifier ;
14571456 return token = SyntaxKind . NumericLiteral ;
14581457 }
14591458 else if ( pos + 2 < end && ( text . charCodeAt ( pos + 1 ) === CharacterCodes . O || text . charCodeAt ( pos + 1 ) === CharacterCodes . o ) ) {
@@ -1464,13 +1463,13 @@ namespace ts {
14641463 value = 0 ;
14651464 }
14661465 tokenValue = "" + value ;
1467- numericLiteralFlags = NumericLiteralFlags . OctalSpecifier ;
1466+ tokenFlags |= TokenFlags . OctalSpecifier ;
14681467 return token = SyntaxKind . NumericLiteral ;
14691468 }
14701469 // Try to parse as an octal
14711470 if ( pos + 1 < end && isOctalDigit ( text . charCodeAt ( pos + 1 ) ) ) {
14721471 tokenValue = "" + scanOctalDigits ( ) ;
1473- numericLiteralFlags = NumericLiteralFlags . Octal ;
1472+ tokenFlags |= TokenFlags . Octal ;
14741473 return token = SyntaxKind . NumericLiteral ;
14751474 }
14761475 // This fall-through is a deviation from the EcmaScript grammar. The grammar says that a leading zero
@@ -1627,7 +1626,7 @@ namespace ts {
16271626 continue ;
16281627 }
16291628 else if ( isLineBreak ( ch ) ) {
1630- precedingLineBreak = true ;
1629+ tokenFlags |= TokenFlags . PrecedingLineBreak ;
16311630 pos ++ ;
16321631 continue ;
16331632 }
@@ -1670,14 +1669,14 @@ namespace ts {
16701669 // If we reach the end of a file, or hit a newline, then this is an unterminated
16711670 // regex. Report error and return what we have so far.
16721671 if ( p >= end ) {
1673- tokenIsUnterminated = true ;
1672+ tokenFlags |= TokenFlags . Unterminated ;
16741673 error ( Diagnostics . Unterminated_regular_expression_literal ) ;
16751674 break ;
16761675 }
16771676
16781677 const ch = text . charCodeAt ( p ) ;
16791678 if ( isLineBreak ( ch ) ) {
1680- tokenIsUnterminated = true ;
1679+ tokenFlags |= TokenFlags . Unterminated ;
16811680 error ( Diagnostics . Unterminated_regular_expression_literal ) ;
16821681 break ;
16831682 }
@@ -1895,7 +1894,7 @@ namespace ts {
18951894 const saveTokenPos = tokenPos ;
18961895 const saveToken = token ;
18971896 const saveTokenValue = tokenValue ;
1898- const savePrecedingLineBreak = precedingLineBreak ;
1897+ const saveTokenFlags = tokenFlags ;
18991898 const result = callback ( ) ;
19001899
19011900 // If our callback returned something 'falsy' or we're just looking ahead,
@@ -1906,7 +1905,7 @@ namespace ts {
19061905 tokenPos = saveTokenPos ;
19071906 token = saveToken ;
19081907 tokenValue = saveTokenValue ;
1909- precedingLineBreak = savePrecedingLineBreak ;
1908+ tokenFlags = saveTokenFlags ;
19101909 }
19111910 return result ;
19121911 }
@@ -1917,10 +1916,8 @@ namespace ts {
19171916 const saveStartPos = startPos ;
19181917 const saveTokenPos = tokenPos ;
19191918 const saveToken = token ;
1920- const savePrecedingLineBreak = precedingLineBreak ;
19211919 const saveTokenValue = tokenValue ;
1922- const saveHasExtendedUnicodeEscape = hasExtendedUnicodeEscape ;
1923- const saveTokenIsUnterminated = tokenIsUnterminated ;
1920+ const saveTokenFlags = tokenFlags ;
19241921
19251922 setText ( text , start , length ) ;
19261923 const result = callback ( ) ;
@@ -1930,10 +1927,8 @@ namespace ts {
19301927 startPos = saveStartPos ;
19311928 tokenPos = saveTokenPos ;
19321929 token = saveToken ;
1933- precedingLineBreak = savePrecedingLineBreak ;
19341930 tokenValue = saveTokenValue ;
1935- hasExtendedUnicodeEscape = saveHasExtendedUnicodeEscape ;
1936- tokenIsUnterminated = saveTokenIsUnterminated ;
1931+ tokenFlags = saveTokenFlags ;
19371932
19381933 return result ;
19391934 }
@@ -1974,11 +1969,8 @@ namespace ts {
19741969 startPos = textPos ;
19751970 tokenPos = textPos ;
19761971 token = SyntaxKind . Unknown ;
1977- precedingLineBreak = false ;
1978-
19791972 tokenValue = undefined ;
1980- hasExtendedUnicodeEscape = false ;
1981- tokenIsUnterminated = false ;
1973+ tokenFlags = 0 ;
19821974 }
19831975 }
19841976}
0 commit comments