@@ -866,15 +866,20 @@ namespace ts {
866866 function scanNumberFragment ( ) : string {
867867 let start = pos ;
868868 let allowSeparator = false ;
869+ let isPreviousTokenSeparator = false ;
869870 let result = "" ;
870871 while ( true ) {
871872 const ch = text . charCodeAt ( pos ) ;
872873 if ( ch === CharacterCodes . _ ) {
873874 tokenFlags |= TokenFlags . ContainsSeparator ;
874875 if ( allowSeparator ) {
875876 allowSeparator = false ;
877+ isPreviousTokenSeparator = true ;
876878 result += text . substring ( start , pos ) ;
877879 }
880+ else if ( isPreviousTokenSeparator ) {
881+ error ( Diagnostics . Multiple_consecutive_numeric_separators_are_not_permitted , pos , 1 ) ;
882+ }
878883 else {
879884 error ( Diagnostics . Numeric_separators_are_not_allowed_here , pos , 1 ) ;
880885 }
@@ -884,6 +889,7 @@ namespace ts {
884889 }
885890 if ( isDigit ( ch ) ) {
886891 allowSeparator = true ;
892+ isPreviousTokenSeparator = false ;
887893 pos ++ ;
888894 continue ;
889895 }
@@ -962,12 +968,17 @@ namespace ts {
962968 let digits = 0 ;
963969 let value = 0 ;
964970 let allowSeparator = false ;
971+ let isPreviousTokenSeparator = false ;
965972 while ( digits < minCount || scanAsManyAsPossible ) {
966973 const ch = text . charCodeAt ( pos ) ;
967974 if ( canHaveSeparators && ch === CharacterCodes . _ ) {
968975 tokenFlags |= TokenFlags . ContainsSeparator ;
969976 if ( allowSeparator ) {
970977 allowSeparator = false ;
978+ isPreviousTokenSeparator = true ;
979+ }
980+ else if ( isPreviousTokenSeparator ) {
981+ error ( Diagnostics . Multiple_consecutive_numeric_separators_are_not_permitted , pos , 1 ) ;
971982 }
972983 else {
973984 error ( Diagnostics . Numeric_separators_are_not_allowed_here , pos , 1 ) ;
@@ -990,6 +1001,7 @@ namespace ts {
9901001 }
9911002 pos ++ ;
9921003 digits ++ ;
1004+ isPreviousTokenSeparator = false ;
9931005 }
9941006 if ( digits < minCount ) {
9951007 value = - 1 ;
@@ -1287,13 +1299,18 @@ namespace ts {
12871299 // Similarly valid octalIntegerLiteral must have at least one octal digit following o or O.
12881300 let numberOfDigits = 0 ;
12891301 let separatorAllowed = false ;
1302+ let isPreviousTokenSeparator = false ;
12901303 while ( true ) {
12911304 const ch = text . charCodeAt ( pos ) ;
12921305 // Numeric seperators are allowed anywhere within a numeric literal, except not at the beginning, or following another separator
12931306 if ( ch === CharacterCodes . _ ) {
12941307 tokenFlags |= TokenFlags . ContainsSeparator ;
12951308 if ( separatorAllowed ) {
12961309 separatorAllowed = false ;
1310+ isPreviousTokenSeparator = true ;
1311+ }
1312+ else if ( isPreviousTokenSeparator ) {
1313+ error ( Diagnostics . Multiple_consecutive_numeric_separators_are_not_permitted , pos , 1 ) ;
12971314 }
12981315 else {
12991316 error ( Diagnostics . Numeric_separators_are_not_allowed_here , pos , 1 ) ;
@@ -1309,6 +1326,7 @@ namespace ts {
13091326 value = value * base + valueOfCh ;
13101327 pos ++ ;
13111328 numberOfDigits ++ ;
1329+ isPreviousTokenSeparator = false ;
13121330 }
13131331 // Invalid binaryIntegerLiteral or octalIntegerLiteral
13141332 if ( numberOfDigits === 0 ) {
0 commit comments