@@ -1028,6 +1028,122 @@ describe('lexer', () => {
10281028 expectNumberToken ( tokens [ 5 ] , 7 , 8 , 2 ) ;
10291029 } ) ;
10301030
1031+ it ( 'should not tokenize a regex preceded by a postfix increment' , ( ) => {
1032+ const tokens : Token [ ] = lex ( 'a++ / 2' ) ;
1033+ expect ( tokens . length ) . toBe ( 4 ) ;
1034+ expectIdentifierToken ( tokens [ 0 ] , 0 , 1 , 'a' ) ;
1035+ expectOperatorToken ( tokens [ 1 ] , 1 , 3 , '++' ) ;
1036+ expectOperatorToken ( tokens [ 2 ] , 4 , 5 , '/' ) ;
1037+ expectNumberToken ( tokens [ 3 ] , 6 , 7 , 2 ) ;
1038+ } ) ;
1039+
1040+ it ( 'should not tokenize a regex preceded by a postfix decrement' , ( ) => {
1041+ const tokens : Token [ ] = lex ( 'a-- / b / c' ) ;
1042+ expect ( tokens . length ) . toBe ( 6 ) ;
1043+ expectIdentifierToken ( tokens [ 0 ] , 0 , 1 , 'a' ) ;
1044+ expectOperatorToken ( tokens [ 1 ] , 1 , 3 , '--' ) ;
1045+ expectOperatorToken ( tokens [ 2 ] , 4 , 5 , '/' ) ;
1046+ expectIdentifierToken ( tokens [ 3 ] , 6 , 7 , 'b' ) ;
1047+ expectOperatorToken ( tokens [ 4 ] , 8 , 9 , '/' ) ;
1048+ expectIdentifierToken ( tokens [ 5 ] , 10 , 11 , 'c' ) ;
1049+ } ) ;
1050+
1051+ it ( 'should not tokenize a regex preceded by a postfix increment after a non-null assertion' , ( ) => {
1052+ const tokens : Token [ ] = lex ( 'a!++ / 2' ) ;
1053+ expect ( tokens . length ) . toBe ( 5 ) ;
1054+ expectIdentifierToken ( tokens [ 0 ] , 0 , 1 , 'a' ) ;
1055+ expectOperatorToken ( tokens [ 1 ] , 1 , 2 , '!' ) ;
1056+ expectOperatorToken ( tokens [ 2 ] , 2 , 4 , '++' ) ;
1057+ expectOperatorToken ( tokens [ 3 ] , 5 , 6 , '/' ) ;
1058+ expectNumberToken ( tokens [ 4 ] , 7 , 8 , 2 ) ;
1059+ } ) ;
1060+
1061+ it ( 'should not tokenize a regex preceded by a postfix increment on a keyword property' , ( ) => {
1062+ const tokens : Token [ ] = lex ( 'o.in++ / 2' ) ;
1063+ expect ( tokens . length ) . toBe ( 6 ) ;
1064+ expectIdentifierToken ( tokens [ 0 ] , 0 , 1 , 'o' ) ;
1065+ expectCharacterToken ( tokens [ 1 ] , 1 , 2 , '.' ) ;
1066+ expectKeywordToken ( tokens [ 2 ] , 2 , 4 , 'in' ) ;
1067+ expectOperatorToken ( tokens [ 3 ] , 4 , 6 , '++' ) ;
1068+ expectOperatorToken ( tokens [ 4 ] , 7 , 8 , '/' ) ;
1069+ expectNumberToken ( tokens [ 5 ] , 9 , 10 , 2 ) ;
1070+ } ) ;
1071+
1072+ it ( 'should not tokenize a regex preceded by a non-null assertion on this or null' , ( ) => {
1073+ const tokens : Token [ ] = lex ( 'this! / 2' ) ;
1074+ expect ( tokens . length ) . toBe ( 4 ) ;
1075+ expectKeywordToken ( tokens [ 0 ] , 0 , 4 , 'this' ) ;
1076+ expectOperatorToken ( tokens [ 1 ] , 4 , 5 , '!' ) ;
1077+ expectOperatorToken ( tokens [ 2 ] , 6 , 7 , '/' ) ;
1078+ expectNumberToken ( tokens [ 3 ] , 8 , 9 , 2 ) ;
1079+ } ) ;
1080+
1081+ it ( 'should not tokenize a regex preceded by stacked non-null assertions' , ( ) => {
1082+ const tokens : Token [ ] = lex ( 'a!! / 2' ) ;
1083+ expect ( tokens . length ) . toBe ( 5 ) ;
1084+ expectIdentifierToken ( tokens [ 0 ] , 0 , 1 , 'a' ) ;
1085+ expectOperatorToken ( tokens [ 1 ] , 1 , 2 , '!' ) ;
1086+ expectOperatorToken ( tokens [ 2 ] , 2 , 3 , '!' ) ;
1087+ expectOperatorToken ( tokens [ 3 ] , 4 , 5 , '/' ) ;
1088+ expectNumberToken ( tokens [ 4 ] , 6 , 7 , 2 ) ;
1089+ } ) ;
1090+
1091+ it ( 'should not tokenize a regex preceded by a postfix increment on a safe keyword property' , ( ) => {
1092+ const tokens : Token [ ] = lex ( 'o?.in++ / 2' ) ;
1093+ expect ( tokens . length ) . toBe ( 6 ) ;
1094+ expectIdentifierToken ( tokens [ 0 ] , 0 , 1 , 'o' ) ;
1095+ expectOperatorToken ( tokens [ 1 ] , 1 , 3 , '?.' ) ;
1096+ expectKeywordToken ( tokens [ 2 ] , 3 , 5 , 'in' ) ;
1097+ expectOperatorToken ( tokens [ 3 ] , 5 , 7 , '++' ) ;
1098+ expectOperatorToken ( tokens [ 4 ] , 8 , 9 , '/' ) ;
1099+ expectNumberToken ( tokens [ 5 ] , 10 , 11 , 2 ) ;
1100+ } ) ;
1101+
1102+ it ( 'should not tokenize a regex preceded by a non-null assertion on a tagged template literal' , ( ) => {
1103+ const tokens : Token [ ] = lex ( 'tag`42`! / 2' ) ;
1104+ expect ( tokens . length ) . toBe ( 5 ) ;
1105+ expectIdentifierToken ( tokens [ 0 ] , 0 , 3 , 'tag' ) ;
1106+ expectStringToken ( tokens [ 1 ] , 3 , 7 , '42' , StringTokenKind . TemplateLiteralEnd ) ;
1107+ expectOperatorToken ( tokens [ 2 ] , 7 , 8 , '!' ) ;
1108+ expectOperatorToken ( tokens [ 3 ] , 9 , 10 , '/' ) ;
1109+ expectNumberToken ( tokens [ 4 ] , 11 , 12 , 2 ) ;
1110+ } ) ;
1111+
1112+ it ( 'should tokenize a regex preceded by a negation after typeof' , ( ) => {
1113+ const tokens : Token [ ] = lex ( 'typeof !/a/.test(b)' ) ;
1114+ expect ( tokens . length ) . toBe ( 8 ) ;
1115+ expectKeywordToken ( tokens [ 0 ] , 0 , 6 , 'typeof' ) ;
1116+ expectOperatorToken ( tokens [ 1 ] , 7 , 8 , '!' ) ;
1117+ expectRegExpBodyToken ( tokens [ 2 ] , 8 , 11 , 'a' ) ;
1118+ expectCharacterToken ( tokens [ 3 ] , 11 , 12 , '.' ) ;
1119+ expectIdentifierToken ( tokens [ 4 ] , 12 , 16 , 'test' ) ;
1120+ expectCharacterToken ( tokens [ 5 ] , 16 , 17 , '(' ) ;
1121+ expectIdentifierToken ( tokens [ 6 ] , 17 , 18 , 'b' ) ;
1122+ expectCharacterToken ( tokens [ 7 ] , 18 , 19 , ')' ) ;
1123+ } ) ;
1124+
1125+ it ( 'should tokenize a regex preceded by a negation after void' , ( ) => {
1126+ const tokens : Token [ ] = lex ( 'void !/a/.test(b)' ) ;
1127+ expect ( tokens . length ) . toBe ( 8 ) ;
1128+ expectKeywordToken ( tokens [ 0 ] , 0 , 4 , 'void' ) ;
1129+ expectOperatorToken ( tokens [ 1 ] , 5 , 6 , '!' ) ;
1130+ expectRegExpBodyToken ( tokens [ 2 ] , 6 , 9 , 'a' ) ;
1131+ expectCharacterToken ( tokens [ 3 ] , 9 , 10 , '.' ) ;
1132+ expectIdentifierToken ( tokens [ 4 ] , 10 , 14 , 'test' ) ;
1133+ expectCharacterToken ( tokens [ 5 ] , 14 , 15 , '(' ) ;
1134+ expectIdentifierToken ( tokens [ 6 ] , 15 , 16 , 'b' ) ;
1135+ expectCharacterToken ( tokens [ 7 ] , 16 , 17 , ')' ) ;
1136+ } ) ;
1137+
1138+ it ( 'should tokenize a regex preceded by a prefix increment' , ( ) => {
1139+ const tokens : Token [ ] = lex ( '++/a/.lastIndex' ) ;
1140+ expect ( tokens . length ) . toBe ( 4 ) ;
1141+ expectOperatorToken ( tokens [ 0 ] , 0 , 2 , '++' ) ;
1142+ expectRegExpBodyToken ( tokens [ 1 ] , 2 , 5 , 'a' ) ;
1143+ expectCharacterToken ( tokens [ 2 ] , 5 , 6 , '.' ) ;
1144+ expectIdentifierToken ( tokens [ 3 ] , 6 , 15 , 'lastIndex' ) ;
1145+ } ) ;
1146+
10311147 it ( 'should not tokenize consecutive regexes' , ( ) => {
10321148 const tokens : Token [ ] = lex ( '/ 1 / 2 / 3 / 4' ) ;
10331149 expect ( tokens . length ) . toBe ( 6 ) ;
0 commit comments