Skip to content

Commit ac7edcc

Browse files
committedAug 25, 2024·
feat(linter/unicorn): add fixer to prefer-array-some (#5153)
1 parent f8bb022 commit ac7edcc

File tree

2 files changed

+80
-10
lines changed

2 files changed

+80
-10
lines changed
 

‎crates/oxc_linter/src/rules/unicorn/prefer_array_some.rs

+67-10
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ declare_oxc_lint!(
4646
/// ```
4747
PreferArraySome,
4848
pedantic,
49-
pending
49+
fix
5050
);
5151

5252
impl Rule for PreferArraySome {
@@ -62,10 +62,26 @@ impl Rule for PreferArraySome {
6262
return;
6363
}
6464

65-
ctx.diagnostic(over_method(
66-
// SAFETY: `call_expr_method_callee_info` returns `Some` if `is_method_call` returns `true`.
67-
call_expr_method_callee_info(call_expr).unwrap().0,
68-
));
65+
ctx.diagnostic_with_fix(
66+
over_method(
67+
// SAFETY: `call_expr_method_callee_info` returns `Some` if `is_method_call` returns `true`.
68+
call_expr_method_callee_info(call_expr).unwrap().0,
69+
),
70+
|fixer| {
71+
let target_span = call_expr
72+
.callee
73+
.as_member_expression()
74+
.and_then(|v| v.static_property_info().map(|(span, _)| span));
75+
76+
debug_assert!(target_span.is_some());
77+
78+
if let Some(target_span) = target_span {
79+
fixer.replace(target_span, "some")
80+
} else {
81+
fixer.noop()
82+
}
83+
},
84+
);
6985
}
7086
AstKind::BinaryExpression(bin_expr) => {
7187
if !matches!(
@@ -117,10 +133,26 @@ impl Rule for PreferArraySome {
117133
return;
118134
}
119135

120-
ctx.diagnostic(non_zero_filter(
121-
// SAFETY: `call_expr_method_callee_info` returns `Some` if `is_method_call` returns `true`.
122-
call_expr_method_callee_info(left_call_expr).unwrap().0,
123-
));
136+
ctx.diagnostic_with_fix(
137+
non_zero_filter(
138+
// SAFETY: `call_expr_method_callee_info` returns `Some` if `is_method_call` returns `true`.
139+
call_expr_method_callee_info(left_call_expr).unwrap().0,
140+
),
141+
|fixer| {
142+
let target_span = left_call_expr
143+
.callee
144+
.as_member_expression()
145+
.and_then(|v| v.static_property_info().map(|(span, _)| span));
146+
147+
debug_assert!(target_span.is_some());
148+
149+
if let Some(target_span) = target_span {
150+
fixer.replace(target_span, "some")
151+
} else {
152+
fixer.noop()
153+
}
154+
},
155+
);
124156
}
125157
_ => {}
126158
}
@@ -264,5 +296,30 @@ fn test() {
264296
r#"a = (( ((foo.find(fn))) == ((null)) )) ? "no" : "yes";"#,
265297
];
266298

267-
Tester::new(PreferArraySome::NAME, pass, fail).test_and_snapshot();
299+
let fix = vec![
300+
(r"if (foo.find(fn)) {}", r"if (foo.some(fn)) {}"),
301+
(r"if (foo.findLast(fn)) {}", r"if (foo.some(fn)) {}"),
302+
(
303+
r#"if (array.find(element => element === "🦄")) {}"#,
304+
r#"if (array.some(element => element === "🦄")) {}"#,
305+
),
306+
(
307+
r#"const foo = array.find(element => element === "🦄") ? bar : baz;"#,
308+
r#"const foo = array.some(element => element === "🦄") ? bar : baz;"#,
309+
),
310+
(r"array.filter(fn).length > 0", r"array.some(fn).length > 0"),
311+
(r"array.filter(fn).length !== 0", r"array.some(fn).length !== 0"),
312+
(r"foo.find(fn) == null", r"foo.some(fn) == null"),
313+
(r"foo.find(fn) == undefined", r"foo.some(fn) == undefined"),
314+
(r"foo.find(fn) === undefined", r"foo.some(fn) === undefined"),
315+
(r"foo.find(fn) != null", r"foo.some(fn) != null"),
316+
(r"foo.find(fn) != undefined", r"foo.some(fn) != undefined"),
317+
(r"foo.find(fn) !== undefined", r"foo.some(fn) !== undefined"),
318+
(
319+
r#"a = (( ((foo.find(fn))) == ((null)) )) ? "no" : "yes";"#,
320+
r#"a = (( ((foo.some(fn))) == ((null)) )) ? "no" : "yes";"#,
321+
),
322+
];
323+
324+
Tester::new(PreferArraySome::NAME, pass, fail).expect_fix(fix).test_and_snapshot();
268325
}

