Skip to content

Commit

Permalink
Fix: no-extra-parens false positive with let identifier in for-loop (
Browse files Browse the repository at this point in the history
  • Loading branch information
mdjermanovic committed Jan 15, 2021
1 parent de61f94 commit 292b1c0
Show file tree
Hide file tree
Showing 2 changed files with 191 additions and 0 deletions.
16 changes: 16 additions & 0 deletions lib/rules/no-extra-parens.js
Expand Up @@ -895,6 +895,22 @@ module.exports = {
}

if (node.init) {

if (node.init.type !== "VariableDeclaration") {
const firstToken = sourceCode.getFirstToken(node.init, astUtils.isNotOpeningParenToken);

if (
firstToken.value === "let" &&
astUtils.isOpeningBracketToken(
sourceCode.getTokenAfter(firstToken, astUtils.isNotClosingParenToken)
)
) {

// ForStatement#init expression cannot start with `let[`.
tokensToIgnore.add(firstToken);
}
}

startNewReportsBuffering();

if (hasExcessParens(node.init)) {
Expand Down
175 changes: 175 additions & 0 deletions tests/lib/rules/no-extra-parens.js
Expand Up @@ -599,6 +599,22 @@ ruleTester.run("no-extra-parens", rule, {
options: ["functions"]
},
"(let)[foo]",

// ForStatement#init expression cannot start with `let[`. It would be parsed as a `let` declaration with array pattern, or a syntax error.
"for ((let[a]);;);",
"for ((let)[a];;);",
"for ((let[a] = 1);;);",
"for ((let[a]) = 1;;);",
"for ((let)[a] = 1;;);",
"for ((let[a, b] = foo);;);",
"for ((let[a].b = 1);;);",
"for ((let[a].b) = 1;;);",
"for ((let[a]).b = 1;;);",
"for ((let)[a].b = 1;;);",
"for ((let[a])();;);",
"for ((let)[a]();;);",
"for ((let[a]) + b;;);",

"for ((let) in foo);",
"for ((let[foo]) in bar);",
"for ((let)[foo] in bar);",
Expand Down Expand Up @@ -1880,6 +1896,165 @@ ruleTester.run("no-extra-parens", rule, {
"Identifier",
1
),

// ForStatement#init expression cannot start with `let[`, but it can start with `let` if it isn't followed by `[`
invalid(
"for ((let);;);",
"for (let;;);",
"Identifier",
1
),
invalid(
"for ((let = 1);;);",
"for (let = 1;;);",
"AssignmentExpression",
1
),
invalid(
"for ((let) = 1;;);",
"for (let = 1;;);",
"Identifier",
1
),
invalid(
"for ((let = []);;);",
"for (let = [];;);",
"AssignmentExpression",
1
),
invalid(
"for ((let) = [];;);",
"for (let = [];;);",
"Identifier",
1
),
invalid(
"for ((let());;);",
"for (let();;);",
"CallExpression",
1
),
invalid(
"for ((let([]));;);",
"for (let([]);;);",
"CallExpression",
1
),
invalid(
"for ((let())[a];;);",
"for (let()[a];;);",
"CallExpression",
1
),
invalid(
"for ((let`[]`);;);",
"for (let`[]`;;);",
"TaggedTemplateExpression",
1
),
invalid(
"for ((let.a);;);",
"for (let.a;;);",
"MemberExpression",
1
),
invalid(
"for ((let).a;;);",
"for (let.a;;);",
"Identifier",
1
),
invalid(
"for ((let).a = 1;;);",
"for (let.a = 1;;);",
"Identifier",
1
),
invalid(
"for ((let).a[b];;);",
"for (let.a[b];;);",
"Identifier",
1
),
invalid(
"for ((let.a)[b];;);",
"for (let.a[b];;);",
"MemberExpression",
1
),
invalid(
"for ((let.a[b]);;);",
"for (let.a[b];;);",
"MemberExpression",
1
),
invalid(
"for ((let);[];);",
"for (let;[];);",
"Identifier",
1
),
invalid(
"for (((let[a]));;);",
"for ((let[a]);;);",
"MemberExpression",
1
),
invalid(
"for (((let))[a];;);",
"for ((let)[a];;);",
"Identifier",
1
),
invalid(
"for (((let[a])).b;;);",
"for ((let[a]).b;;);",
"MemberExpression",
1
),
invalid(
"for (((let))[a].b;;);",
"for ((let)[a].b;;);",
"Identifier",
1
),
invalid(
"for (((let)[a]).b;;);",
"for ((let)[a].b;;);",
"MemberExpression",
1
),
invalid(
"for (((let[a]) = b);;);",
"for ((let[a]) = b;;);",
"AssignmentExpression",
1
),
invalid(
"for (((let)[a]) = b;;);",
"for ((let)[a] = b;;);",
"MemberExpression",
1
),
invalid(
"for (((let)[a] = b);;);",
"for ((let)[a] = b;;);",
"AssignmentExpression",
1
),
invalid(
"for ((Let[a]);;);",
"for (Let[a];;);",
"MemberExpression",
1
),
invalid(
"for ((lett)[a];;);",
"for (lett[a];;);",
"Identifier",
1
),

invalid(
"for ((let.foo) in bar);",
"for (let.foo in bar);",
Expand Down

0 comments on commit 292b1c0

Please sign in to comment.