fix: detect mutations within assignments expressions (alternative approach) #12429
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.
Alternative to #12411.
We use the
extract_identifiers
utility to find the identifiers in patterns, like these:Patterns also occur in e.g. function declarations and assignment expressions. But there are two kinds of pattern — binding patterns and assignment patterns — and they're subtly different. Binding patterns can ultimately only contain identifiers (the things being declared), while assignment patterns can contain any lvalue (i.e.
Identifier
orMemberExpression
in ESTree terminology).The drawback of #12411 is that it lumps identifiers and member expressions together. This works, but it has a cost — it means that the bindings referenced in an assignment pattern are always marked as reassigned (rather than merely mutated) even if they're member expressions. This means that the compiler sees something like this...
...and marks
array
as being reassigned, which means that we have to create a source for it:It's better if we can differentiate between these things. That's what this PR does: it expands the pattern unwrapping logic to include member expression nodes, and updates the
AssignmentExpression
logic to use it. The existingextract_identifiers
function is kept with the same API, by callingunwrap_pattern
under the hood but filtering out non-identifier nodes.Before submitting the PR, please make sure you do the following
feat:
,fix:
,chore:
, ordocs:
.Tests and linting
pnpm test
and lint the project withpnpm lint