‎crates/oxc_linter/src/snapshots/prefer_array_some.snap

+13
Original file line numberDiff line numberDiff line change
@@ -6,75 +6,88 @@ source: crates/oxc_linter/src/tester.rs
66
1if (foo.find(fn)) {}
77
· ────
88
╰────
9+
help: Replace `find` with `some`.
910

1011
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
1112
╭─[prefer_array_some.tsx:1:9]
1213
1if (foo.findLast(fn)) {}
1314
· ────────
1415
╰────
16+
help: Replace `findLast` with `some`.
1517

1618
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
1719
╭─[prefer_array_some.tsx:1:11]
1820
1if (array.find(element => element === "🦄")) {}
1921
· ────
2022
╰────
23+
help: Replace `find` with `some`.
2124

2225
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
2326
╭─[prefer_array_some.tsx:1:19]
2427
1const foo = array.find(element => element === "🦄") ? bar : baz;
2528
· ────
2629
╰────
30+
help: Replace `find` with `some`.
2731

2832
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over non-zero length check from `.filter(…)`.
2933
╭─[prefer_array_some.tsx:1:7]
3034
1array.filter(fn).length > 0
3135
· ──────
3236
╰────
37+
help: Replace `filter` with `some`.
3338

3439
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over non-zero length check from `.filter(…)`.
3540
╭─[prefer_array_some.tsx:1:7]
3641
1array.filter(fn).length !== 0
3742
· ──────
3843
╰────
44+
help: Replace `filter` with `some`.
3945

4046
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
4147
╭─[prefer_array_some.tsx:1:5]
4248
1foo.find(fn) == null
4349
· ────
4450
╰────
51+
help: Replace `find` with `some`.
4552

4653
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
4754
╭─[prefer_array_some.tsx:1:5]
4855
1foo.find(fn) == undefined
4956
· ────
5057
╰────
58+
help: Replace `find` with `some`.
5159

5260
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
5361
╭─[prefer_array_some.tsx:1:5]
5462
1foo.find(fn) === undefined
5563
· ────
5664
╰────
65+
help: Replace `find` with `some`.
5766

5867
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
5968
╭─[prefer_array_some.tsx:1:5]
6069
1foo.find(fn) != null
6170
· ────
6271
╰────
72+
help: Replace `find` with `some`.
6373

6474
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
6575
╭─[prefer_array_some.tsx:1:5]
6676
1foo.find(fn) != undefined
6777
· ────
6878
╰────
79+
help: Replace `find` with `some`.
6980

7081
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
7182
╭─[prefer_array_some.tsx:1:5]
7283
1foo.find(fn) !== undefined
7384
· ────
7485
╰────
86+
help: Replace `find` with `some`.
7587

7688
eslint-plugin-unicorn(prefer-array-some): Prefer `.some(…)` over `.find(…)`or `.findLast(…)`.
7789
╭─[prefer_array_some.tsx:1:14]
7890
1a = (( ((foo.find(fn))) == ((null)) )) ? "no" : "yes";
7991
· ────
8092
╰────
93+
help: Replace `find` with `some`.

0 commit comments

Comments
 (0)
Please sign in to comment.