Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Correct Regular Expressions Behavior Related to Annex B #58320

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
10 changes: 9 additions & 1 deletion src/compiler/diagnosticMessages.json
Expand Up @@ -1789,14 +1789,22 @@
"category": "Error",
"code": 1533
},
"This backreference is invalid because the containing regular expression contains no capturing groups.": {
"This backreference refers to a group that does not exist. There are no capturing groups in this regular expression.": {
"category": "Error",
"code": 1534
},
"This character cannot be escaped in a regular expression.": {
"category": "Error",
"code": 1535
},
"Octal escape sequences and backreferences are not allowed in a character class. If this was intended as an escape sequence, use the syntax '{0}' instead.": {
"category": "Error",
"code": 1536
},
"Decimal escape sequences and backreferences are not allowed in a character class.": {
"category": "Error",
"code": 1537
},

"The types of '{0}' are incompatible between these types.": {
"category": "Error",
Expand Down
133 changes: 94 additions & 39 deletions src/compiler/scanner.ts

Large diffs are not rendered by default.

266 changes: 266 additions & 0 deletions tests/baselines/reference/regularExpressionAnnexB.errors.txt
@@ -0,0 +1,266 @@
regularExpressionAnnexB.ts(2,8): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(2,22): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(2,28): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(3,9): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(3,23): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(3,29): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(7,4): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(7,8): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(7,10): error TS1512: '\c' must be followed by an ASCII letter.
regularExpressionAnnexB.ts(7,14): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(7,18): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(7,22): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(7,24): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(7,28): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(7,30): error TS1531: '\p' must be followed by a Unicode property value expression enclosed in braces.
regularExpressionAnnexB.ts(8,5): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(8,9): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(8,11): error TS1512: '\c' must be followed by an ASCII letter.
regularExpressionAnnexB.ts(8,13): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(8,15): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(8,19): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(8,23): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(8,25): error TS1535: This character cannot be escaped in a regular expression.
regularExpressionAnnexB.ts(8,29): error TS1125: Hexadecimal digit expected.
regularExpressionAnnexB.ts(8,31): error TS1531: '\p' must be followed by a Unicode property value expression enclosed in braces.
regularExpressionAnnexB.ts(9,4): error TS1531: '\P' must be followed by a Unicode property value expression enclosed in braces.
regularExpressionAnnexB.ts(9,7): error TS1531: '\P' must be followed by a Unicode property value expression enclosed in braces.
regularExpressionAnnexB.ts(9,9): error TS1516: A character class range must not be bounded by another character class.
regularExpressionAnnexB.ts(23,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(23,8): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(24,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(24,9): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(25,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(25,10): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(26,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(26,5): error TS1506: Numbers out of order in quantifier.
regularExpressionAnnexB.ts(26,10): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(29,4): error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
regularExpressionAnnexB.ts(30,4): error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
regularExpressionAnnexB.ts(31,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(31,5): error TS1505: Incomplete quantifier. Digit expected.
regularExpressionAnnexB.ts(31,7): error TS1005: '}' expected.
regularExpressionAnnexB.ts(31,8): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(32,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(32,6): error TS1005: '}' expected.
regularExpressionAnnexB.ts(32,7): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(33,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(33,7): error TS1005: '}' expected.
regularExpressionAnnexB.ts(33,8): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(34,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(34,8): error TS1005: '}' expected.
regularExpressionAnnexB.ts(34,9): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(35,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(35,5): error TS1506: Numbers out of order in quantifier.
regularExpressionAnnexB.ts(35,8): error TS1005: '}' expected.
regularExpressionAnnexB.ts(35,9): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(36,4): error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
regularExpressionAnnexB.ts(36,5): error TS1508: Unexpected '}'. Did you mean to escape it with backslash?
regularExpressionAnnexB.ts(37,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(37,5): error TS1505: Incomplete quantifier. Digit expected.
regularExpressionAnnexB.ts(37,8): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(38,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(38,5): error TS1505: Incomplete quantifier. Digit expected.
regularExpressionAnnexB.ts(38,9): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(39,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(39,8): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(40,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(40,9): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(41,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(41,10): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(42,4): error TS1507: There is nothing available for repetition.
regularExpressionAnnexB.ts(42,5): error TS1506: Numbers out of order in quantifier.
regularExpressionAnnexB.ts(42,10): error TS1507: There is nothing available for repetition.


==== regularExpressionAnnexB.ts (73 errors) ====
const regexes: RegExp[] = [
/\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s/,

!!! error TS1125: Hexadecimal digit expected.

!!! error TS1125: Hexadecimal digit expected.

!!! error TS1125: Hexadecimal digit expected.
/[\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s]/,

!!! error TS1125: Hexadecimal digit expected.

!!! error TS1125: Hexadecimal digit expected.

!!! error TS1125: Hexadecimal digit expected.
/\P[\P\w-_]/,

// Compare to
/\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s/u,
~~
!!! error TS1535: This character cannot be escaped in a regular expression.

!!! error TS1125: Hexadecimal digit expected.
~~
!!! error TS1512: '\c' must be followed by an ASCII letter.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.

!!! error TS1125: Hexadecimal digit expected.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.

!!! error TS1125: Hexadecimal digit expected.
~~
!!! error TS1531: '\p' must be followed by a Unicode property value expression enclosed in braces.
/[\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s]/u,
~~
!!! error TS1535: This character cannot be escaped in a regular expression.

!!! error TS1125: Hexadecimal digit expected.
~~
!!! error TS1512: '\c' must be followed by an ASCII letter.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.

!!! error TS1125: Hexadecimal digit expected.
~~
!!! error TS1535: This character cannot be escaped in a regular expression.

!!! error TS1125: Hexadecimal digit expected.
~~
!!! error TS1531: '\p' must be followed by a Unicode property value expression enclosed in braces.
/\P[\P\w-_]/u,
~~
!!! error TS1531: '\P' must be followed by a Unicode property value expression enclosed in braces.
~~
!!! error TS1531: '\P' must be followed by a Unicode property value expression enclosed in braces.
~~
!!! error TS1516: A character class range must not be bounded by another character class.
];

const regexesWithBraces: RegExp[] = [
/{??/,
/{,??/,
/{,1??/,
/{1??/,
/{1,??/,
/{1,2??/,
/{2,1??/,
/{}??/,
/{,}??/,
/{,1}??/,
/{1}??/,
~~~~
!!! error TS1507: There is nothing available for repetition.
~
!!! error TS1507: There is nothing available for repetition.
/{1,}??/,
~~~~~
!!! error TS1507: There is nothing available for repetition.
~
!!! error TS1507: There is nothing available for repetition.
/{1,2}??/,
~~~~~~
!!! error TS1507: There is nothing available for repetition.
~
!!! error TS1507: There is nothing available for repetition.
/{2,1}??/,
~~~~~~
!!! error TS1507: There is nothing available for repetition.
~~~
!!! error TS1506: Numbers out of order in quantifier.
~
!!! error TS1507: There is nothing available for repetition.

// Compare to
/{??/u,
~
!!! error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
/{,??/u,
~
!!! error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
/{,1??/u,
~~~~
!!! error TS1507: There is nothing available for repetition.

!!! error TS1505: Incomplete quantifier. Digit expected.

!!! error TS1005: '}' expected.
~
!!! error TS1507: There is nothing available for repetition.
/{1??/u,
~~~
!!! error TS1507: There is nothing available for repetition.

!!! error TS1005: '}' expected.
~
!!! error TS1507: There is nothing available for repetition.
/{1,??/u,
~~~~
!!! error TS1507: There is nothing available for repetition.

!!! error TS1005: '}' expected.
~
!!! error TS1507: There is nothing available for repetition.
/{1,2??/u,
~~~~~
!!! error TS1507: There is nothing available for repetition.

!!! error TS1005: '}' expected.
~
!!! error TS1507: There is nothing available for repetition.
/{2,1??/u,
~~~~~
!!! error TS1507: There is nothing available for repetition.
~~~
!!! error TS1506: Numbers out of order in quantifier.

!!! error TS1005: '}' expected.
~
!!! error TS1507: There is nothing available for repetition.
/{}??/u,
~
!!! error TS1508: Unexpected '{'. Did you mean to escape it with backslash?
~
!!! error TS1508: Unexpected '}'. Did you mean to escape it with backslash?
/{,}??/u,
~~~~
!!! error TS1507: There is nothing available for repetition.

!!! error TS1505: Incomplete quantifier. Digit expected.
~
!!! error TS1507: There is nothing available for repetition.
/{,1}??/u,
~~~~~
!!! error TS1507: There is nothing available for repetition.

!!! error TS1505: Incomplete quantifier. Digit expected.
~
!!! error TS1507: There is nothing available for repetition.
/{1}??/u,
~~~~
!!! error TS1507: There is nothing available for repetition.
~
!!! error TS1507: There is nothing available for repetition.
/{1,}??/u,
~~~~~
!!! error TS1507: There is nothing available for repetition.
~
!!! error TS1507: There is nothing available for repetition.
/{1,2}??/u,
~~~~~~
!!! error TS1507: There is nothing available for repetition.
~
!!! error TS1507: There is nothing available for repetition.
/{2,1}??/u,
~~~~~~
!!! error TS1507: There is nothing available for repetition.
~~~
!!! error TS1506: Numbers out of order in quantifier.
~
!!! error TS1507: There is nothing available for repetition.
];

89 changes: 89 additions & 0 deletions tests/baselines/reference/regularExpressionAnnexB.js
@@ -0,0 +1,89 @@
//// [tests/cases/compiler/regularExpressionAnnexB.ts] ////

//// [regularExpressionAnnexB.ts]
const regexes: RegExp[] = [
/\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s/,
/[\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s]/,
/\P[\P\w-_]/,

// Compare to
/\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s/u,
/[\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s]/u,
/\P[\P\w-_]/u,
];

const regexesWithBraces: RegExp[] = [
/{??/,
/{,??/,
/{,1??/,
/{1??/,
/{1,??/,
/{1,2??/,
/{2,1??/,
/{}??/,
/{,}??/,
/{,1}??/,
/{1}??/,
/{1,}??/,
/{1,2}??/,
/{2,1}??/,

// Compare to
/{??/u,
/{,??/u,
/{,1??/u,
/{1??/u,
/{1,??/u,
/{1,2??/u,
/{2,1??/u,
/{}??/u,
/{,}??/u,
/{,1}??/u,
/{1}??/u,
/{1,}??/u,
/{1,2}??/u,
/{2,1}??/u,
];


//// [regularExpressionAnnexB.js]
const regexes = [
/\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s/,
/[\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s]/,
/\P[\P\w-_]/,
// Compare to
/\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s/u,
/[\q\u\i\c\k\_\f\o\x\-\j\u\m\p\s]/u,
/\P[\P\w-_]/u,
];
const regexesWithBraces = [
/{??/,
/{,??/,
/{,1??/,
/{1??/,
/{1,??/,
/{1,2??/,
/{2,1??/,
/{}??/,
/{,}??/,
/{,1}??/,
/{1}??/,
/{1,}??/,
/{1,2}??/,
/{2,1}??/,
// Compare to
/{??/u,
/{,??/u,
/{,1??/u,
/{1??/u,
/{1,??/u,
/{1,2??/u,
/{2,1??/u,
/{}??/u,
/{,}??/u,
/{,1}??/u,
/{1}??/u,
/{1,}??/u,
/{1,2}??/u,
/{2,1}??/u,
];