diff --git a/lib/rules/no-self-assign.js b/lib/rules/no-self-assign.js index 79fb50770ef..dc8bf90147b 100644 --- a/lib/rules/no-self-assign.js +++ b/lib/rules/no-self-assign.js @@ -94,9 +94,19 @@ function eachSelfAssignment(left, right, props, report) { const end = Math.min(left.elements.length, right.elements.length); for (let i = 0; i < end; ++i) { + const leftElement = left.elements[i]; const rightElement = right.elements[i]; - eachSelfAssignment(left.elements[i], rightElement, props, report); + // Avoid cases such as [...a] = [...a, 1] + if ( + leftElement && + leftElement.type === "RestElement" && + i < right.elements.length - 1 + ) { + break; + } + + eachSelfAssignment(leftElement, rightElement, props, report); // After a spread element, those indices are unknown. if (rightElement && rightElement.type === "SpreadElement") { diff --git a/tests/lib/rules/no-self-assign.js b/tests/lib/rules/no-self-assign.js index a344e808422..fbf52dcba0e 100644 --- a/tests/lib/rules/no-self-assign.js +++ b/tests/lib/rules/no-self-assign.js @@ -32,6 +32,8 @@ ruleTester.run("no-self-assign", rule, { { code: "[a, b] = [b, a]", parserOptions: { ecmaVersion: 6 } }, { code: "[a,, b] = [, b, a]", parserOptions: { ecmaVersion: 6 } }, { code: "[x, a] = [...x, a]", parserOptions: { ecmaVersion: 6 } }, + { code: "[...a] = [...a, 1]", parserOptions: { ecmaVersion: 6 } }, + { code: "[a, ...b] = [0, ...b, 1]", parserOptions: { ecmaVersion: 6 } }, { code: "[a, b] = {a, b}", parserOptions: { ecmaVersion: 6 } }, { code: "({a} = a)", parserOptions: { ecmaVersion: 6 } }, { code: "({a = 1} = {a})", parserOptions: { ecmaVersion: 6 } },