From 7a9f721091571fe3f9f2081372b6a9699c6c1490 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Mon, 1 Jan 2024 17:17:27 +0530 Subject: [PATCH] fix: handle more cases --- lib/rules/no-loop-func.js | 26 ++++++++-------- tests/lib/rules/no-loop-func.js | 53 ++++++++++++++++++++++++++------- 2 files changed, 54 insertions(+), 25 deletions(-) diff --git a/lib/rules/no-loop-func.js b/lib/rules/no-loop-func.js index c7d7b5e51ae..716e027f5c5 100644 --- a/lib/rules/no-loop-func.js +++ b/lib/rules/no-loop-func.js @@ -9,6 +9,15 @@ // Helpers //------------------------------------------------------------------------------ +/** + * Identifies is a node is a FunctionExpression which is part of an IIFE + * @param {ASTNode} node Node to test + * @returns {boolean} True if it's an IIFE + */ +function isIIFE(node) { + return (node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression") && node.parent && node.parent.type === "CallExpression" && node.parent.callee === node; +} + /** * Gets the containing loop node of a specified node. * @@ -47,10 +56,10 @@ function getContainingLoopNode(node) { case "ArrowFunctionExpression": case "FunctionExpression": case "FunctionDeclaration": - - // We don't need to check nested functions. + if (isIIFE(node)) { + break; + } return null; - default: break; } @@ -144,17 +153,6 @@ function isSafe(loopNode, reference) { return Boolean(variable) && variable.references.every(isSafeReference); } -/** - * Identifies is a node is a FunctionExpression which is part of an IIFE - * @param {ASTNode} node Node to test - * @returns {boolean} True if it's an IIFE - */ -function isIIFE(node) { - - // console.log("🚀 ~ isIIFE ~ node:", (node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression") && node.parent && node.parent.type === "CallExpression" && node.parent.callee === node) - return (node.type === "FunctionExpression" || node.type === "ArrowFunctionExpression") && node.parent && node.parent.type === "CallExpression" && node.parent.callee === node; -} - //------------------------------------------------------------------------------ // Rule Definition diff --git a/tests/lib/rules/no-loop-func.js b/tests/lib/rules/no-loop-func.js index be8662fe9c6..f8034610c77 100644 --- a/tests/lib/rules/no-loop-func.js +++ b/tests/lib/rules/no-loop-func.js @@ -206,12 +206,8 @@ ruleTester.run("no-loop-func", rule, { })()); } `, -<<<<<<< HEAD - languageOptions: { ecmaVersion: 6 }, - errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }] -======= + errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }], languageOptions: { ecmaVersion: 6 } ->>>>>>> 70f44c33f (refactor: remove false negatives) } ], @@ -411,8 +407,8 @@ ruleTester.run("no-loop-func", rule, { })()); } `, - languageOptions: { ecmaVersion: 6 }, - errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }] + errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }], + languageOptions: { ecmaVersion: 6 } }, { code: ` @@ -424,8 +420,8 @@ ruleTester.run("no-loop-func", rule, { })()); } `, - languageOptions: { ecmaVersion: 6 }, - errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }] + errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }], + languageOptions: { ecmaVersion: 6 } }, { code: ` @@ -437,8 +433,43 @@ ruleTester.run("no-loop-func", rule, { })()); } `, - languageOptions: { ecmaVersion: 6 }, - errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }] + errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }], + languageOptions: { ecmaVersion: 6 } + }, + { + code: ` + var arr = []; + + for (var i = 0; i < 5; i ++) { + (() => { + arr.push((async () => { + await 1; + return i; + })()); + })(); + } + `, + errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "ArrowFunctionExpression" }], + languageOptions: { ecmaVersion: 2022 } + }, + { + code: ` + var arr = []; + + for (var i = 0; i < 5; i ++) { + (() => { + (function f() { + if (!arr.includes(f)) { + arr.push(f); + } + return i; + })(); + })(); + + } + `, + errors: [{ messageId: "unsafeRefs", data: { varNames: "'i'" }, type: "FunctionExpression" }], + languageOptions: { ecmaVersion: 2022 } } ] });