Skip to content

Commit

Permalink
Fix: multiline destructure errors (fixes #8729)
Browse files Browse the repository at this point in the history
  • Loading branch information
VictorHom committed Jun 17, 2017
1 parent 5b1f5d7 commit 204aae8
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 4 deletions.
39 changes: 37 additions & 2 deletions lib/rules/indent.js
Expand Up @@ -658,7 +658,6 @@ module.exports = {
while (astUtils.isOpeningParenToken(token) && token !== startToken) {
token = sourceCode.getTokenBefore(token);
}

return sourceCode.getTokenAfter(token);
}

Expand All @@ -675,7 +674,6 @@ module.exports = {
if (offset === "first" && elements.length && !elements[0]) {
return;
}

elements.forEach((element, index) => {
if (offset === "off") {
offsets.ignoreToken(getFirstToken(element));
Expand Down Expand Up @@ -947,6 +945,26 @@ module.exports = {
return !node || node.range[0] === token.range[0];
}

/**
* Check whether the given tokens are pairs of "}" and "{", in reverse
* @param {Token} tokenBeforeOperator is "[".
* @param {Token} tokenAfterOperator is "]".
* @returns {boolean} `true` if the token is the first token of a statement.
*/
function isReversedPairBrace(tokenBeforeOperator, tokenAfterOperator) {
return astUtils.isClosingBraceToken(tokenBeforeOperator) && astUtils.isOpeningBraceToken(tokenAfterOperator);
}

/**
* Check whether the given tokens are pairs of "]" and "[", in reverse
* @param {Token} tokenBeforeOperator is "{".
* @param {Token} tokenAfterOperator is "{".
* @returns {boolean} `true` if the token is the first token of a statement.
*/
function isReversedPairBracket(tokenBeforeOperator, tokenAfterOperator) {
return astUtils.isClosingBracketToken(tokenBeforeOperator) && astUtils.isOpeningBracketToken(tokenAfterOperator);
}

return {
ArrayExpression: addArrayOrObjectIndent,
ArrayPattern: addArrayOrObjectIndent,
Expand Down Expand Up @@ -1237,8 +1255,25 @@ module.exports = {
VariableDeclarator(node) {
if (node.init) {
const equalOperator = sourceCode.getTokenBefore(node.init, astUtils.isNotOpeningParenToken);
const tokenBeforeOperator = sourceCode.getTokenBefore(equalOperator);
const tokenAfterOperator = sourceCode.getTokenAfter(equalOperator);

/**
* For object and array destructuring that is used across lines
* align the right side elements of the object or array with the equal sign
*/
if (isReversedPairBrace(tokenBeforeOperator, tokenAfterOperator) ||
isReversedPairBracket(tokenBeforeOperator, tokenAfterOperator)) {
const closingToken = sourceCode.getLastToken(node);
const inBetweenTokens = sourceCode.getTokensBetween(equalOperator, closingToken);

inBetweenTokens.forEach(token => {
offsets.matchIndentOf(equalOperator, token);
offsets.ignoreToken(token);
});
offsets.matchIndentOf(tokenBeforeOperator, closingToken);
offsets.ignoreToken(closingToken);
}
offsets.ignoreToken(equalOperator);
offsets.ignoreToken(tokenAfterOperator);
offsets.matchIndentOf(equalOperator, tokenAfterOperator);
Expand Down
24 changes: 22 additions & 2 deletions tests/lib/rules/indent.js
Expand Up @@ -2026,7 +2026,18 @@ ruleTester.run("indent", rule, {
`,
options: [2]
},
// VICTOR passes
{
code: unIndent`
const {
a
}
=
{
a: 1
}
`,
options: [2]
},
{
code: unIndent`
const {
Expand All @@ -2037,7 +2048,6 @@ ruleTester.run("indent", rule, {
`,
options: [2]
},
// VICTOR fails
{
code: unIndent`
const {
Expand All @@ -2048,6 +2058,16 @@ ruleTester.run("indent", rule, {
`,
options: [2]
},
{
code: unIndent`
const [
a
] = [
1
]
`,
options: [2]
},
{

// https://github.com/eslint/eslint/issues/7233
Expand Down

0 comments on commit 204aae8

Please sign in to comment.