Skip to content

Commit

Permalink
Fix: brace-style false positive for keyword method names (fixes #7974) (
Browse files Browse the repository at this point in the history
  • Loading branch information
not-an-aardvark authored and btmills committed Jan 25, 2017
1 parent d7a0add commit 791f32b
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 16 deletions.
56 changes: 40 additions & 16 deletions lib/rules/brace-style.js
Expand Up @@ -78,7 +78,6 @@ module.exports = {
const tokenBeforeOpeningCurly = sourceCode.getTokenBefore(openingCurly);
const tokenAfterOpeningCurly = sourceCode.getTokenAfter(openingCurly);
const tokenBeforeClosingCurly = sourceCode.getTokenBefore(closingCurly);
const tokenAfterClosingCurly = sourceCode.getTokenAfter(closingCurly);
const singleLineException = params.allowSingleLine && astUtils.isTokenOnSameLine(openingCurly, closingCurly);

if (style !== "allman" && !astUtils.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurly)) {
Expand Down Expand Up @@ -112,23 +111,30 @@ module.exports = {
fix: fixer => fixer.insertTextBefore(closingCurly, "\n")
});
}
}

if (tokenAfterClosingCurly && tokenAfterClosingCurly.type === "Keyword" && new Set(["else", "catch", "finally"]).has(tokenAfterClosingCurly.value)) {
if (style === "1tbs" && !astUtils.isTokenOnSameLine(closingCurly, tokenAfterClosingCurly)) {
context.report({
node: closingCurly,
message: CLOSE_MESSAGE,
fix: removeNewlineBetween(closingCurly, tokenAfterClosingCurly)
});
}
/**
* Validates the location of a token that appears before a keyword (e.g. a newline before `else`)
* @param {Token} curlyToken The closing curly token. This is assumed to precede a keyword token (such as `else` or `finally`).
* @returns {void}
*/
function validateCurlyBeforeKeyword(curlyToken) {
const keywordToken = sourceCode.getTokenAfter(curlyToken);

if (style !== "1tbs" && astUtils.isTokenOnSameLine(closingCurly, tokenAfterClosingCurly)) {
context.report({
node: closingCurly,
message: CLOSE_MESSAGE_STROUSTRUP_ALLMAN,
fix: fixer => fixer.insertTextAfter(closingCurly, "\n")
});
}
if (style === "1tbs" && !astUtils.isTokenOnSameLine(curlyToken, keywordToken)) {
context.report({
node: curlyToken,
message: CLOSE_MESSAGE,
fix: removeNewlineBetween(curlyToken, keywordToken)
});
}

if (style !== "1tbs" && astUtils.isTokenOnSameLine(curlyToken, keywordToken)) {
context.report({
node: curlyToken,
message: CLOSE_MESSAGE_STROUSTRUP_ALLMAN,
fix: fixer => fixer.insertTextAfter(curlyToken, "\n")
});
}
}

Expand All @@ -154,6 +160,24 @@ module.exports = {
const openingCurly = sourceCode.getTokenBefore(node.cases.length ? node.cases[0] : closingCurly);

validateCurlyPair(openingCurly, closingCurly);
},
IfStatement(node) {
if (node.consequent.type === "BlockStatement" && node.alternate) {

// Handle the keyword after the `if` block (before `else`)
validateCurlyBeforeKeyword(sourceCode.getLastToken(node.consequent));
}
},
TryStatement(node) {

// Handle the keyword after the `try` block (before `catch` or `finally`)
validateCurlyBeforeKeyword(sourceCode.getLastToken(node.block));

if (node.handler && node.finalizer) {

// Handle the keyword after the `catch` block (before `finally`)
validateCurlyBeforeKeyword(sourceCode.getLastToken(node.handler.body));
}
}
};
}
Expand Down
24 changes: 24 additions & 0 deletions tests/lib/rules/brace-style.js
Expand Up @@ -170,6 +170,30 @@ ruleTester.run("brace-style", rule, {
{
}
}
`,

// https://github.com/eslint/eslint/issues/7974
`
class Ball {
throw() {}
catch() {}
}
`,
`
({
and() {},
finally() {}
})
`,
`
(class {
or() {}
else() {}
})
`,
`
if (foo) bar = function() {}
else baz()
`
],

Expand Down

0 comments on commit 791f32b

Please sign in to comment.