Skip to content

Commit

Permalink
Fix: no-dupe-args to work with destructuring (fixes #2148)
Browse files Browse the repository at this point in the history
  • Loading branch information
nzakas committed Mar 27, 2015
1 parent 0653cf7 commit f9b0724
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 8 deletions.
44 changes: 37 additions & 7 deletions lib/rules/no-dupe-args.js
Expand Up @@ -23,15 +23,45 @@ module.exports = function(context) {
* @private
*/
function checkParams(node) {
var dups = {};
var params = {},
dups = {};


/**
* Marks a given param as either seen or duplicated.
* @param {string} name The name of the param to mark.
* @returns {void}
* @private
*/
function markParam(name) {
if (params.hasOwnProperty(name)) {
dups[name] = 1;
} else {
params[name] = 1;
}
}

// loop through and find each duplicate param
node.params.map(function(param) {
return param.name;
}).forEach(function(param, i, params) {
var lastPos = params.lastIndexOf(param);
if (i !== lastPos) {
dups[param] = [i, lastPos];
node.params.forEach(function(param) {

switch (param.type) {
case "Identifier":
markParam(param.name);
break;

case "ObjectPattern":
param.properties.forEach(function(property) {
markParam(property.key.name);
});
break;

case "ArrayPattern":
param.elements.forEach(function(element) {
markParam(element.name);
});
break;

// no default
}
});

Expand Down
6 changes: 5 additions & 1 deletion tests/lib/rules/no-dupe-args.js
Expand Up @@ -21,10 +21,14 @@ var eslintTester = new ESLintTester(eslint);
eslintTester.addRuleTest("lib/rules/no-dupe-args", {
valid: [
"function a(a, b, c){}",
"var a = function(a, b, c){}"
"var a = function(a, b, c){}",
{ code: "function a({a, b}, {c, d}){}", ecmaFeatures: { destructuring: true } }
],
invalid: [
{ code: "function a(a, b, b) {}", errors: [{ message: "Duplicate param 'b'." }] },
{ code: "function a({a, b}, b) {}", ecmaFeatures: { destructuring: true }, errors: [{ message: "Duplicate param 'b'." }] },
{ code: "function a([a, b], b) {}", ecmaFeatures: { destructuring: true }, errors: [{ message: "Duplicate param 'b'." }] },
{ code: "function a([a, b], {b}) {}", ecmaFeatures: { destructuring: true }, errors: [{ message: "Duplicate param 'b'." }] },
{ code: "function a(a, a, a) {}", errors: [{ message: "Duplicate param 'a'." }] },
{ code: "function a(a, b, a) {}", errors: [{ message: "Duplicate param 'a'." }]},
{ code: "function a(a, b, a, b) {}", errors: [{ message: "Duplicate param 'a'." }, { message: "Duplicate param 'b'." }]},
Expand Down

0 comments on commit f9b0724

Please sign in to comment.