From 27f0de62e6281c28043be38ef051818c9edc15cd Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Tue, 6 Oct 2020 15:11:43 +0200 Subject: [PATCH] Fix: account for linebreaks before postfix `++`/`--` in no-extra-parens (#13731) --- lib/rules/no-extra-parens.js | 17 ++++++++++++++++- tests/lib/rules/no-extra-parens.js | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/rules/no-extra-parens.js b/lib/rules/no-extra-parens.js index e9d394c616a..7afe7625dfc 100644 --- a/lib/rules/no-extra-parens.js +++ b/lib/rules/no-extra-parens.js @@ -1109,7 +1109,22 @@ module.exports = { }, UnaryExpression: checkArgumentWithPrecedence, - UpdateExpression: checkArgumentWithPrecedence, + UpdateExpression(node) { + if (node.prefix) { + checkArgumentWithPrecedence(node); + } else { + const { argument } = node; + const operatorToken = sourceCode.getLastToken(node); + + if (argument.loc.end.line === operatorToken.loc.start.line) { + checkArgumentWithPrecedence(node); + } else { + if (hasDoubleExcessParens(argument)) { + report(argument); + } + } + } + }, AwaitExpression: checkArgumentWithPrecedence, VariableDeclarator(node) { diff --git a/tests/lib/rules/no-extra-parens.js b/tests/lib/rules/no-extra-parens.js index befdcda5a1c..c0d0387ec74 100644 --- a/tests/lib/rules/no-extra-parens.js +++ b/tests/lib/rules/no-extra-parens.js @@ -363,6 +363,15 @@ ruleTester.run("no-extra-parens", rule, { "}" ].join("\n"), + // linebreaks before postfix update operators are not allowed + "(a\n)++", + "(a\n)--", + "(a\n\n)++", + "(a.b\n)--", + "(a\n.b\n)++", + "(a[\nb\n]\n)--", + "(a[b]\n\n)++", + // async/await "async function a() { await (a + b) }", "async function a() { await (a + await b) }", @@ -755,6 +764,18 @@ ruleTester.run("no-extra-parens", rule, { invalid("+((bar-foo))", "+(bar-foo)", "BinaryExpression"), invalid("++(foo)", "++foo", "Identifier"), invalid("--(foo)", "--foo", "Identifier"), + invalid("++\n(foo)", "++\nfoo", "Identifier"), + invalid("--\n(foo)", "--\nfoo", "Identifier"), + invalid("++(\nfoo)", "++\nfoo", "Identifier"), + invalid("--(\nfoo)", "--\nfoo", "Identifier"), + invalid("(foo)++", "foo++", "Identifier"), + invalid("(foo)--", "foo--", "Identifier"), + invalid("((foo)\n)++", "(foo\n)++", "Identifier"), + invalid("((foo\n))--", "(foo\n)--", "Identifier"), + invalid("((foo\n)\n)++", "(foo\n\n)++", "Identifier"), + invalid("(a\n.b)--", "a\n.b--", "MemberExpression"), + invalid("(a.\nb)++", "a.\nb++", "MemberExpression"), + invalid("(a\n[\nb\n])--", "a\n[\nb\n]--", "MemberExpression"), invalid("(a || b) ? c : d", "a || b ? c : d", "LogicalExpression"), invalid("a ? (b = c) : d", "a ? b = c : d", "AssignmentExpression"), invalid("a ? b : (c = d)", "a ? b : c = d", "AssignmentExpression"),