lowerOptionalMemberExpression() — react Function Reference
Architecture documentation for the lowerOptionalMemberExpression() function in BuildHIR.ts from the react codebase.
Entity Profile
Dependency Diagram
graph TD bb81d73c_5996_9609_94fe_e0f8ad5e876d["lowerOptionalMemberExpression()"] e04c04d6_37a7_1dc3_7fae_7d07660d0af9["BuildHIR.ts"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|defined in| e04c04d6_37a7_1dc3_7fae_7d07660d0af9 ace1177a_10b2_b870_31fd_da4aa845554c["lowerExpression()"] ace1177a_10b2_b870_31fd_da4aa845554c -->|calls| bb81d73c_5996_9609_94fe_e0f8ad5e876d e401a324_13b9_af8a_12c7_b731c9f220a3["lowerOptionalCallExpression()"] e401a324_13b9_af8a_12c7_b731c9f220a3 -->|calls| bb81d73c_5996_9609_94fe_e0f8ad5e876d 147a0e7f_dab2_6a99_0c59_2eb8b07f70d5["buildTemporaryPlace()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 147a0e7f_dab2_6a99_0c59_2eb8b07f70d5 2a23449a_1dec_0ba3_8f5a_0e9e83d42add["reserve()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 2a23449a_1dec_0ba3_8f5a_0e9e83d42add 012a7acd_73d1_2699_77e8_481232bb47c8["currentBlockKind()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 012a7acd_73d1_2699_77e8_481232bb47c8 3db1e7ce_1c6f_24e2_3cbb_86c02c29d285["enter()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 3db1e7ce_1c6f_24e2_3cbb_86c02c29d285 f1f0c182_09ad_b29e_b1ca_56f10046adff["lowerValueToTemporary()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| f1f0c182_09ad_b29e_b1ca_56f10046adff d0270ab6_a621_bd55_a1b9_a5cad8b406b2["makeInstructionId()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| d0270ab6_a621_bd55_a1b9_a5cad8b406b2 e401a324_13b9_af8a_12c7_b731c9f220a3["lowerOptionalCallExpression()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| e401a324_13b9_af8a_12c7_b731c9f220a3 5bae3f87_1b76_e568_9b44_1d2fb59f73d8["lowerExpressionToTemporary()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 5bae3f87_1b76_e568_9b44_1d2fb59f73d8 041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e 10c63c7e_e339_2c92_cb9e_11d13186c6a7["enterReserved()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 10c63c7e_e339_2c92_cb9e_11d13186c6a7 d3430316_6bb4_9d91_4539_1bff5c189f83["lowerMemberExpression()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| d3430316_6bb4_9d91_4539_1bff5c189f83 43f67b81_ddfd_4289_903f_8e9e60469eb7["terminateWithContinuation()"] bb81d73c_5996_9609_94fe_e0f8ad5e876d -->|calls| 43f67b81_ddfd_4289_903f_8e9e60469eb7 style bb81d73c_5996_9609_94fe_e0f8ad5e876d fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts lines 2677–2785
function lowerOptionalMemberExpression(
builder: HIRBuilder,
expr: NodePath<t.OptionalMemberExpression>,
parentAlternate: BlockId | null,
): {object: Place; value: Place} {
const optional = expr.node.optional;
const loc = expr.node.loc ?? GeneratedSource;
const place = buildTemporaryPlace(builder, loc);
const continuationBlock = builder.reserve(builder.currentBlockKind());
const consequent = builder.reserve('value');
/*
* block to evaluate if the callee is null/undefined, this sets the result of the call to undefined.
* note that we only create an alternate when first entering an optional subtree of the ast: if this
* is a child of an optional node, we use the alterate created by the parent.
*/
const alternate =
parentAlternate !== null
? parentAlternate
: builder.enter('value', () => {
const temp = lowerValueToTemporary(builder, {
kind: 'Primitive',
value: undefined,
loc,
});
lowerValueToTemporary(builder, {
kind: 'StoreLocal',
lvalue: {kind: InstructionKind.Const, place: {...place}},
value: {...temp},
type: null,
loc,
});
return {
kind: 'goto',
variant: GotoVariant.Break,
block: continuationBlock.id,
id: makeInstructionId(0),
loc,
};
});
let object: Place | null = null;
const testBlock = builder.enter('value', () => {
const objectPath = expr.get('object');
if (objectPath.isOptionalMemberExpression()) {
const {value} = lowerOptionalMemberExpression(
builder,
objectPath,
alternate,
);
object = value;
} else if (objectPath.isOptionalCallExpression()) {
const value = lowerOptionalCallExpression(builder, objectPath, alternate);
object = lowerValueToTemporary(builder, value);
} else {
object = lowerExpressionToTemporary(builder, objectPath);
}
return {
kind: 'branch',
test: {...object},
consequent: consequent.id,
alternate,
fallthrough: continuationBlock.id,
id: makeInstructionId(0),
loc,
};
});
CompilerError.invariant(object !== null, {
reason: 'Satisfy type checker',
loc: GeneratedSource,
});
/*
* block to evaluate if the callee is non-null/undefined. arguments are lowered in this block to preserve
* the semantic of conditional evaluation depending on the callee
*/
builder.enterReserved(consequent, () => {
const {value} = lowerMemberExpression(builder, expr, object);
const temp = lowerValueToTemporary(builder, value);
lowerValueToTemporary(builder, {
kind: 'StoreLocal',
Domain
Subdomains
Calls
Source
Frequently Asked Questions
What does lowerOptionalMemberExpression() do?
lowerOptionalMemberExpression() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts.
Where is lowerOptionalMemberExpression() defined?
lowerOptionalMemberExpression() is defined in compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts at line 2677.
What does lowerOptionalMemberExpression() call?
lowerOptionalMemberExpression() calls 12 function(s): buildTemporaryPlace, currentBlockKind, enter, enterReserved, invariant, lowerExpressionToTemporary, lowerMemberExpression, lowerOptionalCallExpression, and 4 more.
What calls lowerOptionalMemberExpression()?
lowerOptionalMemberExpression() is called by 2 function(s): lowerExpression, lowerOptionalCallExpression.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free