From 165350dc8f17bfd01974310d17f84be42f29958f Mon Sep 17 00:00:00 2001 From: graphemecluster Date: Thu, 18 Jul 2024 10:08:54 +0800 Subject: [PATCH] Provide User-Friendly Message for Extended Unicode Escapes in Regular Expressions in Non-Unicode Modes (#58981) Co-authored-by: Ron Buckton --- src/compiler/diagnosticMessages.json | 4 +++ src/compiler/scanner.ts | 16 ++++++---- ...ressionCharacterClassRangeOrder.errors.txt | 29 ++++++++++--------- ...xpressionExtendedUnicodeEscapes.errors.txt | 15 ++++++++++ ...regularExpressionExtendedUnicodeEscapes.js | 16 ++++++++++ ...arExpressionExtendedUnicodeEscapes.symbols | 12 ++++++++ ...ularExpressionExtendedUnicodeEscapes.types | 23 +++++++++++++++ ...regularExpressionExtendedUnicodeEscapes.ts | 6 ++++ 8 files changed, 102 insertions(+), 19 deletions(-) create mode 100644 tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.errors.txt create mode 100644 tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.js create mode 100644 tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.symbols create mode 100644 tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.types create mode 100644 tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index e71ee7671d1..e311a07ab5d 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1805,6 +1805,10 @@ "category": "Error", "code": 1537 }, + "Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set.": { + "category": "Error", + "code": 1538 + }, "The types of '{0}' are incompatible between these types.": { "category": "Error", diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 0f31a8c9db6..ce01171fcaa 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -1006,7 +1006,7 @@ const enum EscapeSequenceScanningFlags { AtomEscape = 1 << 5, ReportInvalidEscapeErrors = RegularExpression | ReportErrors, - ScanExtendedUnicodeEscape = String | AnyUnicodeMode, + AllowExtendedUnicodeEscape = String | AnyUnicodeMode, } const enum ClassSetExpressionType { @@ -1609,13 +1609,17 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean case CharacterCodes.doubleQuote: return '"'; case CharacterCodes.u: - if ( - flags & EscapeSequenceScanningFlags.ScanExtendedUnicodeEscape && - pos < end && charCodeUnchecked(pos) === CharacterCodes.openBrace - ) { + if (pos < end && charCodeUnchecked(pos) === CharacterCodes.openBrace) { // '\u{DDDDDD}' pos -= 2; - return scanExtendedUnicodeEscape(!!(flags & EscapeSequenceScanningFlags.ReportInvalidEscapeErrors)); + const result = scanExtendedUnicodeEscape(!!(flags & EscapeSequenceScanningFlags.ReportInvalidEscapeErrors)); + if (!(flags & EscapeSequenceScanningFlags.AllowExtendedUnicodeEscape)) { + tokenFlags |= TokenFlags.ContainsInvalidEscape; + if (flags & EscapeSequenceScanningFlags.ReportInvalidEscapeErrors) { + error(Diagnostics.Unicode_escape_sequences_are_only_available_when_the_Unicode_u_flag_or_the_Unicode_Sets_v_flag_is_set, start, pos - start); + } + } + return result; } // '\uDDDD' for (; pos < start + 6; pos++) { diff --git a/tests/baselines/reference/regularExpressionCharacterClassRangeOrder.errors.txt b/tests/baselines/reference/regularExpressionCharacterClassRangeOrder.errors.txt index a3ece5fedce..5b593e623e0 100644 --- a/tests/baselines/reference/regularExpressionCharacterClassRangeOrder.errors.txt +++ b/tests/baselines/reference/regularExpressionCharacterClassRangeOrder.errors.txt @@ -2,10 +2,11 @@ regularExpressionCharacterClassRangeOrder.ts(7,5): error TS1517: Range out of or regularExpressionCharacterClassRangeOrder.ts(7,12): error TS1517: Range out of order in character class. regularExpressionCharacterClassRangeOrder.ts(8,11): error TS1517: Range out of order in character class. regularExpressionCharacterClassRangeOrder.ts(9,11): error TS1517: Range out of order in character class. -regularExpressionCharacterClassRangeOrder.ts(11,6): error TS1125: Hexadecimal digit expected. -regularExpressionCharacterClassRangeOrder.ts(11,16): error TS1125: Hexadecimal digit expected. -regularExpressionCharacterClassRangeOrder.ts(11,27): error TS1125: Hexadecimal digit expected. -regularExpressionCharacterClassRangeOrder.ts(11,37): error TS1125: Hexadecimal digit expected. +regularExpressionCharacterClassRangeOrder.ts(11,4): error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. +regularExpressionCharacterClassRangeOrder.ts(11,14): error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. +regularExpressionCharacterClassRangeOrder.ts(11,25): error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. +regularExpressionCharacterClassRangeOrder.ts(11,25): error TS1517: Range out of order in character class. +regularExpressionCharacterClassRangeOrder.ts(11,35): error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. regularExpressionCharacterClassRangeOrder.ts(12,25): error TS1517: Range out of order in character class. regularExpressionCharacterClassRangeOrder.ts(13,25): error TS1517: Range out of order in character class. regularExpressionCharacterClassRangeOrder.ts(15,10): error TS1517: Range out of order in character class. @@ -14,7 +15,7 @@ regularExpressionCharacterClassRangeOrder.ts(16,31): error TS1517: Range out of regularExpressionCharacterClassRangeOrder.ts(17,31): error TS1517: Range out of order in character class. -==== regularExpressionCharacterClassRangeOrder.ts (14 errors) ==== +==== regularExpressionCharacterClassRangeOrder.ts (15 errors) ==== // The characters in the following regular expressions are ASCII-lookalike characters found in Unicode, including: // - 𝘈 (U+1D608 Mathematical Sans-Serif Italic Capital A) // - 𝘡 (U+1D621 Mathematical Sans-Serif Italic Capital Z) @@ -34,14 +35,16 @@ regularExpressionCharacterClassRangeOrder.ts(17,31): error TS1517: Range out of !!! error TS1517: Range out of order in character class. /[\u{1D608}-\u{1D621}][\u{1D621}-\u{1D608}]/, - -!!! error TS1125: Hexadecimal digit expected. - -!!! error TS1125: Hexadecimal digit expected. - -!!! error TS1125: Hexadecimal digit expected. - -!!! error TS1125: Hexadecimal digit expected. + ~~~~~~~~~ +!!! error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. + ~~~~~~~~~ +!!! error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. + ~~~~~~~~~ +!!! error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. + ~~~~~~~~~~~~~~~~~~~ +!!! error TS1517: Range out of order in character class. + ~~~~~~~~~ +!!! error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. /[\u{1D608}-\u{1D621}][\u{1D621}-\u{1D608}]/u, ~~~~~~~~~~~~~~~~~~~ !!! error TS1517: Range out of order in character class. diff --git a/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.errors.txt b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.errors.txt new file mode 100644 index 00000000000..6414010e5cc --- /dev/null +++ b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.errors.txt @@ -0,0 +1,15 @@ +regularExpressionExtendedUnicodeEscapes.ts(2,3): error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. +regularExpressionExtendedUnicodeEscapes.ts(2,13): error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. + + +==== regularExpressionExtendedUnicodeEscapes.ts (2 errors) ==== + const regexes: RegExp[] = [ + /\u{10000}[\u{10000}]/, + ~~~~~~~~~ +!!! error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. + ~~~~~~~~~ +!!! error TS1538: Unicode escape sequences are only available when the Unicode (u) flag or the Unicode Sets (v) flag is set. + /\u{10000}[\u{10000}]/u, + /\u{10000}[\u{10000}]/v, + ]; + \ No newline at end of file diff --git a/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.js b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.js new file mode 100644 index 00000000000..0e4c435a144 --- /dev/null +++ b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.js @@ -0,0 +1,16 @@ +//// [tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts] //// + +//// [regularExpressionExtendedUnicodeEscapes.ts] +const regexes: RegExp[] = [ + /\u{10000}[\u{10000}]/, + /\u{10000}[\u{10000}]/u, + /\u{10000}[\u{10000}]/v, +]; + + +//// [regularExpressionExtendedUnicodeEscapes.js] +const regexes = [ + /\u{10000}[\u{10000}]/, + /\u{10000}[\u{10000}]/u, + /\u{10000}[\u{10000}]/v, +]; diff --git a/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.symbols b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.symbols new file mode 100644 index 00000000000..febb9b19de8 --- /dev/null +++ b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.symbols @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts] //// + +=== regularExpressionExtendedUnicodeEscapes.ts === +const regexes: RegExp[] = [ +>regexes : Symbol(regexes, Decl(regularExpressionExtendedUnicodeEscapes.ts, 0, 5)) +>RegExp : Symbol(RegExp, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.core.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.regexp.d.ts, --, --) ... and 3 more) + + /\u{10000}[\u{10000}]/, + /\u{10000}[\u{10000}]/u, + /\u{10000}[\u{10000}]/v, +]; + diff --git a/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.types b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.types new file mode 100644 index 00000000000..378a9ced878 --- /dev/null +++ b/tests/baselines/reference/regularExpressionExtendedUnicodeEscapes.types @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts] //// + +=== regularExpressionExtendedUnicodeEscapes.ts === +const regexes: RegExp[] = [ +>regexes : RegExp[] +> : ^^^^^^^^ +>[ /\u{10000}[\u{10000}]/, /\u{10000}[\u{10000}]/u, /\u{10000}[\u{10000}]/v,] : RegExp[] +> : ^^^^^^^^ + + /\u{10000}[\u{10000}]/, +>/\u{10000}[\u{10000}]/ : RegExp +> : ^^^^^^ + + /\u{10000}[\u{10000}]/u, +>/\u{10000}[\u{10000}]/u : RegExp +> : ^^^^^^ + + /\u{10000}[\u{10000}]/v, +>/\u{10000}[\u{10000}]/v : RegExp +> : ^^^^^^ + +]; + diff --git a/tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts b/tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts new file mode 100644 index 00000000000..57127e4ad6a --- /dev/null +++ b/tests/cases/compiler/regularExpressionExtendedUnicodeEscapes.ts @@ -0,0 +1,6 @@ +// @target: esnext +const regexes: RegExp[] = [ + /\u{10000}[\u{10000}]/, + /\u{10000}[\u{10000}]/u, + /\u{10000}[\u{10000}]/v, +];