Skip to content

Commit

Permalink
New: no-useless-rest-spread rule
Browse files Browse the repository at this point in the history
  • Loading branch information
mysticatea committed Jun 4, 2016
1 parent 40fae8b commit 44a2c14
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 0 deletions.
29 changes: 29 additions & 0 deletions docs/rules/no-useless-rest-spread.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Disallow unnecessary rest/spread operators (no-useless-rest-spread)

## Rule Details

Examples of **incorrect** code for this rule:

```js
/*eslint no-useless-rest-spread: "error"*/

let list = [a, ...[b, c], d]
foo(...[a, b, c])

let [a, b, ...[c, d]] = list;
function foo(a, b, ...[c, d]) {
}
```

Examples of **correct** code for this rule:

```js
/*eslint no-useless-rest-spread: "error"*/

let list = [a, b, c, d]
foo(a, b, c)

let [a, b, c, d] = list;
function foo(a, b, c, d) {
}
```
47 changes: 47 additions & 0 deletions lib/rules/no-useless-rest-spread.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/**
* @fileoverview Rule to disallow unnecessary spread operators.
* @author Toru Nagashima
*/

"use strict"

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------

module.exports = {
meta: {
docs: {
description: "Disallow unnecessary spread operators.",
category: "Stylistic Issues",
recommended: false,
},
schema: [],
},

create: function(context) {
return {
SpreadElement: function(node) {
if (node.argument.type === "ArrayExpression") {
context.report({
node: node,
message: "Unexpected a spread operator.",
})
}
},

RestElement: function(node) {
if (node.argument.type === "ArrayPattern") {
context.report({
node: node,
message: "Unexpected a rest operator.",
})
}
},
}
},
}
35 changes: 35 additions & 0 deletions tests/lib/rules/no-useless-rest-spread.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* @fileoverview Tests for no-useless-rest-spread rule.
* @author Toru Nagashima
*/
"use strict"

//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------

var rule = require("../../../lib/rules/no-useless-rest-spread")
var RuleTester = require("eslint").RuleTester

//------------------------------------------------------------------------------
// Tests
//------------------------------------------------------------------------------

var ruleTester = new RuleTester()

ruleTester.run("no-useless-rest-spread", rule, {
valid: [
{code: "let list = [...a, ...b]", env: {es6: true}},
{code: "foo(...a, ...b)", env: {es6: true}},
{code: "let [a, b, c, ...d] = obj", env: {es6: true}},
{code: "function foo(a, b, c, ...d) {}", env: {es6: true}},
],
invalid: [
{code: "let list = [...[x, y, x], ...b]", env: {es6: true}, errors: ["Unexpected a spread operator."]},
{code: "foo(...a, ...[x, y, x])", env: {es6: true}, errors: ["Unexpected a spread operator."]},
{code: "let [a, ...[b, c, ...d]] = obj", env: {es6: true}, errors: ["Unexpected a rest operator."]},

// Acorn cannot parse this
// {code: "function foo(a, ...[b, c, ...d]) {}", env: {es6: true}, errors: ["Unexpected a rest operator."]},
],
})

0 comments on commit 44a2c14

Please sign in to comment.