insertAdditionalFunctionDeclaration() — react Function Reference
Architecture documentation for the insertAdditionalFunctionDeclaration() function in Gating.ts from the react codebase.
Entity Profile
Dependency Diagram
graph TD 7fdb3fec_c4d5_7678_ad85_e8976e3417ad["insertAdditionalFunctionDeclaration()"] 3acb56d9_57da_7e65_c06b_21b238146737["Gating.ts"] 7fdb3fec_c4d5_7678_ad85_e8976e3417ad -->|defined in| 3acb56d9_57da_7e65_c06b_21b238146737 77b776cd_a7c8_1d29_ba32_e5a39fa85dd9["insertGatedFunctionDeclaration()"] 77b776cd_a7c8_1d29_ba32_e5a39fa85dd9 -->|calls| 7fdb3fec_c4d5_7678_ad85_e8976e3417ad 041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"] 7fdb3fec_c4d5_7678_ad85_e8976e3417ad -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e be5dd024_ebb7_729f_f653_2158dc13ee4c["newUid()"] 7fdb3fec_c4d5_7678_ad85_e8976e3417ad -->|calls| be5dd024_ebb7_729f_f653_2158dc13ee4c 073c81a5_c389_d108_5b8f_4d6dc6eece83["push()"] 7fdb3fec_c4d5_7678_ad85_e8976e3417ad -->|calls| 073c81a5_c389_d108_5b8f_4d6dc6eece83 style 7fdb3fec_c4d5_7678_ad85_e8976e3417ad fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Gating.ts lines 36–126
function insertAdditionalFunctionDeclaration(
fnPath: NodePath<t.FunctionDeclaration>,
compiled: t.FunctionDeclaration,
programContext: ProgramContext,
gatingFunctionIdentifierName: string,
): void {
const originalFnName = fnPath.node.id;
const originalFnParams = fnPath.node.params;
const compiledParams = fnPath.node.params;
/**
* Note that other than `export default function() {}`, all other function
* declarations must have a binding identifier. Since default exports cannot
* be referenced, it's safe to assume that all function declarations passed
* here will have an identifier.
* https://tc39.es/ecma262/multipage/ecmascript-language-functions-and-classes.html#sec-function-definitions
*/
CompilerError.invariant(originalFnName != null && compiled.id != null, {
reason:
'Expected function declarations that are referenced elsewhere to have a named identifier',
loc: fnPath.node.loc ?? GeneratedSource,
});
CompilerError.invariant(originalFnParams.length === compiledParams.length, {
reason:
'Expected React Compiler optimized function declarations to have the same number of parameters as source',
loc: fnPath.node.loc ?? GeneratedSource,
});
const gatingCondition = t.identifier(
programContext.newUid(`${gatingFunctionIdentifierName}_result`),
);
const unoptimizedFnName = t.identifier(
programContext.newUid(`${originalFnName.name}_unoptimized`),
);
const optimizedFnName = t.identifier(
programContext.newUid(`${originalFnName.name}_optimized`),
);
/**
* Step 1: rename existing functions
*/
compiled.id.name = optimizedFnName.name;
fnPath.get('id').replaceInline(unoptimizedFnName);
/**
* Step 2: insert new function declaration
*/
const newParams: Array<t.Identifier | t.RestElement> = [];
const genNewArgs: Array<() => t.Identifier | t.SpreadElement> = [];
for (let i = 0; i < originalFnParams.length; i++) {
const argName = `arg${i}`;
if (originalFnParams[i].type === 'RestElement') {
newParams.push(t.restElement(t.identifier(argName)));
genNewArgs.push(() => t.spreadElement(t.identifier(argName)));
} else {
newParams.push(t.identifier(argName));
genNewArgs.push(() => t.identifier(argName));
}
}
// insertAfter called in reverse order of how nodes should appear in program
fnPath.insertAfter(
t.functionDeclaration(
originalFnName,
newParams,
t.blockStatement([
t.ifStatement(
gatingCondition,
t.returnStatement(
t.callExpression(
compiled.id,
genNewArgs.map(fn => fn()),
),
),
t.returnStatement(
t.callExpression(
unoptimizedFnName,
genNewArgs.map(fn => fn()),
),
),
),
]),
),
);
Domain
Subdomains
Called By
Source
Frequently Asked Questions
What does insertAdditionalFunctionDeclaration() do?
insertAdditionalFunctionDeclaration() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Gating.ts.
Where is insertAdditionalFunctionDeclaration() defined?
insertAdditionalFunctionDeclaration() is defined in compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Gating.ts at line 36.
What does insertAdditionalFunctionDeclaration() call?
insertAdditionalFunctionDeclaration() calls 3 function(s): invariant, newUid, push.
What calls insertAdditionalFunctionDeclaration()?
insertAdditionalFunctionDeclaration() is called by 1 function(s): insertGatedFunctionDeclaration.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free