diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 343df39ad9cbc..dcb1d0829464e 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -3125,9 +3125,6 @@ export function createScanner( mayContainStrings = !isCharacterComplement && expressionMayContainStrings; return; } - else { - error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, pos, 1, String.fromCharCode(ch)); - } break; default: if (isCharacterComplement && mayContainStrings) { @@ -3185,21 +3182,18 @@ export function createScanner( } break; case CharacterCodes.ampersand: - start = pos; - pos++; - if (charCodeChecked(pos) === CharacterCodes.ampersand) { - pos++; + if (charCodeChecked(pos + 1) === CharacterCodes.ampersand) { + start = pos; + pos += 2; error(Diagnostics.Operators_must_not_be_mixed_within_a_character_class_Wrap_it_in_a_nested_class_instead, pos - 2, 2); if (charCodeChecked(pos) === CharacterCodes.ampersand) { error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, pos, 1, String.fromCharCode(ch)); pos++; } + operand = text.slice(start, pos); + continue; } - else { - error(Diagnostics.Unexpected_0_Did_you_mean_to_escape_it_with_backslash, pos - 1, 1, String.fromCharCode(ch)); - } - operand = text.slice(start, pos); - continue; + break; } if (isClassContentExit(charCodeChecked(pos))) { break; diff --git a/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.js b/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.js new file mode 100644 index 0000000000000..5d33ae1a14769 --- /dev/null +++ b/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.js @@ -0,0 +1,17 @@ +//// [tests/cases/compiler/regularExpressionUnicodeSetsLoneAmpersand.ts] //// + +//// [regularExpressionUnicodeSetsLoneAmpersand.ts] +const regexes: RegExp[] = [ + /[?&]/v, + /[a&]/v, + /[&a]/v, +]; + + +//// [regularExpressionUnicodeSetsLoneAmpersand.js] +"use strict"; +const regexes = [ + /[?&]/v, + /[a&]/v, + /[&a]/v, +]; diff --git a/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.symbols b/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.symbols new file mode 100644 index 0000000000000..601db2e13a364 --- /dev/null +++ b/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.symbols @@ -0,0 +1,12 @@ +//// [tests/cases/compiler/regularExpressionUnicodeSetsLoneAmpersand.ts] //// + +=== regularExpressionUnicodeSetsLoneAmpersand.ts === +const regexes: RegExp[] = [ +>regexes : Symbol(regexes, Decl(regularExpressionUnicodeSetsLoneAmpersand.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) + + /[?&]/v, + /[a&]/v, + /[&a]/v, +]; + diff --git a/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.types b/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.types new file mode 100644 index 0000000000000..8d69a0704987f --- /dev/null +++ b/tests/baselines/reference/regularExpressionUnicodeSetsLoneAmpersand.types @@ -0,0 +1,23 @@ +//// [tests/cases/compiler/regularExpressionUnicodeSetsLoneAmpersand.ts] //// + +=== regularExpressionUnicodeSetsLoneAmpersand.ts === +const regexes: RegExp[] = [ +>regexes : RegExp[] +> : ^^^^^^^^ +>[ /[?&]/v, /[a&]/v, /[&a]/v,] : RegExp[] +> : ^^^^^^^^ + + /[?&]/v, +>/[?&]/v : RegExp +> : ^^^^^^ + + /[a&]/v, +>/[a&]/v : RegExp +> : ^^^^^^ + + /[&a]/v, +>/[&a]/v : RegExp +> : ^^^^^^ + +]; + diff --git a/tests/cases/compiler/regularExpressionUnicodeSetsLoneAmpersand.ts b/tests/cases/compiler/regularExpressionUnicodeSetsLoneAmpersand.ts new file mode 100644 index 0000000000000..47968e02b37d7 --- /dev/null +++ b/tests/cases/compiler/regularExpressionUnicodeSetsLoneAmpersand.ts @@ -0,0 +1,7 @@ +// @target: esnext + +const regexes: RegExp[] = [ + /[?&]/v, + /[a&]/v, + /[&a]/v, +];