From 5aefb8351c1f5df24a02e26c5247251428e4fe65 Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Tue, 2 Feb 2021 07:53:37 +0000 Subject: [PATCH 1/4] fix(eslint-plugin): split for rules in no-extra-parens --- .../src/rules/no-extra-parens.ts | 25 ++++++++++++++----- .../eslint-plugin/typings/eslint-rules.d.ts | 5 ++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-extra-parens.ts b/packages/eslint-plugin/src/rules/no-extra-parens.ts index 42fd53d3310..d7775bc5d97 100644 --- a/packages/eslint-plugin/src/rules/no-extra-parens.ts +++ b/packages/eslint-plugin/src/rules/no-extra-parens.ts @@ -164,14 +164,27 @@ export default util.createRule({ return rules.ConditionalExpression(node); }, // DoWhileStatement - 'ForInStatement, ForOfStatement'( - node: TSESTree.ForInStatement | TSESTree.ForOfStatement, - ) { + ForInStatement(node) { + if (util.isTypeAssertion(node.right)) { + // makes the rule skip checking of the right + return rules.ForInStatement({ + ...node, + type: AST_NODE_TYPES.ForInStatement, + right: { + ...node.right, + type: AST_NODE_TYPES.SequenceExpression as any, + }, + }); + } + + return rules.ForInStatement(node); + }, + ForOfStatement(node) { if (util.isTypeAssertion(node.right)) { // makes the rule skip checking of the right - return rules['ForInStatement, ForOfStatement']({ + return rules.ForOfStatement({ ...node, - type: AST_NODE_TYPES.ForOfStatement as any, + type: AST_NODE_TYPES.ForOfStatement, right: { ...node.right, type: AST_NODE_TYPES.SequenceExpression as any, @@ -179,7 +192,7 @@ export default util.createRule({ }); } - return rules['ForInStatement, ForOfStatement'](node); + return rules.ForOfStatement(node); }, ForStatement(node) { // make the rule skip the piece by removing it entirely diff --git a/packages/eslint-plugin/typings/eslint-rules.d.ts b/packages/eslint-plugin/typings/eslint-rules.d.ts index 49e48541f87..f1b08b54ed2 100644 --- a/packages/eslint-plugin/typings/eslint-rules.d.ts +++ b/packages/eslint-plugin/typings/eslint-rules.d.ts @@ -520,9 +520,8 @@ declare module 'eslint/lib/rules/no-extra-parens' { ClassExpression(node: TSESTree.ClassExpression): void; ConditionalExpression(node: TSESTree.ConditionalExpression): void; DoWhileStatement(node: TSESTree.DoWhileStatement): void; - 'ForInStatement, ForOfStatement'( - node: TSESTree.ForInStatement | TSESTree.ForOfStatement, - ): void; + ForInStatement(node: TSESTree.ForInStatement): void; + ForOfStatement(node: TSESTree.ForOfStatement): void; ForStatement(node: TSESTree.ForStatement): void; 'ForStatement > *.init:exit'(node: TSESTree.Node): void; IfStatement(node: TSESTree.IfStatement): void; From 70ba79417c5ae7c8703da9894584b7c52d48f35d Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Tue, 2 Feb 2021 09:11:26 +0000 Subject: [PATCH 2/4] fix(eslint-plugin): ensure no-extra-parens works on eslint 7.18 and 7.19 --- .../src/rules/no-extra-parens.ts | 82 ++++++++++++------- .../eslint-plugin/typings/eslint-rules.d.ts | 5 ++ 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-extra-parens.ts b/packages/eslint-plugin/src/rules/no-extra-parens.ts index d7775bc5d97..d70620dcfe5 100644 --- a/packages/eslint-plugin/src/rules/no-extra-parens.ts +++ b/packages/eslint-plugin/src/rules/no-extra-parens.ts @@ -1,6 +1,7 @@ // any is required to work around manipulating the AST in weird ways /* eslint-disable @typescript-eslint/no-explicit-any */ +import semver from 'semver'; import { AST_NODE_TYPES, TSESTree, @@ -164,36 +165,7 @@ export default util.createRule({ return rules.ConditionalExpression(node); }, // DoWhileStatement - ForInStatement(node) { - if (util.isTypeAssertion(node.right)) { - // makes the rule skip checking of the right - return rules.ForInStatement({ - ...node, - type: AST_NODE_TYPES.ForInStatement, - right: { - ...node.right, - type: AST_NODE_TYPES.SequenceExpression as any, - }, - }); - } - - return rules.ForInStatement(node); - }, - ForOfStatement(node) { - if (util.isTypeAssertion(node.right)) { - // makes the rule skip checking of the right - return rules.ForOfStatement({ - ...node, - type: AST_NODE_TYPES.ForOfStatement, - right: { - ...node.right, - type: AST_NODE_TYPES.SequenceExpression as any, - }, - }); - } - - return rules.ForOfStatement(node); - }, + // ForIn and ForOf are guarded by eslint version ForStatement(node) { // make the rule skip the piece by removing it entirely if (node.init && util.isTypeAssertion(node.init)) { @@ -269,6 +241,56 @@ export default util.createRule({ } }, }; + if (semver.satisfies(TSESLint.ESLint.version, '>=7.19.0')) { + overrides.ForInStatement = function (node) { + if (util.isTypeAssertion(node.right)) { + // makes the rule skip checking of the right + return rules.ForInStatement({ + ...node, + type: AST_NODE_TYPES.ForInStatement, + right: { + ...node.right, + type: AST_NODE_TYPES.SequenceExpression as any, + }, + }); + } + + return rules.ForInStatement(node); + }; + overrides.ForOfStatement = function (node) { + if (util.isTypeAssertion(node.right)) { + // makes the rule skip checking of the right + return rules.ForOfStatement({ + ...node, + type: AST_NODE_TYPES.ForOfStatement, + right: { + ...node.right, + type: AST_NODE_TYPES.SequenceExpression as any, + }, + }); + } + + return rules.ForOfStatement(node); + }; + } else { + overrides['ForInStatement, ForOfStatement'] = function ( + node: TSESTree.ForInStatement | TSESTree.ForOfStatement, + ) { + if (util.isTypeAssertion(node.right)) { + // makes the rule skip checking of the right + return rules['ForInStatement, ForOfStatement']({ + ...node, + type: AST_NODE_TYPES.ForOfStatement as any, + right: { + ...node.right, + type: AST_NODE_TYPES.SequenceExpression as any, + }, + }); + } + + return rules['ForInStatement, ForOfStatement'](node); + }; + } return Object.assign({}, rules, overrides); }, }); diff --git a/packages/eslint-plugin/typings/eslint-rules.d.ts b/packages/eslint-plugin/typings/eslint-rules.d.ts index f1b08b54ed2..425956e1f25 100644 --- a/packages/eslint-plugin/typings/eslint-rules.d.ts +++ b/packages/eslint-plugin/typings/eslint-rules.d.ts @@ -520,6 +520,11 @@ declare module 'eslint/lib/rules/no-extra-parens' { ClassExpression(node: TSESTree.ClassExpression): void; ConditionalExpression(node: TSESTree.ConditionalExpression): void; DoWhileStatement(node: TSESTree.DoWhileStatement): void; + // eslint < 7.19.0 + 'ForInStatement, ForOfStatement'( + node: TSESTree.ForInStatement | TSESTree.ForOfStatement, + ): void; + // eslint >= 7.19.0 ForInStatement(node: TSESTree.ForInStatement): void; ForOfStatement(node: TSESTree.ForOfStatement): void; ForStatement(node: TSESTree.ForStatement): void; From 25e06c22b14fc83b8f56ecffa72f0b72dbc948c0 Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Tue, 2 Feb 2021 09:54:14 +0000 Subject: [PATCH 3/4] chore: appease eslint --- packages/eslint-plugin/src/rules/no-extra-parens.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-extra-parens.ts b/packages/eslint-plugin/src/rules/no-extra-parens.ts index d70620dcfe5..4eb98a7ce9e 100644 --- a/packages/eslint-plugin/src/rules/no-extra-parens.ts +++ b/packages/eslint-plugin/src/rules/no-extra-parens.ts @@ -242,7 +242,7 @@ export default util.createRule({ }, }; if (semver.satisfies(TSESLint.ESLint.version, '>=7.19.0')) { - overrides.ForInStatement = function (node) { + overrides.ForInStatement = function (node): void { if (util.isTypeAssertion(node.right)) { // makes the rule skip checking of the right return rules.ForInStatement({ @@ -257,7 +257,7 @@ export default util.createRule({ return rules.ForInStatement(node); }; - overrides.ForOfStatement = function (node) { + overrides.ForOfStatement = function (node): void { if (util.isTypeAssertion(node.right)) { // makes the rule skip checking of the right return rules.ForOfStatement({ @@ -275,7 +275,7 @@ export default util.createRule({ } else { overrides['ForInStatement, ForOfStatement'] = function ( node: TSESTree.ForInStatement | TSESTree.ForOfStatement, - ) { + ): void { if (util.isTypeAssertion(node.right)) { // makes the rule skip checking of the right return rules['ForInStatement, ForOfStatement']({ From 2a56d10e6b55a4538dac3215ddfc26cb7ebf995e Mon Sep 17 00:00:00 2001 From: Chris Midgley Date: Tue, 2 Feb 2021 17:42:04 +0000 Subject: [PATCH 4/4] fix: check for presence of new statements instead of semver check --- packages/eslint-plugin/src/rules/no-extra-parens.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-extra-parens.ts b/packages/eslint-plugin/src/rules/no-extra-parens.ts index 4eb98a7ce9e..10989ad47e8 100644 --- a/packages/eslint-plugin/src/rules/no-extra-parens.ts +++ b/packages/eslint-plugin/src/rules/no-extra-parens.ts @@ -1,7 +1,6 @@ // any is required to work around manipulating the AST in weird ways /* eslint-disable @typescript-eslint/no-explicit-any */ -import semver from 'semver'; import { AST_NODE_TYPES, TSESTree, @@ -241,7 +240,7 @@ export default util.createRule({ } }, }; - if (semver.satisfies(TSESLint.ESLint.version, '>=7.19.0')) { + if (rules.ForInStatement && rules.ForOfStatement) { overrides.ForInStatement = function (node): void { if (util.isTypeAssertion(node.right)) { // makes the rule skip checking of the right