fix(eslint-plugin): [explicit-module-boundary-types] cyclical reference infinite recursion crash #2482
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #2309
the recursive logic added by #2135 is setup to check members that are not directly exported but used by public members of an exported class, for example here
A.method
needs to be explicit return type becauseA
ends up being exported:However when the class refers to itself (or any reference loop) this would cause infinite recursion.
To get around this I've just added a set of all nodes we've already visited so recursion will be bounded.
NOTE: it is very possible the
checkedFunctions
andalreadyVisited
sets can be merged. I tried the unit tests wherecheckFunctions
was removed entirely andisExportedHigherOrderFunction
used thealreadyVisited
set instead, all unit tests passed but it feels unsound since some nodes like the private fields of a class end up added to the visited set so there may be an edge case where, ifisExportedHigherOrderFunction
used any visited node to detect it's exported, we'd end up with a false positive for requiring annotations. So to be on the safe side I just added a second set.