Home / Function/ insertAdditionalFunctionDeclaration() — react Function Reference

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

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