Skip to content

Commit cd566ba

Browse files
rbucktonjakebailey
andauthored
RegExp syntax checking performance (#58339)
Co-authored-by: Jake Bailey <5341706+jakebailey@users.noreply.github.com>
1 parent d2ad3ca commit cd566ba

7 files changed

+1035
-977
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31379,7 +31379,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3137931379

3138031380
function checkGrammarRegularExpressionLiteral(node: RegularExpressionLiteral) {
3138131381
const sourceFile = getSourceFileOfNode(node);
31382-
if (!hasParseDiagnostics(sourceFile)) {
31382+
if (!hasParseDiagnostics(sourceFile) && !node.isUnterminated) {
3138331383
let lastError: DiagnosticWithLocation | undefined;
3138431384
scanner ??= createScanner(ScriptTarget.ESNext, /*skipTrivia*/ true);
3138531385
scanner.setScriptTarget(sourceFile.languageVersion);

src/compiler/diagnosticMessages.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1733,7 +1733,7 @@
17331733
"category": "Error",
17341734
"code": 1519
17351735
},
1736-
"Expected a class set oprand.": {
1736+
"Expected a class set operand.": {
17371737
"category": "Error",
17381738
"code": 1520
17391739
},

src/compiler/scanner.ts

+1,002-945
Large diffs are not rendered by default.

src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -7630,6 +7630,7 @@ export type CommandLineOption = CommandLineOptionOfCustomType | CommandLineOptio
76307630
// dprint-ignore
76317631
/** @internal */
76327632
export const enum CharacterCodes {
7633+
EOF = -1,
76337634
nullCharacter = 0,
76347635
maxAsciiCharacter = 0x7F,
76357636

tests/baselines/reference/regularExpressionScanning(target=es2015).errors.txt

+10-10
Original file line numberDiff line numberDiff line change
@@ -157,24 +157,24 @@ regularExpressionScanning.ts(37,61): error TS1508: Unexpected '}'. Did you mean
157157
regularExpressionScanning.ts(37,63): error TS1517: Range out of order in character class.
158158
regularExpressionScanning.ts(37,76): error TS1535: This character cannot be escaped in a regular expression.
159159
regularExpressionScanning.ts(38,8): error TS1005: '--' expected.
160-
regularExpressionScanning.ts(38,9): error TS1520: Expected a class set oprand.
161-
regularExpressionScanning.ts(38,11): error TS1520: Expected a class set oprand.
160+
regularExpressionScanning.ts(38,9): error TS1520: Expected a class set operand.
161+
regularExpressionScanning.ts(38,11): error TS1520: Expected a class set operand.
162162
regularExpressionScanning.ts(38,12): error TS1005: '--' expected.
163163
regularExpressionScanning.ts(38,15): error TS1522: A character class must not contain a reserved double punctuator. Did you mean to escape it with backslash?
164164
regularExpressionScanning.ts(38,20): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
165165
regularExpressionScanning.ts(38,28): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
166166
regularExpressionScanning.ts(38,40): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
167167
regularExpressionScanning.ts(38,47): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
168168
regularExpressionScanning.ts(38,49): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
169-
regularExpressionScanning.ts(38,50): error TS1520: Expected a class set oprand.
169+
regularExpressionScanning.ts(38,50): error TS1520: Expected a class set operand.
170170
regularExpressionScanning.ts(38,55): error TS1511: '\q' is only available inside character class.
171171
regularExpressionScanning.ts(38,57): error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
172172
regularExpressionScanning.ts(38,61): error TS1508: Unexpected '}'. Did you mean to escape it with backslash?
173173
regularExpressionScanning.ts(38,66): error TS1508: Unexpected '-'. Did you mean to escape it with backslash?
174174
regularExpressionScanning.ts(38,67): error TS1005: '--' expected.
175-
regularExpressionScanning.ts(38,70): error TS1520: Expected a class set oprand.
175+
regularExpressionScanning.ts(38,70): error TS1520: Expected a class set operand.
176176
regularExpressionScanning.ts(38,75): error TS1508: Unexpected '&'. Did you mean to escape it with backslash?
177-
regularExpressionScanning.ts(38,85): error TS1520: Expected a class set oprand.
177+
regularExpressionScanning.ts(38,85): error TS1520: Expected a class set operand.
178178
regularExpressionScanning.ts(38,87): error TS1501: This regular expression flag is only available when targeting 'esnext' or later.
179179
regularExpressionScanning.ts(39,56): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
180180
regularExpressionScanning.ts(39,67): error TS1005: '&&' expected.
@@ -561,9 +561,9 @@ regularExpressionScanning.ts(47,101): error TS1501: This regular expression flag
561561

562562
!!! error TS1005: '--' expected.
563563

564-
!!! error TS1520: Expected a class set oprand.
564+
!!! error TS1520: Expected a class set operand.
565565

566-
!!! error TS1520: Expected a class set oprand.
566+
!!! error TS1520: Expected a class set operand.
567567

568568
!!! error TS1005: '--' expected.
569569
~~
@@ -579,7 +579,7 @@ regularExpressionScanning.ts(47,101): error TS1501: This regular expression flag
579579
~
580580
!!! error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
581581

582-
!!! error TS1520: Expected a class set oprand.
582+
!!! error TS1520: Expected a class set operand.
583583
~~
584584
!!! error TS1511: '\q' is only available inside character class.
585585
~
@@ -591,11 +591,11 @@ regularExpressionScanning.ts(47,101): error TS1501: This regular expression flag
591591

592592
!!! error TS1005: '--' expected.
593593

594-
!!! error TS1520: Expected a class set oprand.
594+
!!! error TS1520: Expected a class set operand.
595595
~
596596
!!! error TS1508: Unexpected '&'. Did you mean to escape it with backslash?
597597

598-
!!! error TS1520: Expected a class set oprand.
598+
!!! error TS1520: Expected a class set operand.
599599
~
600600
!!! error TS1501: This regular expression flag is only available when targeting 'esnext' or later.
601601
/[[^\P{Decimal_Number}&&[0-9]]&&\p{L}&&\p{ID_Continue}--\p{ASCII}\p{CWCF}]/v,

tests/baselines/reference/regularExpressionScanning(target=es5).errors.txt

+10-10
Original file line numberDiff line numberDiff line change
@@ -164,24 +164,24 @@ regularExpressionScanning.ts(37,63): error TS1517: Range out of order in charact
164164
regularExpressionScanning.ts(37,76): error TS1535: This character cannot be escaped in a regular expression.
165165
regularExpressionScanning.ts(37,87): error TS1501: This regular expression flag is only available when targeting 'es6' or later.
166166
regularExpressionScanning.ts(38,8): error TS1005: '--' expected.
167-
regularExpressionScanning.ts(38,9): error TS1520: Expected a class set oprand.
168-
regularExpressionScanning.ts(38,11): error TS1520: Expected a class set oprand.
167+
regularExpressionScanning.ts(38,9): error TS1520: Expected a class set operand.
168+
regularExpressionScanning.ts(38,11): error TS1520: Expected a class set operand.
169169
regularExpressionScanning.ts(38,12): error TS1005: '--' expected.
170170
regularExpressionScanning.ts(38,15): error TS1522: A character class must not contain a reserved double punctuator. Did you mean to escape it with backslash?
171171
regularExpressionScanning.ts(38,20): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
172172
regularExpressionScanning.ts(38,28): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
173173
regularExpressionScanning.ts(38,40): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
174174
regularExpressionScanning.ts(38,47): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
175175
regularExpressionScanning.ts(38,49): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
176-
regularExpressionScanning.ts(38,50): error TS1520: Expected a class set oprand.
176+
regularExpressionScanning.ts(38,50): error TS1520: Expected a class set operand.
177177
regularExpressionScanning.ts(38,55): error TS1511: '\q' is only available inside character class.
178178
regularExpressionScanning.ts(38,57): error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
179179
regularExpressionScanning.ts(38,61): error TS1508: Unexpected '}'. Did you mean to escape it with backslash?
180180
regularExpressionScanning.ts(38,66): error TS1508: Unexpected '-'. Did you mean to escape it with backslash?
181181
regularExpressionScanning.ts(38,67): error TS1005: '--' expected.
182-
regularExpressionScanning.ts(38,70): error TS1520: Expected a class set oprand.
182+
regularExpressionScanning.ts(38,70): error TS1520: Expected a class set operand.
183183
regularExpressionScanning.ts(38,75): error TS1508: Unexpected '&'. Did you mean to escape it with backslash?
184-
regularExpressionScanning.ts(38,85): error TS1520: Expected a class set oprand.
184+
regularExpressionScanning.ts(38,85): error TS1520: Expected a class set operand.
185185
regularExpressionScanning.ts(38,87): error TS1501: This regular expression flag is only available when targeting 'esnext' or later.
186186
regularExpressionScanning.ts(39,56): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
187187
regularExpressionScanning.ts(39,67): error TS1005: '&&' expected.
@@ -582,9 +582,9 @@ regularExpressionScanning.ts(47,101): error TS1501: This regular expression flag
582582

583583
!!! error TS1005: '--' expected.
584584

585-
!!! error TS1520: Expected a class set oprand.
585+
!!! error TS1520: Expected a class set operand.
586586

587-
!!! error TS1520: Expected a class set oprand.
587+
!!! error TS1520: Expected a class set operand.
588588

589589
!!! error TS1005: '--' expected.
590590
~~
@@ -600,7 +600,7 @@ regularExpressionScanning.ts(47,101): error TS1501: This regular expression flag
600600
~
601601
!!! error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
602602

603-
!!! error TS1520: Expected a class set oprand.
603+
!!! error TS1520: Expected a class set operand.
604604
~~
605605
!!! error TS1511: '\q' is only available inside character class.
606606
~
@@ -612,11 +612,11 @@ regularExpressionScanning.ts(47,101): error TS1501: This regular expression flag
612612

613613
!!! error TS1005: '--' expected.
614614

615-
!!! error TS1520: Expected a class set oprand.
615+
!!! error TS1520: Expected a class set operand.
616616
~
617617
!!! error TS1508: Unexpected '&'. Did you mean to escape it with backslash?
618618

619-
!!! error TS1520: Expected a class set oprand.
619+
!!! error TS1520: Expected a class set operand.
620620
~
621621
!!! error TS1501: This regular expression flag is only available when targeting 'esnext' or later.
622622
/[[^\P{Decimal_Number}&&[0-9]]&&\p{L}&&\p{ID_Continue}--\p{ASCII}\p{CWCF}]/v,

tests/baselines/reference/regularExpressionScanning(target=esnext).errors.txt

+10-10
Original file line numberDiff line numberDiff line change
@@ -141,24 +141,24 @@ regularExpressionScanning.ts(37,61): error TS1508: Unexpected '}'. Did you mean
141141
regularExpressionScanning.ts(37,63): error TS1517: Range out of order in character class.
142142
regularExpressionScanning.ts(37,76): error TS1535: This character cannot be escaped in a regular expression.
143143
regularExpressionScanning.ts(38,8): error TS1005: '--' expected.
144-
regularExpressionScanning.ts(38,9): error TS1520: Expected a class set oprand.
145-
regularExpressionScanning.ts(38,11): error TS1520: Expected a class set oprand.
144+
regularExpressionScanning.ts(38,9): error TS1520: Expected a class set operand.
145+
regularExpressionScanning.ts(38,11): error TS1520: Expected a class set operand.
146146
regularExpressionScanning.ts(38,12): error TS1005: '--' expected.
147147
regularExpressionScanning.ts(38,15): error TS1522: A character class must not contain a reserved double punctuator. Did you mean to escape it with backslash?
148148
regularExpressionScanning.ts(38,20): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
149149
regularExpressionScanning.ts(38,28): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
150150
regularExpressionScanning.ts(38,40): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
151151
regularExpressionScanning.ts(38,47): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
152152
regularExpressionScanning.ts(38,49): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
153-
regularExpressionScanning.ts(38,50): error TS1520: Expected a class set oprand.
153+
regularExpressionScanning.ts(38,50): error TS1520: Expected a class set operand.
154154
regularExpressionScanning.ts(38,55): error TS1511: '\q' is only available inside character class.
155155
regularExpressionScanning.ts(38,57): error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
156156
regularExpressionScanning.ts(38,61): error TS1508: Unexpected '}'. Did you mean to escape it with backslash?
157157
regularExpressionScanning.ts(38,66): error TS1508: Unexpected '-'. Did you mean to escape it with backslash?
158158
regularExpressionScanning.ts(38,67): error TS1005: '--' expected.
159-
regularExpressionScanning.ts(38,70): error TS1520: Expected a class set oprand.
159+
regularExpressionScanning.ts(38,70): error TS1520: Expected a class set operand.
160160
regularExpressionScanning.ts(38,75): error TS1508: Unexpected '&'. Did you mean to escape it with backslash?
161-
regularExpressionScanning.ts(38,85): error TS1520: Expected a class set oprand.
161+
regularExpressionScanning.ts(38,85): error TS1520: Expected a class set operand.
162162
regularExpressionScanning.ts(39,56): error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
163163
regularExpressionScanning.ts(39,67): error TS1005: '&&' expected.
164164
regularExpressionScanning.ts(41,5): error TS1518: Anything that would possibly match more than a single character is invalid inside a negated character class.
@@ -503,9 +503,9 @@ regularExpressionScanning.ts(47,89): error TS1518: Anything that would possibly
503503

504504
!!! error TS1005: '--' expected.
505505

506-
!!! error TS1520: Expected a class set oprand.
506+
!!! error TS1520: Expected a class set operand.
507507

508-
!!! error TS1520: Expected a class set oprand.
508+
!!! error TS1520: Expected a class set operand.
509509

510510
!!! error TS1005: '--' expected.
511511
~~
@@ -521,7 +521,7 @@ regularExpressionScanning.ts(47,89): error TS1518: Anything that would possibly
521521
~
522522
!!! error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.
523523

524-
!!! error TS1520: Expected a class set oprand.
524+
!!! error TS1520: Expected a class set operand.
525525
~~
526526
!!! error TS1511: '\q' is only available inside character class.
527527
~
@@ -533,11 +533,11 @@ regularExpressionScanning.ts(47,89): error TS1518: Anything that would possibly
533533

534534
!!! error TS1005: '--' expected.
535535

536-
!!! error TS1520: Expected a class set oprand.
536+
!!! error TS1520: Expected a class set operand.
537537
~
538538
!!! error TS1508: Unexpected '&'. Did you mean to escape it with backslash?
539539

540-
!!! error TS1520: Expected a class set oprand.
540+
!!! error TS1520: Expected a class set operand.
541541
/[[^\P{Decimal_Number}&&[0-9]]&&\p{L}&&\p{ID_Continue}--\p{ASCII}\p{CWCF}]/v,
542542
~~
543543
!!! error TS1519: Operators must not be mixed within a character class. Wrap it in a nested class instead.

0 commit comments

Comments
 (0)