Skip to content

Commit

Permalink
fix logic
Browse files Browse the repository at this point in the history
  • Loading branch information
fasttime committed Feb 18, 2024
1 parent b1cf05f commit 7bb7e55
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 30 deletions.
18 changes: 14 additions & 4 deletions lib/rules/no-misleading-character-class.js
Expand Up @@ -280,6 +280,9 @@ module.exports = {
* @see https://github.com/eslint/eslint/pull/17515
*/
function getNodeReportLocations(matches) {
if (!astUtils.isStaticTemplateLiteral(node) && node.type !== "Literal") {
return matches.length ? [node.loc] : [];
}
return matches.map(chars => {
const firstIndex = chars[0].start;
const lastIndex = chars.at(-1).end - 1;
Expand Down Expand Up @@ -359,12 +362,19 @@ module.exports = {
for (const { node: refNode } of tracker.iterateGlobalReferences({
RegExp: { [CALL]: true, [CONSTRUCT]: true }
})) {
let pattern, flags;
const [patternNode, flagsNode] = refNode.arguments;
const pattern = getStringIfConstant(patternNode, scope);
const flags = getStringIfConstant(flagsNode, scope);

if (typeof pattern === "string") {
verify(patternNode, pattern, flags || "", fixer => {
if (patternNode.type === "Literal" && patternNode.regex) {
pattern = patternNode.regex.pattern;
flags = flagsNode ? getStringIfConstant(flagsNode, scope) : patternNode.regex.flags;
} else {
pattern = getStringIfConstant(patternNode, scope);
flags = flagsNode ? getStringIfConstant(flagsNode, scope) : "";
}

if (typeof pattern === "string" && typeof flags === "string") {
verify(patternNode, pattern, flags, fixer => {

if (!isValidWithUnicodeFlag(context.languageOptions.ecmaVersion, pattern)) {
return null;
Expand Down
71 changes: 45 additions & 26 deletions tests/lib/rules/no-misleading-character-class.js
Expand Up @@ -40,6 +40,7 @@ ruleTester.run("no-misleading-character-class", rule, {
"var r = /πŸ‡―πŸ‡΅/",
"var r = /[JP]/",
"var r = /πŸ‘¨β€πŸ‘©β€πŸ‘¦/",
"var r = RegExp(/[πŸ‘]/u)",

// Ignore solo lead/tail surrogate.
"var r = /[\\uD83D]/",
Expand Down Expand Up @@ -75,6 +76,10 @@ ruleTester.run("no-misleading-character-class", rule, {
// don't report on templates with expressions
"var r = RegExp(`${x}[πŸ‘]`)",

// don't report on unknown flags
"var r = new RegExp('[πŸ‡―πŸ‡΅]', `${foo}`)",
String.raw`var r = new RegExp("[πŸ‘]", flags)`,

// ES2024
{ code: "var r = /[πŸ‘]/v", languageOptions: { ecmaVersion: 2024 } },
{ code: String.raw`var r = /^[\q{πŸ‘ΆπŸ»}]$/v`, languageOptions: { ecmaVersion: 2024 } },
Expand Down Expand Up @@ -636,15 +641,6 @@ ruleTester.run("no-misleading-character-class", rule, {
suggestions: null
}]
},
{
code: String.raw`var r = new RegExp("[πŸ‘]", flags)`,
errors: [{
column: 22,
endColumn: 24,
messageId: "surrogatePairWithoutUFlag",
suggestions: null
}]
},
{
code: String.raw`const flags = ""; var r = new RegExp("[πŸ‘]", flags)`,
errors: [{
Expand Down Expand Up @@ -1004,23 +1000,6 @@ ruleTester.run("no-misleading-character-class", rule, {
}
]
},
{
code: "var r = new RegExp('[πŸ‡―πŸ‡΅]', `${foo}`)",
errors: [
{
column: 22,
endColumn: 24,
messageId: "surrogatePairWithoutUFlag",
suggestions: [{ messageId: "suggestUnicodeFlag", output: "var r = new RegExp('[πŸ‡―πŸ‡΅]', `${foo}u`)" }]
},
{
column: 24,
endColumn: 26,
messageId: "surrogatePairWithoutUFlag",
suggestions: [{ messageId: "suggestUnicodeFlag", output: "var r = new RegExp('[πŸ‡―πŸ‡΅]', `${foo}u`)" }]
}
]
},
{
code: String.raw`var r = new RegExp("[πŸ‡―πŸ‡΅]")`,
errors: [
Expand Down Expand Up @@ -1343,6 +1322,46 @@ ruleTester.run("no-misleading-character-class", rule, {
suggestions: null
}]
},

// no granular reports on templates with expressions
{
code: 'new RegExp(`${"[πŸ‘πŸ‡―πŸ‡΅]"}[😊]`);',
errors: [{
column: 12,
endColumn: 31,
messageId: "surrogatePairWithoutUFlag",
suggestions: [{
messageId: "suggestUnicodeFlag",
output: 'new RegExp(`${"[πŸ‘πŸ‡―πŸ‡΅]"}[😊]`, "u");'
}]
}]
},

// no granular reports on identifiers
{
code: 'const pattern = "[πŸ‘]"; new RegExp(pattern);',
errors: [{
column: 36,
endColumn: 43,
messageId: "surrogatePairWithoutUFlag",
suggestions: [{
messageId: "suggestUnicodeFlag",
output: 'const pattern = "[πŸ‘]"; new RegExp(pattern, "u");'
}]
}]
},

// second argument in RegExp should override flags in regexp literal
{
code: "RegExp(/[aπŸ‘z]/u, '');",
errors: [{
column: 11,
endColumn: 13,
messageId: "surrogatePairWithoutUFlag",
suggestions: [{ messageId: "suggestUnicodeFlag", output: "RegExp(/[aπŸ‘z]/u, 'u');" }]
}]
},

{
code: String.raw`
Expand Down

0 comments on commit 7bb7e55

Please sign in to comment.