Skip to content

Commit

Permalink
Fix a false positive
Browse files Browse the repository at this point in the history
  • Loading branch information
fasttime committed May 1, 2023
1 parent 66b6181 commit cd6cb7b
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
16 changes: 8 additions & 8 deletions lib/rules/no-useless-return.js
Expand Up @@ -82,7 +82,6 @@ module.exports = {

create(context) {
const segmentInfoMap = new WeakMap();
const usedUnreachableSegments = new WeakSet();
const sourceCode = context.getSourceCode();
let scopeInfo = null;

Expand Down Expand Up @@ -152,21 +151,22 @@ module.exports = {
* This behavior would simulate code paths for the case that the return
* statement does not exist.
* @param {CodePathSegment} segment The segment to get return statements.
* @param {Set<CodePathSegment>} usedUnreachableSegments A set of segments that have already been traversed in this call.
* @returns {void}
*/
function markReturnStatementsOnSegmentAsUsed(segment) {
function markReturnStatementsOnSegmentAsUsed(segment, usedUnreachableSegments) {
if (!segment.reachable) {
usedUnreachableSegments.add(segment);
segment.allPrevSegments
.filter(isReturned)
.filter(prevSegment => !usedUnreachableSegments.has(prevSegment))
.forEach(markReturnStatementsOnSegmentAsUsed);
.forEach(prevSegment => markReturnStatementsOnSegmentAsUsed(prevSegment, usedUnreachableSegments));
return;
}

const info = segmentInfoMap.get(segment);

for (const node of info.uselessReturns) {
info.uselessReturns = info.uselessReturns.filter(node => {
if (scopeInfo.traversedTryBlockStatements && scopeInfo.traversedTryBlockStatements.length > 0) {
const returnInitialRange = node.range[0];
const returnFinalRange = node.range[1];
Expand All @@ -182,13 +182,13 @@ module.exports = {
});

if (areBlocksInRange) {
continue;
return true;
}
}

remove(scopeInfo.uselessReturns, node);
}
info.uselessReturns = [];
return false;
});
}

/**
Expand All @@ -207,7 +207,7 @@ module.exports = {
scopeInfo
.codePath
.currentSegments
.forEach(markReturnStatementsOnSegmentAsUsed);
.forEach(segment => markReturnStatementsOnSegmentAsUsed(segment, new Set()));
}

//----------------------------------------------------------------------
Expand Down
13 changes: 13 additions & 0 deletions tests/lib/rules/no-useless-return.js
Expand Up @@ -195,6 +195,19 @@ ruleTester.run("no-useless-return", rule, {
}
console.log(arg);
}
`,

// https://github.com/eslint/eslint/pull/16996#discussion_r1138622844
`
function foo() {
try {
bar();
return;
} finally {
baz();
}
qux();
}
`
],

Expand Down

0 comments on commit cd6cb7b

Please sign in to comment.