Skip to content

Commit 920678e

Browse files
authored
Fix false positives when disallowNeverMatch in regexp/no-dupe-disjunctions rule (#196)
1 parent c501be4 commit 920678e

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

lib/utils/regexp-ast/is-covered.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,10 @@ function isCoveredAltNodes(
521521
if (!isCoveredForNormalizedNode(le, re.element, options)) {
522522
return false
523523
}
524+
// Checks if skipped.
525+
if (!isCoveredAltNodes([le, ...left], right, options)) {
526+
return false
527+
}
524528
const decrementRe = re.decrementMax()
525529
if (decrementRe) {
526530
// Check for multiple iterations.

tests/lib/rules/no-dupe-disjunctions.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,26 @@ tester.run("no-dupe-disjunctions", rule as any, {
3737
code: `/<("[^"]*"|'[^']*'|[^'">])*>/g`,
3838
options: [{ disallowNeverMatch: true }],
3939
},
40+
{
41+
code: String.raw`/A+_|A*_/`,
42+
options: [{ disallowNeverMatch: true }],
43+
},
44+
{
45+
code: String.raw`/(?:A+|A*)_/`,
46+
options: [{ disallowNeverMatch: true }],
47+
},
48+
{
49+
code: String.raw`/\d*\.\d+_|\d+\.\d*_/`,
50+
options: [{ disallowNeverMatch: true }],
51+
},
52+
{
53+
code: String.raw`/\d*\.\d+|\d+\.\d*/`,
54+
options: [{ disallowNeverMatch: true }],
55+
},
56+
{
57+
code: String.raw`/(?:\d*\.\d+|\d+\.\d*)_/`,
58+
options: [{ disallowNeverMatch: true }],
59+
},
4060
],
4161
invalid: [
4262
...[

tests/lib/utils/regexp-ast.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,26 @@ const TESTCASES_FOR_COVERED_NODE: TestCase[] = [
500500
b: /a*b?c_/,
501501
result: false,
502502
},
503+
{
504+
a: /\d+_/,
505+
b: /\d*_/,
506+
result: false,
507+
},
508+
{
509+
a: /\d+/,
510+
b: /\d*/,
511+
result: false,
512+
},
513+
{
514+
a: /\d*\.\d+/,
515+
b: /\d+\.\d*/,
516+
result: false,
517+
},
518+
{
519+
a: /\d*\.\d+_/,
520+
b: /\d+\.\d*_/,
521+
result: false,
522+
},
503523
]
504524
describe("regexp-ast isCoveredNode", () => {
505525
for (const testCase of [

0 commit comments

Comments
 (0)