Home / Function/ nameAnonymousFunctionsImpl() — react Function Reference

nameAnonymousFunctionsImpl() — react Function Reference

Architecture documentation for the nameAnonymousFunctionsImpl() function in NameAnonymousFunctions.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  c18a8e9e_0d24_b666_ab97_a1b16b7337dd["nameAnonymousFunctionsImpl()"]
  9deec7b5_c4fb_24c9_f7fb_2d8a554df1d5["NameAnonymousFunctions.ts"]
  c18a8e9e_0d24_b666_ab97_a1b16b7337dd -->|defined in| 9deec7b5_c4fb_24c9_f7fb_2d8a554df1d5
  5674ef82_836d_cade_810a_eb2124782cde["nameAnonymousFunctions()"]
  5674ef82_836d_cade_810a_eb2124782cde -->|calls| c18a8e9e_0d24_b666_ab97_a1b16b7337dd
  style c18a8e9e_0d24_b666_ab97_a1b16b7337dd fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/Transform/NameAnonymousFunctions.ts lines 52–179

function nameAnonymousFunctionsImpl(fn: HIRFunction): Array<Node> {
  // Functions that we track to generate names for
  const functions: Map<IdentifierId, Node> = new Map();
  // Tracks temporaries that read from variables/globals/properties
  const names: Map<IdentifierId, string> = new Map();
  // Tracks all function nodes to bubble up for later renaming
  const nodes: Array<Node> = [];
  for (const block of fn.body.blocks.values()) {
    for (const instr of block.instructions) {
      const {lvalue, value} = instr;
      switch (value.kind) {
        case 'LoadGlobal': {
          names.set(lvalue.identifier.id, value.binding.name);
          break;
        }
        case 'LoadContext':
        case 'LoadLocal': {
          const name = value.place.identifier.name;
          if (name != null && name.kind === 'named') {
            names.set(lvalue.identifier.id, name.value);
          }
          const func = functions.get(value.place.identifier.id);
          if (func != null) {
            functions.set(lvalue.identifier.id, func);
          }
          break;
        }
        case 'PropertyLoad': {
          const objectName = names.get(value.object.identifier.id);
          if (objectName != null) {
            names.set(
              lvalue.identifier.id,
              `${objectName}.${String(value.property)}`,
            );
          }
          break;
        }
        case 'FunctionExpression': {
          const inner = nameAnonymousFunctionsImpl(value.loweredFunc.func);
          const node: Node = {
            fn: value,
            generatedName: null,
            inner,
          };
          /**
           * Bubble-up all functions, even if they're named, so that we can
           * later generate names for any inner anonymous functions
           */
          nodes.push(node);
          if (value.name == null) {
            // but only generate names for anonymous functions
            functions.set(lvalue.identifier.id, node);
          }
          break;
        }
        case 'StoreContext':
        case 'StoreLocal': {
          const node = functions.get(value.value.identifier.id);
          const variableName = value.lvalue.place.identifier.name;
          if (
            node != null &&
            node.generatedName == null &&
            variableName != null &&
            variableName.kind === 'named'
          ) {
            node.generatedName = variableName.value;
            functions.delete(value.value.identifier.id);
          }
          break;
        }
        case 'CallExpression':
        case 'MethodCall': {
          const callee =
            value.kind === 'MethodCall' ? value.property : value.callee;
          const hookKind = getHookKind(fn.env, callee.identifier);
          let calleeName: string | null = null;
          if (hookKind != null && hookKind !== 'Custom') {
            calleeName = hookKind;
          } else {
            calleeName = names.get(callee.identifier.id) ?? '(anonymous)';
          }

Frequently Asked Questions

What does nameAnonymousFunctionsImpl() do?
nameAnonymousFunctionsImpl() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/Transform/NameAnonymousFunctions.ts.
Where is nameAnonymousFunctionsImpl() defined?
nameAnonymousFunctionsImpl() is defined in compiler/packages/babel-plugin-react-compiler/src/Transform/NameAnonymousFunctions.ts at line 52.
What calls nameAnonymousFunctionsImpl()?
nameAnonymousFunctionsImpl() is called by 1 function(s): nameAnonymousFunctions.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free