Skip to content

Commit 12da503

Browse files
committedOct 23, 2022
fix(require-returns-check): allow implicit-return finally if other try-catch branches returning; fixes #926
Also: - fix(`require-returns-check`): finally-only returns to be treated as returns
1 parent e247d67 commit 12da503

File tree

3 files changed

+74
-37
lines changed

3 files changed

+74
-37
lines changed
 

‎README.md

+23-12
Original file line numberDiff line numberDiff line change
@@ -17568,18 +17568,6 @@ function quux () {
1756817568
}
1756917569
// Message: JSDoc @returns declaration present but return expression not available in function.
1757017570

17571-
/**
17572-
* @returns {true}
17573-
*/
17574-
function quux () {
17575-
try {
17576-
} catch (error) {
17577-
} finally {
17578-
return true;
17579-
}
17580-
}
17581-
// Message: JSDoc @returns declaration present but return expression not available in function.
17582-
1758317571
/**
1758417572
* @returns {true}
1758517573
*/
@@ -18130,6 +18118,29 @@ function parseSipHeaders(logPrefix, sipMessage, headers) {
1813018118
return {};
1813118119
}
1813218120
}
18121+
18122+
/**
18123+
* @returns {true}
18124+
*/
18125+
function quux () {
18126+
try {
18127+
} catch (error) {
18128+
} finally {
18129+
return true;
18130+
}
18131+
}
18132+
18133+
/** Returns true.
18134+
*
18135+
* @returns {boolean} true
18136+
*/
18137+
function getTrue() {
18138+
try {
18139+
return true;
18140+
} finally {
18141+
console.log('returning...');
18142+
}
18143+
}
1813318144
````
1813418145

1813518146

‎src/utils/hasReturnValue.js

+22-5
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,28 @@ const allBrancheshaveReturnValues = (node, promFilter) => {
162162
}
163163

164164
case 'TryStatement': {
165-
return allBrancheshaveReturnValues(node.block, promFilter) &&
166-
(!node.handler ||
167-
allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&
168-
(!node.finalizer ||
169-
allBrancheshaveReturnValues(node.finalizer, promFilter));
165+
// If `finally` returns, all return
166+
return node.finalizer && allBrancheshaveReturnValues(node.finalizer, promFilter) ||
167+
// Return in `try`/`catch` may still occur despite `finally`
168+
allBrancheshaveReturnValues(node.block, promFilter) &&
169+
(!node.handler ||
170+
allBrancheshaveReturnValues(node.handler && node.handler.body, promFilter)) &&
171+
(!node.finalizer || (() => {
172+
try {
173+
hasReturnValue(node.finalizer, true, promFilter);
174+
} catch (error) {
175+
// istanbul ignore else
176+
if (error.message === 'Null return') {
177+
return false;
178+
}
179+
180+
// istanbul ignore next
181+
throw error;
182+
}
183+
184+
// As long as not an explicit empty return, then return true
185+
return true;
186+
})());
170187
}
171188

172189
case 'SwitchStatement': {

‎test/rules/assertions/requireReturnsCheck.js

+29-20
Original file line numberDiff line numberDiff line change
@@ -569,26 +569,6 @@ export default {
569569
},
570570
],
571571
},
572-
{
573-
code: `
574-
/**
575-
* @returns {true}
576-
*/
577-
function quux () {
578-
try {
579-
} catch (error) {
580-
} finally {
581-
return true;
582-
}
583-
}
584-
`,
585-
errors: [
586-
{
587-
line: 2,
588-
message: 'JSDoc @returns declaration present but return expression not available in function.',
589-
},
590-
],
591-
},
592572
{
593573
code: `
594574
/**
@@ -1417,5 +1397,34 @@ export default {
14171397
}
14181398
`,
14191399
},
1400+
{
1401+
code: `
1402+
/**
1403+
* @returns {true}
1404+
*/
1405+
function quux () {
1406+
try {
1407+
} catch (error) {
1408+
} finally {
1409+
return true;
1410+
}
1411+
}
1412+
`,
1413+
},
1414+
{
1415+
code: `
1416+
/** Returns true.
1417+
*
1418+
* @returns {boolean} true
1419+
*/
1420+
function getTrue() {
1421+
try {
1422+
return true;
1423+
} finally {
1424+
console.log('returning...');
1425+
}
1426+
}
1427+
`,
1428+
},
14201429
],
14211430
};

0 commit comments

Comments
 (0)
Please sign in to comment.