Skip to content

Commit 0e6a727

Browse files
feat(linter): add autofixer for eslint/radix (#10652)
related #10477
1 parent 344ef88 commit 0e6a727

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

crates/oxc_linter/src/rules/eslint/radix.rs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ fn missing_parameters(span: Span) -> OxcDiagnostic {
1313
}
1414

1515
fn missing_radix(span: Span) -> OxcDiagnostic {
16-
OxcDiagnostic::warn("Missing radix parameter.").with_label(span)
16+
OxcDiagnostic::warn("Missing radix parameter.")
17+
.with_help("Add radix parameter `10' for parsing decimal numbers.")
18+
.with_label(span)
1719
}
1820

1921
fn redundant_radix(span: Span) -> OxcDiagnostic {
@@ -51,7 +53,8 @@ declare_oxc_lint!(
5153
/// ```
5254
Radix,
5355
eslint,
54-
pedantic
56+
pedantic,
57+
conditional_fix_dangerous
5558
);
5659

5760
impl Rule for Radix {
@@ -114,7 +117,18 @@ impl Radix {
114117
0 => ctx.diagnostic(missing_parameters(call_expr.span)),
115118
1 => {
116119
if matches!(&self.radix_type, RadixType::Always) {
117-
ctx.diagnostic(missing_radix(call_expr.span));
120+
let first_arg = &call_expr.arguments[0];
121+
let end = call_expr.span.end;
122+
let check_span = Span::new(first_arg.span().start, end);
123+
let insert_param = ctx
124+
.source_range(check_span)
125+
.chars()
126+
.find_map(|c| if c == ',' { Some(" 10,") } else { None })
127+
.unwrap_or(", 10");
128+
129+
ctx.diagnostic_with_dangerous_fix(missing_radix(call_expr.span), |fixer| {
130+
fixer.insert_text_before_range(Span::new(end - 1, end - 1), insert_param)
131+
});
118132
}
119133
}
120134
_ => {
@@ -240,5 +254,21 @@ fn test() {
240254
("{ let Number; } (Number?.parseInt)();", None, None),
241255
];
242256

243-
Tester::new(Radix::NAME, Radix::PLUGIN, pass, fail).test_and_snapshot();
257+
let fix = vec![
258+
("parseInt(10)", "parseInt(10, 10)", Some(json!(["always"]))),
259+
("parseInt(10,)", "parseInt(10, 10,)", Some(json!(["always"]))),
260+
("parseInt(10 )", "parseInt(10 , 10)", Some(json!(["always"]))),
261+
("parseInt(10, )", "parseInt(10, 10,)", Some(json!(["always"]))),
262+
(
263+
r#"parseInt("123123" , )"#,
264+
r#"parseInt("123123" , 10,)"#,
265+
Some(json!(["always"])),
266+
),
267+
(r#"Number.parseInt("10")"#, r#"Number.parseInt("10", 10)"#, Some(json!(["always"]))),
268+
(r#"Number.parseInt("10",)"#, r#"Number.parseInt("10", 10,)"#, Some(json!(["always"]))),
269+
(r#"Number.parseInt?.("10")"#, r#"Number.parseInt?.("10", 10)"#, Some(json!(["always"]))),
270+
("parseInt(10, /** 213123 */)", "parseInt(10, /** 213123 */ 10,)", Some(json!(["always"]))),
271+
];
272+
273+
Tester::new(Radix::NAME, Radix::PLUGIN, pass, fail).expect_fix(fix).test_and_snapshot();
244274
}

crates/oxc_linter/src/snapshots/eslint_radix.snap

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,28 @@ source: crates/oxc_linter/src/tester.rs
1818
1parseInt("10");
1919
· ──────────────
2020
╰────
21+
help: Add radix parameter `10' for parsing decimal numbers.
2122
2223
⚠ eslint(radix): Missing radix parameter.
2324
╭─[radix.tsx:1:1]
2425
1 │ parseInt("10",);
2526
· ───────────────
2627
╰────
28+
help: Add radix parameter `10' for parsing decimal numbers.
2729

2830
eslint(radix): Missing radix parameter.
2931
╭─[radix.tsx:1:1]
3032
1parseInt((0, "10"));
3133
· ───────────────────
3234
╰────
35+
help: Add radix parameter `10' for parsing decimal numbers.
3336
3437
⚠ eslint(radix): Missing radix parameter.
3538
╭─[radix.tsx:1:1]
3639
1 │ parseInt((0, "10"),);
3740
· ────────────────────
3841
╰────
42+
help: Add radix parameter `10' for parsing decimal numbers.
3943

4044
eslint(radix): Invalid radix parameter, must be an integer between 2 and 36.
4145
╭─[radix.tsx:1:16]
@@ -102,6 +106,7 @@ source: crates/oxc_linter/src/tester.rs
102106
1Number.parseInt("10");
103107
· ─────────────────────
104108
╰────
109+
help: Add radix parameter `10' for parsing decimal numbers.
105110
106111
⚠ eslint(radix): Invalid radix parameter, must be an integer between 2 and 36.
107112
╭─[radix.tsx:1:23]
@@ -132,24 +137,28 @@ source: crates/oxc_linter/src/tester.rs
132137
1 │ parseInt?.("10");
133138
· ────────────────
134139
╰────
140+
help: Add radix parameter `10' for parsing decimal numbers.
135141

136142
eslint(radix): Missing radix parameter.
137143
╭─[radix.tsx:1:1]
138144
1Number.parseInt?.("10");
139145
· ───────────────────────
140146
╰────
147+
help: Add radix parameter `10' for parsing decimal numbers.
141148
142149
⚠ eslint(radix): Missing radix parameter.
143150
╭─[radix.tsx:1:1]
144151
1 │ Number?.parseInt("10");
145152
· ──────────────────────
146153
╰────
154+
help: Add radix parameter `10' for parsing decimal numbers.
147155

148156
eslint(radix): Missing radix parameter.
149157
╭─[radix.tsx:1:1]
150158
1 │ (Number?.parseInt)("10");
151159
· ────────────────────────
152160
╰────
161+
help: Add radix parameter `10' for parsing decimal numbers.
153162
154163
⚠ eslint(radix): Missing parameters.
155164
╭─[radix.tsx:1:21]

0 commit comments

Comments
 (0)