Skip to content

Commit 791f32b

Browse files
not-an-aardvarkbtmills
authored andcommitted
Fix: brace-style false positive for keyword method names (fixes #7974) (#7980)
1 parent d7a0add commit 791f32b

File tree

2 files changed

+64
-16
lines changed

2 files changed

+64
-16
lines changed

lib/rules/brace-style.js

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ module.exports = {
7878
const tokenBeforeOpeningCurly = sourceCode.getTokenBefore(openingCurly);
7979
const tokenAfterOpeningCurly = sourceCode.getTokenAfter(openingCurly);
8080
const tokenBeforeClosingCurly = sourceCode.getTokenBefore(closingCurly);
81-
const tokenAfterClosingCurly = sourceCode.getTokenAfter(closingCurly);
8281
const singleLineException = params.allowSingleLine && astUtils.isTokenOnSameLine(openingCurly, closingCurly);
8382

8483
if (style !== "allman" && !astUtils.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurly)) {
@@ -112,23 +111,30 @@ module.exports = {
112111
fix: fixer => fixer.insertTextBefore(closingCurly, "\n")
113112
});
114113
}
114+
}
115115

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

125-
if (style !== "1tbs" && astUtils.isTokenOnSameLine(closingCurly, tokenAfterClosingCurly)) {
126-
context.report({
127-
node: closingCurly,
128-
message: CLOSE_MESSAGE_STROUSTRUP_ALLMAN,
129-
fix: fixer => fixer.insertTextAfter(closingCurly, "\n")
130-
});
131-
}
124+
if (style === "1tbs" && !astUtils.isTokenOnSameLine(curlyToken, keywordToken)) {
125+
context.report({
126+
node: curlyToken,
127+
message: CLOSE_MESSAGE,
128+
fix: removeNewlineBetween(curlyToken, keywordToken)
129+
});
130+
}
131+
132+
if (style !== "1tbs" && astUtils.isTokenOnSameLine(curlyToken, keywordToken)) {
133+
context.report({
134+
node: curlyToken,
135+
message: CLOSE_MESSAGE_STROUSTRUP_ALLMAN,
136+
fix: fixer => fixer.insertTextAfter(curlyToken, "\n")
137+
});
132138
}
133139
}
134140

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

156162
validateCurlyPair(openingCurly, closingCurly);
163+
},
164+
IfStatement(node) {
165+
if (node.consequent.type === "BlockStatement" && node.alternate) {
166+
167+
// Handle the keyword after the `if` block (before `else`)
168+
validateCurlyBeforeKeyword(sourceCode.getLastToken(node.consequent));
169+
}
170+
},
171+
TryStatement(node) {
172+
173+
// Handle the keyword after the `try` block (before `catch` or `finally`)
174+
validateCurlyBeforeKeyword(sourceCode.getLastToken(node.block));
175+
176+
if (node.handler && node.finalizer) {
177+
178+
// Handle the keyword after the `catch` block (before `finally`)
179+
validateCurlyBeforeKeyword(sourceCode.getLastToken(node.handler.body));
180+
}
157181
}
158182
};
159183
}

tests/lib/rules/brace-style.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,30 @@ ruleTester.run("brace-style", rule, {
170170
{
171171
}
172172
}
173+
`,
174+
175+
// https://github.com/eslint/eslint/issues/7974
176+
`
177+
class Ball {
178+
throw() {}
179+
catch() {}
180+
}
181+
`,
182+
`
183+
({
184+
and() {},
185+
finally() {}
186+
})
187+
`,
188+
`
189+
(class {
190+
or() {}
191+
else() {}
192+
})
193+
`,
194+
`
195+
if (foo) bar = function() {}
196+
else baz()
173197
`
174198
],
175199

0 commit comments

Comments
 (0)