-
Notifications
You must be signed in to change notification settings - Fork 49.9k
[compiler] Fix for destructuring with mixed declaration/reassignment #35144
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| const isDeclared = cx.hasDeclared(place.identifier); | ||
| hasReassign ||= isDeclared; | ||
| hasDeclaration ||= !isDeclared; | ||
| } | ||
| if (hasReassign && hasDeclaration) { | ||
| CompilerError.invariant(false, { | ||
| reason: | ||
| 'Encountered a destructuring operation where some identifiers are already declared (reassignments) but others are not (declarations)', | ||
| description: null, | ||
| details: [ | ||
| { | ||
| kind: 'error', | ||
| loc: instr.loc, | ||
| message: null, | ||
| }, | ||
| ], | ||
| suggestions: null, | ||
| }); | ||
| } else if (hasReassign) { | ||
| kind = InstructionKind.Reassign; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the logic for hasDeclared() here doesn't account for all local variables, so it was incorrectly reporting that the fixed destructuring had mixed reassignment and declarations
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh I see -- we add to declarations only when we see scope declarations, but this case has a local (with-scope) reassignment
75f7946 to
6d8845d
Compare
--- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35145). * #35144 * __->__ #35145
1181273 to
568c99c
Compare
--- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35145). * facebook#35144 * __->__ facebook#35145
| if (reassigned.size === 0 || !hasDeclaration) { | ||
| if (!hasDeclaration) { | ||
| // all reassignments | ||
| destructure.lvalue.kind = InstructionKind.Reassign; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm just curious -- was this line necessary? We previously didn't need to always either overwrite or construct a new Destructure instruction. Mainly wondering if there was more than one bugfix here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, because before these cases would have fallen through to the code below which replaced the instruction with a Reassign kind.
| if (view === "week") { | ||
| let lastDay; | ||
|
|
||
| [firstDay, lastDay] = getConfig(weekendDays); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
awesome!
Destructing statements that start off as declarations can end up becoming reassignments if the variable is a scope declaration, so we have existing logic to handle cases where some parts of a destructure need to be converted into new locals, with a reassignment to the hoisted scope variable afterwards. However, there is an edge case where all of the values are reassigned, in which case we don't need to rewrite and can just set the instruction kind to reassign.
568c99c to
629feee
Compare
…35144) Destructing statements that start off as declarations can end up becoming reassignments if the variable is a scope declaration, so we have existing logic to handle cases where some parts of a destructure need to be converted into new locals, with a reassignment to the hoisted scope variable afterwards. However, there is an edge case where all of the values are reassigned, in which case we don't need to rewrite and can just set the instruction kind to reassign. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35144). * #35148 * #35147 * #35146 * __->__ #35144 DiffTrain build for [b315a0f](b315a0f)
…35144) Destructing statements that start off as declarations can end up becoming reassignments if the variable is a scope declaration, so we have existing logic to handle cases where some parts of a destructure need to be converted into new locals, with a reassignment to the hoisted scope variable afterwards. However, there is an edge case where all of the values are reassigned, in which case we don't need to rewrite and can just set the instruction kind to reassign. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35144). * #35148 * #35147 * #35146 * __->__ #35144 DiffTrain build for [b315a0f](b315a0f)
Destructing statements that start off as declarations can end up becoming reassignments if the variable is a scope declaration, so we have existing logic to handle cases where some parts of a destructure need to be converted into new locals, with a reassignment to the hoisted scope variable afterwards. However, there is an edge case where all of the values are reassigned, in which case we don't need to rewrite and can just set the instruction kind to reassign.
Stack created with Sapling. Best reviewed with ReviewStack.