Skip to content

Commit

Permalink
[compiler] Support for non-declatation for in/of iterators
Browse files Browse the repository at this point in the history
ghstack-source-id: a28801e022561029e2f46c3dcb858bd4a81dea6a
Pull Request resolved: facebook#31710
  • Loading branch information
mvitousek committed Dec 9, 2024
1 parent 226b859 commit 76d603a
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 29 deletions.
58 changes: 35 additions & 23 deletions compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1078,6 +1078,12 @@ function lowerStatement(
const left = stmt.get('left');
const leftLoc = left.node.loc ?? GeneratedSource;
let test: Place;
const advanceIterator = lowerValueToTemporary(builder, {
kind: 'IteratorNext',
loc: leftLoc,
iterator: {...iterator},
collection: {...value},
});
if (left.isVariableDeclaration()) {
const declarations = left.get('declarations');
CompilerError.invariant(declarations.length === 1, {
Expand All @@ -1087,12 +1093,6 @@ function lowerStatement(
suggestions: null,
});
const id = declarations[0].get('id');
const advanceIterator = lowerValueToTemporary(builder, {
kind: 'IteratorNext',
loc: leftLoc,
iterator: {...iterator},
collection: {...value},
});
const assign = lowerAssignment(
builder,
leftLoc,
Expand All @@ -1103,13 +1103,19 @@ function lowerStatement(
);
test = lowerValueToTemporary(builder, assign);
} else {
builder.errors.push({
reason: `(BuildHIR::lowerStatement) Handle ${left.type} inits in ForOfStatement`,
severity: ErrorSeverity.Todo,
loc: left.node.loc ?? null,
suggestions: null,
CompilerError.invariant(left.isLVal(), {
loc: leftLoc,
reason: 'Expected ForOf init to be a variable declaration or lval',
});
return;
const assign = lowerAssignment(
builder,
leftLoc,
InstructionKind.Reassign,
left,
advanceIterator,
'Assignment',
);
test = lowerValueToTemporary(builder, assign);
}
builder.terminateWithContinuation(
{
Expand Down Expand Up @@ -1166,6 +1172,11 @@ function lowerStatement(
const left = stmt.get('left');
const leftLoc = left.node.loc ?? GeneratedSource;
let test: Place;
const nextPropertyTemp = lowerValueToTemporary(builder, {
kind: 'NextPropertyOf',
loc: leftLoc,
value,
});
if (left.isVariableDeclaration()) {
const declarations = left.get('declarations');
CompilerError.invariant(declarations.length === 1, {
Expand All @@ -1175,11 +1186,6 @@ function lowerStatement(
suggestions: null,
});
const id = declarations[0].get('id');
const nextPropertyTemp = lowerValueToTemporary(builder, {
kind: 'NextPropertyOf',
loc: leftLoc,
value,
});
const assign = lowerAssignment(
builder,
leftLoc,
Expand All @@ -1190,13 +1196,19 @@ function lowerStatement(
);
test = lowerValueToTemporary(builder, assign);
} else {
builder.errors.push({
reason: `(BuildHIR::lowerStatement) Handle ${left.type} inits in ForInStatement`,
severity: ErrorSeverity.Todo,
loc: left.node.loc ?? null,
suggestions: null,
CompilerError.invariant(left.isLVal(), {
loc: leftLoc,
reason: 'Expected ForIn init to be a variable declaration or lval',
});
return;
const assign = lowerAssignment(
builder,
leftLoc,
InstructionKind.Reassign,
left,
nextPropertyTemp,
'Assignment',
);
test = lowerValueToTemporary(builder, assign);
}
builder.terminateWithContinuation(
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,6 @@ Todo: (BuildHIR::lowerExpression) Handle tagged template with interpolations (30
Todo: (BuildHIR::lowerExpression) Handle tagged template where cooked value is different from raw value (34:34)
Todo: (BuildHIR::lowerStatement) Handle Identifier inits in ForOfStatement (36:36)
Todo: (BuildHIR::lowerStatement) Handle ArrayPattern inits in ForOfStatement (38:38)
Todo: (BuildHIR::lowerStatement) Handle ObjectPattern inits in ForOfStatement (40:40)
Todo: (BuildHIR::node.lowerReorderableExpression) Expression type `MemberExpression` cannot be safely reordered (57:57)
Todo: (BuildHIR::node.lowerReorderableExpression) Expression type `BinaryExpression` cannot be safely reordered (53:53)
Expand Down

0 comments on commit 76d603a

Please sign in to comment.