Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8d2e2d5

Browse files
authored
Move RegExp flag version mapping to LanguageFeatureMinimumTarget (#58311)
1 parent 9504b75 commit 8d2e2d5

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

src/compiler/scanner.ts

+16-17
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
JSDocSyntaxKind,
2020
JsxTokenSyntaxKind,
2121
KeywordSyntaxKind,
22+
LanguageFeatureMinimumTarget,
2223
LanguageVariant,
2324
last,
2425
LineAndCharacter,
@@ -293,15 +294,12 @@ const charToRegExpFlag = new Map(Object.entries({
293294
y: RegularExpressionFlags.Sticky,
294295
}));
295296

296-
const regExpFlagToFirstAvailableLanguageVersion = new Map([
297-
[RegularExpressionFlags.HasIndices, ScriptTarget.ES2022],
298-
[RegularExpressionFlags.Global, ScriptTarget.ES3],
299-
[RegularExpressionFlags.IgnoreCase, ScriptTarget.ES3],
300-
[RegularExpressionFlags.Multiline, ScriptTarget.ES3],
301-
[RegularExpressionFlags.DotAll, ScriptTarget.ES2018],
302-
[RegularExpressionFlags.Unicode, ScriptTarget.ES2015],
303-
[RegularExpressionFlags.UnicodeSets, ScriptTarget.ESNext],
304-
[RegularExpressionFlags.Sticky, ScriptTarget.ES2015],
297+
const regExpFlagToFirstAvailableLanguageVersion = new Map<RegularExpressionFlags, LanguageFeatureMinimumTarget>([
298+
[RegularExpressionFlags.HasIndices, LanguageFeatureMinimumTarget.RegularExpressionFlagsHasIndices],
299+
[RegularExpressionFlags.DotAll, LanguageFeatureMinimumTarget.RegularExpressionFlagsDotAll],
300+
[RegularExpressionFlags.Unicode, LanguageFeatureMinimumTarget.RegularExpressionFlagsUnicode],
301+
[RegularExpressionFlags.UnicodeSets, LanguageFeatureMinimumTarget.RegularExpressionFlagsUnicodeSets],
302+
[RegularExpressionFlags.Sticky, LanguageFeatureMinimumTarget.RegularExpressionFlagsSticky],
305303
]);
306304

307305
/*
@@ -2461,10 +2459,7 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean
24612459
}
24622460
else {
24632461
regExpFlags |= flag;
2464-
const availableFrom = regExpFlagToFirstAvailableLanguageVersion.get(flag)!;
2465-
if (languageVersion < availableFrom) {
2466-
error(Diagnostics.This_regular_expression_flag_is_only_available_when_targeting_0_or_later, p, 1, getNameOfScriptTarget(availableFrom));
2467-
}
2462+
checkRegularExpressionFlagAvailable(flag, p);
24682463
}
24692464
}
24702465
p++;
@@ -2742,10 +2737,7 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean
27422737
}
27432738
else {
27442739
currFlags |= flag;
2745-
const availableFrom = regExpFlagToFirstAvailableLanguageVersion.get(flag)!;
2746-
if (languageVersion < availableFrom) {
2747-
error(Diagnostics.This_regular_expression_flag_is_only_available_when_targeting_0_or_later, pos, 1, getNameOfScriptTarget(availableFrom));
2748-
}
2740+
checkRegularExpressionFlagAvailable(flag, pos);
27492741
}
27502742
pos++;
27512743
}
@@ -3446,6 +3438,13 @@ export function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean
34463438
}
34473439
});
34483440
}
3441+
3442+
function checkRegularExpressionFlagAvailable(flag: RegularExpressionFlags, pos: number) {
3443+
const availableFrom = regExpFlagToFirstAvailableLanguageVersion.get(flag) as ScriptTarget | undefined;
3444+
if (availableFrom && languageVersion < availableFrom) {
3445+
error(Diagnostics.This_regular_expression_flag_is_only_available_when_targeting_0_or_later, pos, 1, getNameOfScriptTarget(availableFrom));
3446+
}
3447+
}
34493448
}
34503449

34513450
function appendIfCommentDirective(

src/compiler/types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -8231,6 +8231,8 @@ export const enum LanguageFeatureMinimumTarget {
82318231
ArrowFunctions = ScriptTarget.ES2015,
82328232
BlockScopedVariables = ScriptTarget.ES2015,
82338233
ObjectAssign = ScriptTarget.ES2015,
8234+
RegularExpressionFlagsUnicode = ScriptTarget.ES2015,
8235+
RegularExpressionFlagsSticky = ScriptTarget.ES2015,
82348236

82358237
// ES2016 Features
82368238
Exponentiation = ScriptTarget.ES2016, // `x ** y`
@@ -8243,6 +8245,7 @@ export const enum LanguageFeatureMinimumTarget {
82438245
AsyncGenerators = ScriptTarget.ES2018, // `async function * f() { }`
82448246
AsyncIteration = ScriptTarget.ES2018, // `Symbol.asyncIterator`
82458247
ObjectSpreadRest = ScriptTarget.ES2018, // `{ ...obj }`
8248+
RegularExpressionFlagsDotAll = ScriptTarget.ES2018,
82468249

82478250
// ES2019 Features
82488251
BindinglessCatch = ScriptTarget.ES2019, // `try { } catch { }`
@@ -8259,6 +8262,7 @@ export const enum LanguageFeatureMinimumTarget {
82598262
TopLevelAwait = ScriptTarget.ES2022,
82608263
ClassFields = ScriptTarget.ES2022,
82618264
PrivateNamesAndClassStaticBlocks = ScriptTarget.ES2022, // `class C { static {} #x = y, #m() {} }`, `#x in y`
8265+
RegularExpressionFlagsHasIndices = ScriptTarget.ES2022,
82628266

82638267
// ES2023 Features
82648268
ShebangComments = ScriptTarget.ESNext,
@@ -8269,6 +8273,7 @@ export const enum LanguageFeatureMinimumTarget {
82698273
// transformers/esnext.ts, commandLineParser.ts, and the contents of each lib/esnext.*.d.ts file.
82708274
UsingAndAwaitUsing = ScriptTarget.ESNext, // `using x = y`, `await using x = y`
82718275
ClassAndClassElementDecorators = ScriptTarget.ESNext, // `@dec class C {}`, `class C { @dec m() {} }`
8276+
RegularExpressionFlagsUnicodeSets = ScriptTarget.ESNext,
82728277
}
82738278

82748279
// dprint-ignore

0 commit comments

Comments
 (0)