Skip to content

Commit dc212fb

Browse files
committed
Fix: no-useless-rest-spread about holes (fixes #14)
1 parent 082c9d3 commit dc212fb

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

lib/rules/no-useless-rest-spread.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ function isCommaToken(token) {
2121
return token.type === "Punctuator" && token.value === ","
2222
}
2323

24+
/**
25+
* Check whether a given node is a hole.
26+
* @param {ASTNode|null} element The node to check.
27+
* @returns {boolean} `true` if the node is a hole.
28+
*/
29+
function isHole(element) {
30+
return element == null
31+
}
32+
2433
/**
2534
* Gets the last token of the given node's elements.
2635
* This skips trailing commas.
@@ -50,6 +59,11 @@ function defineFixer(sourceCode, node) {
5059
return (fixer) => {
5160
const child = node.argument
5261

62+
// If the inner array includes holes, do nothing.
63+
if (child.elements != null && child.elements.some(isHole)) {
64+
return null
65+
}
66+
5367
// Remove this element if it's empty.
5468
if ((child.elements || child.properties).length === 0) {
5569
const next = sourceCode.getTokenAfter(node)

tests/lib/rules/no-useless-rest-spread.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,5 +116,37 @@ ruleTester.run("no-useless-rest-spread", rule, {
116116
output: "let obj = { ...b}",
117117
errors: ["Redundant spread property."],
118118
},
119+
120+
// Don't auto-fix if the inner array has holes.
121+
{
122+
code: "let list = [a, ...[,]]",
123+
output: null,
124+
errors: ["Redundant spread element."],
125+
},
126+
{
127+
code: "let list = [a, ...[b,,c]]",
128+
output: null,
129+
errors: ["Redundant spread element."],
130+
},
131+
{
132+
code: "foo(a, ...[,])",
133+
output: null,
134+
errors: ["Redundant spread element."],
135+
},
136+
{
137+
code: "let [a, ...[,]] = list",
138+
output: null,
139+
errors: ["Redundant rest element."],
140+
},
141+
{
142+
code: "let [a, ...[,]] = list",
143+
output: null,
144+
errors: ["Redundant rest element."],
145+
},
146+
{
147+
code: "function foo(a, ...[,]) {}",
148+
output: null,
149+
errors: ["Redundant rest parameter."],
150+
},
119151
],
120152
})

0 commit comments

Comments
 (0)