diff --git a/packages/eslint-plugin/src/rules/no-extra-parens.ts b/packages/eslint-plugin/src/rules/no-extra-parens.ts index 42fd53d3310..10989ad47e8 100644 --- a/packages/eslint-plugin/src/rules/no-extra-parens.ts +++ b/packages/eslint-plugin/src/rules/no-extra-parens.ts @@ -164,23 +164,7 @@ export default util.createRule({ return rules.ConditionalExpression(node); }, // DoWhileStatement - 'ForInStatement, ForOfStatement'( - 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); - }, + // 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)) { @@ -256,6 +240,56 @@ export default util.createRule({ } }, }; + if (rules.ForInStatement && rules.ForOfStatement) { + overrides.ForInStatement = function (node): void { + 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): void { + 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, + ): void { + 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 49e48541f87..425956e1f25 100644 --- a/packages/eslint-plugin/typings/eslint-rules.d.ts +++ b/packages/eslint-plugin/typings/eslint-rules.d.ts @@ -520,9 +520,13 @@ 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; 'ForStatement > *.init:exit'(node: TSESTree.Node): void; IfStatement(node: TSESTree.IfStatement): void;