From 9340fed9d874d4f3c0ea22b6d4c0ad5254fa5f02 Mon Sep 17 00:00:00 2001 From: Brett Zamir Date: Thu, 19 Sep 2024 07:10:53 +0800 Subject: [PATCH] fix(`require-returns-check`): allow infinite for loops to have only one branch to return; fixes #1315 --- docs/rules/require-returns-check.md | 12 ++++++++++++ src/utils/hasReturnValue.js | 7 ++++++- test/rules/assertions/requireReturnsCheck.js | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/rules/require-returns-check.md b/docs/rules/require-returns-check.md index 2ff2b6c1..fab817d6 100644 --- a/docs/rules/require-returns-check.md +++ b/docs/rules/require-returns-check.md @@ -992,5 +992,17 @@ function foo() { } } } + +/** + * @returns {number} + */ +function foo() { + for (;;) { + const n = Math.random(); + if (n < 0.5) { + return n; + } + } +} ```` diff --git a/src/utils/hasReturnValue.js b/src/utils/hasReturnValue.js index 1809cabc..a481ee17 100644 --- a/src/utils/hasReturnValue.js +++ b/src/utils/hasReturnValue.js @@ -177,8 +177,13 @@ const allBrancheshaveReturnValues = (node, promFilter) => { } // Fallthrough - case 'LabeledStatement': case 'ForStatement': + if (node.test === null) { + // If this is an infinite loop, we assume only one branch + // is needed to provide a return + return hasReturnValue(node.body, false, promFilter); + } + case 'LabeledStatement': case 'ForInStatement': case 'ForOfStatement': case 'WithStatement': { diff --git a/test/rules/assertions/requireReturnsCheck.js b/test/rules/assertions/requireReturnsCheck.js index 025d6ab1..f9547281 100755 --- a/test/rules/assertions/requireReturnsCheck.js +++ b/test/rules/assertions/requireReturnsCheck.js @@ -1558,5 +1558,20 @@ export default { } `, }, + { + code: ` + /** + * @returns {number} + */ + function foo() { + for (;;) { + const n = Math.random(); + if (n < 0.5) { + return n; + } + } + } + `, + }, ], };