Skip to content

Commit f071d1e

Browse files
authored
Update: Add automated suggestion to radix rule for parsing decimals (#14291)
1 parent 0b6a3f3 commit f071d1e

2 files changed

Lines changed: 77 additions & 9 deletions

File tree

lib/rules/radix.js

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ module.exports = {
8282
description: "enforce the consistent use of the radix argument when using `parseInt()`",
8383
category: "Best Practices",
8484
recommended: false,
85-
url: "https://eslint.org/docs/rules/radix"
85+
url: "https://eslint.org/docs/rules/radix",
86+
suggestion: true
8687
},
8788

8889
schema: [
@@ -95,7 +96,8 @@ module.exports = {
9596
missingParameters: "Missing parameters.",
9697
redundantRadix: "Redundant radix parameter.",
9798
missingRadix: "Missing radix parameter.",
98-
invalidRadix: "Invalid radix parameter, must be an integer between 2 and 36."
99+
invalidRadix: "Invalid radix parameter, must be an integer between 2 and 36.",
100+
addRadixParameter10: "Add radix parameter `10` for parsing decimal numbers."
99101
}
100102
},
101103

@@ -123,7 +125,21 @@ module.exports = {
123125
if (mode === MODE_ALWAYS) {
124126
context.report({
125127
node,
126-
messageId: "missingRadix"
128+
messageId: "missingRadix",
129+
suggest: [
130+
{
131+
messageId: "addRadixParameter10",
132+
fix(fixer) {
133+
const sourceCode = context.getSourceCode();
134+
const tokens = sourceCode.getTokens(node);
135+
const lastToken = tokens[tokens.length - 1]; // Parenthesis.
136+
const secondToLastToken = tokens[tokens.length - 2]; // May or may not be a comma.
137+
const hasTrailingComma = secondToLastToken.type === "Punctuator" && secondToLastToken.value === ",";
138+
139+
return fixer.insertTextBefore(lastToken, hasTrailingComma ? " 10," : ", 10");
140+
}
141+
}
142+
]
127143
});
128144
}
129145
break;

tests/lib/rules/radix.js

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,34 @@ ruleTester.run("radix", rule, {
7676
code: "parseInt(\"10\");",
7777
errors: [{
7878
messageId: "missingRadix",
79-
type: "CallExpression"
79+
type: "CallExpression",
80+
suggestions: [{ messageId: "addRadixParameter10", output: "parseInt(\"10\", 10);" }]
81+
}]
82+
},
83+
{
84+
code: "parseInt(\"10\",);", // Function parameter with trailing comma
85+
parserOptions: { ecmaVersion: 2017 },
86+
errors: [{
87+
messageId: "missingRadix",
88+
type: "CallExpression",
89+
suggestions: [{ messageId: "addRadixParameter10", output: "parseInt(\"10\", 10,);" }]
90+
}]
91+
},
92+
{
93+
code: "parseInt((0, \"10\"));", // Sequence expression (no trailing comma).
94+
errors: [{
95+
messageId: "missingRadix",
96+
type: "CallExpression",
97+
suggestions: [{ messageId: "addRadixParameter10", output: "parseInt((0, \"10\"), 10);" }]
98+
}]
99+
},
100+
{
101+
code: "parseInt((0, \"10\"),);", // Sequence expression (with trailing comma).
102+
parserOptions: { ecmaVersion: 2017 },
103+
errors: [{
104+
messageId: "missingRadix",
105+
type: "CallExpression",
106+
suggestions: [{ messageId: "addRadixParameter10", output: "parseInt((0, \"10\"), 10,);" }]
80107
}]
81108
},
82109
{
@@ -154,7 +181,8 @@ ruleTester.run("radix", rule, {
154181
code: "Number.parseInt(\"10\");",
155182
errors: [{
156183
messageId: "missingRadix",
157-
type: "CallExpression"
184+
type: "CallExpression",
185+
suggestions: [{ messageId: "addRadixParameter10", output: "Number.parseInt(\"10\", 10);" }]
158186
}]
159187
},
160188
{
@@ -191,22 +219,46 @@ ruleTester.run("radix", rule, {
191219
{
192220
code: "parseInt?.(\"10\");",
193221
parserOptions: { ecmaVersion: 2020 },
194-
errors: [{ messageId: "missingRadix" }]
222+
errors: [
223+
{
224+
messageId: "missingRadix",
225+
type: "CallExpression",
226+
suggestions: [{ messageId: "addRadixParameter10", output: "parseInt?.(\"10\", 10);" }]
227+
}
228+
]
195229
},
196230
{
197231
code: "Number.parseInt?.(\"10\");",
198232
parserOptions: { ecmaVersion: 2020 },
199-
errors: [{ messageId: "missingRadix" }]
233+
errors: [
234+
{
235+
messageId: "missingRadix",
236+
type: "CallExpression",
237+
suggestions: [{ messageId: "addRadixParameter10", output: "Number.parseInt?.(\"10\", 10);" }]
238+
}
239+
]
200240
},
201241
{
202242
code: "Number?.parseInt(\"10\");",
203243
parserOptions: { ecmaVersion: 2020 },
204-
errors: [{ messageId: "missingRadix" }]
244+
errors: [
245+
{
246+
messageId: "missingRadix",
247+
type: "CallExpression",
248+
suggestions: [{ messageId: "addRadixParameter10", output: "Number?.parseInt(\"10\", 10);" }]
249+
}
250+
]
205251
},
206252
{
207253
code: "(Number?.parseInt)(\"10\");",
208254
parserOptions: { ecmaVersion: 2020 },
209-
errors: [{ messageId: "missingRadix" }]
255+
errors: [
256+
{
257+
messageId: "missingRadix",
258+
type: "CallExpression",
259+
suggestions: [{ messageId: "addRadixParameter10", output: "(Number?.parseInt)(\"10\", 10);" }]
260+
}
261+
]
210262
}
211263
]
212264
});

0 commit comments

Comments
 (0)