From 64895185bde5233223648bcaf46f8deb72c9fb55 Mon Sep 17 00:00:00 2001 From: Teddy Katz Date: Wed, 27 Feb 2019 20:39:26 -0500 Subject: [PATCH] Fix: no-extra-parens crash when code is "((let))" (#11444) This issue was detected by the fuzzer in https://travis-ci.org/eslint/eslint/jobs/498031437. --- lib/rules/no-extra-parens.js | 8 +++++++- tests/lib/rules/no-extra-parens.js | 15 ++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/rules/no-extra-parens.js b/lib/rules/no-extra-parens.js index 3a21b69580b..400ce0c7613 100644 --- a/lib/rules/no-extra-parens.js +++ b/lib/rules/no-extra-parens.js @@ -471,6 +471,7 @@ module.exports = { const firstToken = isParenthesised(node) ? sourceCode.getTokenBefore(node) : sourceCode.getFirstToken(node); const secondToken = sourceCode.getTokenAfter(firstToken, astUtils.isNotOpeningParenToken); const thirdToken = secondToken ? sourceCode.getTokenAfter(secondToken) : null; + const tokenAfterClosingParens = secondToken ? sourceCode.getTokenAfter(secondToken, astUtils.isNotClosingParenToken) : null; if ( astUtils.isOpeningParenToken(firstToken) && @@ -479,7 +480,12 @@ module.exports = { secondToken.type === "Keyword" && ( secondToken.value === "function" || secondToken.value === "class" || - secondToken.value === "let" && astUtils.isOpeningBracketToken(sourceCode.getTokenAfter(secondToken, astUtils.isNotClosingParenToken)) + secondToken.value === "let" && + tokenAfterClosingParens && + ( + astUtils.isOpeningBracketToken(tokenAfterClosingParens) || + tokenAfterClosingParens.type === "Identifier" + ) ) || secondToken && secondToken.type === "Identifier" && secondToken.value === "async" && thirdToken && thirdToken.type === "Keyword" && thirdToken.value === "function" ) diff --git a/tests/lib/rules/no-extra-parens.js b/tests/lib/rules/no-extra-parens.js index b3481d06ab3..366a6c39bf2 100644 --- a/tests/lib/rules/no-extra-parens.js +++ b/tests/lib/rules/no-extra-parens.js @@ -452,6 +452,7 @@ ruleTester.run("no-extra-parens", rule, { "({}) ? foo() : bar()", "({}) + foo", "(function(){}) + foo", + "(let)\nfoo", "(let[foo]) = 1", // setting the 'foo' property of the 'let' variable to 1 { code: "((function(){}).foo.bar)();", @@ -1092,6 +1093,18 @@ ruleTester.run("no-extra-parens", rule, { "Identifier", 1 ), - invalid("for (a in (b, c));", "for (a in b, c);", "SequenceExpression", null) + invalid("for (a in (b, c));", "for (a in b, c);", "SequenceExpression", null), + invalid( + "(let)", + "let", + "Identifier", + 1 + ), + invalid( + "((let))", + "(let)", + "Identifier", + 1 + ) ] });