[compiler] Fix for destructuring with mixed declaration/reassignment#35144
[compiler] Fix for destructuring with mixed declaration/reassignment#35144josephsavona merged 1 commit intomainfrom
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.
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.
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.
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.
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); |
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.