Skip to content

Commit eb2f184

Browse files
committed
Update: no-useless-rest-spread supports for properties (stage 3).
1 parent e9a8f51 commit eb2f184

File tree

3 files changed

+77
-12
lines changed

3 files changed

+77
-12
lines changed

docs/rules/no-useless-rest-spread.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ Examples of **incorrect** code for this rule:
1010
/*eslint no-useless-rest-spread: "error"*/
1111

1212
let list = [a, ...[b, c], d]
13+
let obj = {a, ...{b, c}, d}
1314
foo(...[a, b, c])
1415

1516
let [a, b, ...[c, d]] = list;
17+
let {a, b, ...{c, d}} = obj;
1618
function foo(a, b, ...[c, d]) {
1719
}
1820
```
@@ -23,9 +25,11 @@ Examples of **correct** code for this rule:
2325
/*eslint no-useless-rest-spread: "error"*/
2426

2527
let list = [a, b, c, d]
28+
let obj = {a, b, c, d}
2629
foo(a, b, c)
2730

2831
let [a, b, c, d] = list;
32+
let {a, b, c, d} = obj;
2933
function foo(a, b, c, d) {
3034
}
3135
```

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

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
* @fileoverview Rule to disallow unnecessary spread operators.
33
* @author Toru Nagashima
44
*/
5-
65
"use strict"
76

87
//------------------------------------------------------------------------------
@@ -61,6 +60,46 @@ module.exports = {
6160
})
6261
}
6362
},
63+
64+
SpreadProperty(node) {
65+
if (node.argument.type === "ObjectExpression") {
66+
context.report({
67+
node,
68+
message: "Unexpected a spread property.",
69+
fix: defineFixer(node),
70+
})
71+
}
72+
},
73+
74+
RestProperty(node) {
75+
if (node.argument.type === "ObjectPattern") {
76+
context.report({
77+
node,
78+
message: "Unexpected a rest property.",
79+
fix: defineFixer(node),
80+
})
81+
}
82+
},
83+
84+
ExperimentalSpreadProperty(node) {
85+
if (node.argument.type === "ObjectExpression") {
86+
context.report({
87+
node,
88+
message: "Unexpected a spread property.",
89+
fix: defineFixer(node),
90+
})
91+
}
92+
},
93+
94+
ExperimentalRestProperty(node) {
95+
if (node.argument.type === "ObjectPattern") {
96+
context.report({
97+
node,
98+
message: "Unexpected a rest property.",
99+
fix: defineFixer(node),
100+
})
101+
}
102+
},
64103
}
65104
},
66105
}

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

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,58 @@ const RuleTester = require("eslint").RuleTester
1515
// Tests
1616
//------------------------------------------------------------------------------
1717

18-
const ruleTester = new RuleTester()
18+
const ruleTester = new RuleTester({
19+
parserOptions: {
20+
ecmaVersion: 2015,
21+
ecmaFeatures: {experimentalObjectRestSpread: true},
22+
},
23+
})
1924

2025
ruleTester.run("no-useless-rest-spread", rule, {
2126
valid: [
22-
{code: "let list = [...a, ...b]", env: {es6: true}},
23-
{code: "foo(...a, ...b)", env: {es6: true}},
24-
{code: "let [a, b, c, ...d] = obj", env: {es6: true}},
25-
{code: "function foo(a, b, c, ...d) {}", env: {es6: true}},
27+
"let list = [...a, ...b]",
28+
"foo(...a, ...b)",
29+
"let [a, b, c, ...d] = obj",
30+
"function foo(a, b, c, ...d) {}",
31+
"let obj = {...a, ...b}",
32+
"let {a, ...b} = obj",
33+
34+
// those are invalid. I'll separate to another rule.
35+
"let list = [...{a}]",
36+
"let obj = {...[a]}",
2637
],
2738
invalid: [
2839
{
2940
code: "let list = [...[x, y, x], ...b]",
3041
output: "let list = [x, y, x, ...b]",
31-
env: {es6: true},
3242
errors: ["Unexpected a spread operator."],
3343
},
3444
{
3545
code: "foo(...a, ...[x, y, x])",
3646
output: "foo(...a, x, y, x)",
37-
env: {es6: true},
3847
errors: ["Unexpected a spread operator."],
3948
},
4049
{
4150
code: "let [a, ...[b, c, ...d]] = obj",
4251
output: "let [a, b, c, ...d] = obj",
43-
env: {es6: true},
4452
errors: ["Unexpected a rest operator."],
4553
},
46-
47-
// Acorn cannot parse this
48-
// {code: "function foo(a, ...[b, c, ...d]) {}", env: {es6: true}, errors: ["Unexpected a rest operator."]},
54+
// Espree threw a syntax error.
55+
// {
56+
// code: "function foo(a, ...[b, c, ...d]) {}",
57+
// output: "function foo(a, ...b, c, ...d) {}",
58+
// errors: ["Unexpected a rest operator."],
59+
// },
60+
{
61+
code: "let obj = {...{x, y, x}, ...b}",
62+
output: "let obj = {x, y, x, ...b}",
63+
errors: ["Unexpected a spread property."],
64+
},
65+
// Espree threw a syntax error.
66+
// {
67+
// code: "let {a, ...{b, c, ...d}} = obj",
68+
// output: "let {a, b, c, ...d} = obj",
69+
// errors: ["Unexpected a rest property."],
70+
// },
4971
],
5072
})

0 commit comments

Comments
 (0)