Skip to content

Commit

Permalink
Fix constructor-super
Browse files Browse the repository at this point in the history
  • Loading branch information
nzakas committed Mar 18, 2024
1 parent 6495471 commit 63ee6bd
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 12 deletions.
35 changes: 23 additions & 12 deletions lib/rules/constructor-super.js
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,15 @@ module.exports = {
return segment.reachable && segInfoMap[segment.id]?.calledInSomePaths;
}

/**
* Determines if a segment has been seen in the traversal.
* @param {CodePathSegment} segment A code path segment to check.
* @returns {boolean} `true` if the segment has been seen.
*/
function hasSegmentBeenSeen(segment) {
return !!segInfoMap[segment.id];
}

/**
* Gets the flag which shows `super()` is called in all paths.
* @param {CodePathSegment} segment A code path segment to get.
Expand All @@ -209,12 +218,12 @@ module.exports = {
* skip the segment.
* If not skipped, this never becomes true after a loop.
*/
if (segment.nextSegments.length &&
segment.nextSegments[0].isLoopedPrevSegment(segment)
) {
if (segment.nextSegments.length === 1 &&
segment.nextSegments[0]?.isLoopedPrevSegment(segment)) {
return true;
}
return segment.reachable && segInfoMap[segment.id]?.calledInEveryPaths;

return segment.reachable && segInfoMap[segment.id].calledInEveryPaths;
}

return {
Expand Down Expand Up @@ -270,9 +279,9 @@ module.exports = {
}

// Reports if `super()` lacked.
const segments = codePath.returnedSegments;
const calledInEveryPaths = segments.every(isCalledInEveryPath);
const calledInSomePaths = segments.some(isCalledInSomePath);
const seenSegments = codePath.returnedSegments.filter(hasSegmentBeenSeen);
const calledInEveryPaths = seenSegments.every(isCalledInEveryPath);
const calledInSomePaths = seenSegments.some(isCalledInSomePath);

if (!calledInEveryPaths) {
context.report({
Expand Down Expand Up @@ -304,8 +313,10 @@ module.exports = {
const prevSegments = segment.prevSegments;

if (prevSegments.length > 0) {
info.calledInSomePaths = prevSegments.some(isCalledInSomePath);
info.calledInEveryPaths = prevSegments.every(isCalledInEveryPath);
const seenPrevSegments = prevSegments.filter(hasSegmentBeenSeen);

info.calledInSomePaths = seenPrevSegments.some(isCalledInSomePath);
info.calledInEveryPaths = seenPrevSegments.every(isCalledInEveryPath);
}
},

Expand Down Expand Up @@ -343,11 +354,11 @@ module.exports = {
{ first: toSegment, last: fromSegment },
segment => {
const info = segInfoMap[segment.id] ?? new SegmentInfo();
const prevSegments = segment.prevSegments;
const seenPrevSegments = segment.prevSegments.filter(hasSegmentBeenSeen);

// Updates flags.
info.calledInSomePaths = prevSegments.some(isCalledInSomePath);
info.calledInEveryPaths = prevSegments.every(isCalledInEveryPath);
info.calledInSomePaths = seenPrevSegments.some(isCalledInSomePath);
info.calledInEveryPaths = seenPrevSegments.every(isCalledInEveryPath);

// If flags become true anew, reports the valid nodes.
if (info.calledInSomePaths || isRealLoop) {
Expand Down
13 changes: 13 additions & 0 deletions tests/lib/rules/constructor-super.js
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,19 @@ ruleTester.run("constructor-super", rule, {
}
}`,
errors: [{ messageId: "missingAll", type: "MethodDefinition" }]
},

{
code: `class C extends D {
constructor() {
do {
something();
} while (foo);
}
}`,
errors: [{ messageId: "missingAll", type: "MethodDefinition" }]
}
]
});

0 comments on commit 63ee6bd

Please sign in to comment.