Home / Function/ applySignature() — react Function Reference

applySignature() — react Function Reference

Architecture documentation for the applySignature() function in InferMutationAliasingEffects.ts from the react codebase.

Entity Profile

Dependency Diagram

graph TD
  f255dd41_8c48_19a9_1bcc_8efd2d663f32["applySignature()"]
  d24875c3_c045_4414_2cc9_16f96d59c629["InferMutationAliasingEffects.ts"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|defined in| d24875c3_c045_4414_2cc9_16f96d59c629
  ac82e9ee_09bc_b58c_f2ac_86bf2d552540["inferBlock()"]
  ac82e9ee_09bc_b58c_f2ac_86bf2d552540 -->|calls| f255dd41_8c48_19a9_1bcc_8efd2d663f32
  fc22e84f_49a6_8d04_faba_43cbf926c0aa["computeEffectsForLegacySignature()"]
  fc22e84f_49a6_8d04_faba_43cbf926c0aa -->|calls| f255dd41_8c48_19a9_1bcc_8efd2d663f32
  8f06f55e_0851_0d44_0a89_d6dee31fdbb5["kind()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 8f06f55e_0851_0d44_0a89_d6dee31fdbb5
  ffdcc9ff_f0d0_148b_1939_2e048f116edf["getWriteErrorReason()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| ffdcc9ff_f0d0_148b_1939_2e048f116edf
  ac13f5c1_be17_dd7a_6bd3_66d91c46aadf["create()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| ac13f5c1_be17_dd7a_6bd3_66d91c46aadf
  1a2b7047_24c8_62d6_b328_5f07307d27ab["withDetails()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 1a2b7047_24c8_62d6_b328_5f07307d27ab
  6184f2b6_7ea4_aff3_4588_a9af7d7fdf3c["appendAlias()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 6184f2b6_7ea4_aff3_4588_a9af7d7fdf3c
  1bdf9e01_ffb0_1422_a451_e62965a1969b["printInstruction()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 1bdf9e01_ffb0_1422_a451_e62965a1969b
  7cb90dd3_dbe0_0087_670d_277ddeadabfc["applyEffect()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 7cb90dd3_dbe0_0087_670d_277ddeadabfc
  1d28042a_1677_72f1_73ab_6aec596d00f7["debugAbstractValue()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 1d28042a_1677_72f1_73ab_6aec596d00f7
  3892e473_17c5_bb0e_5d49_0b377b5ed784["printAliasingEffect()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 3892e473_17c5_bb0e_5d49_0b377b5ed784
  549ed1ce_1b4e_6a1c_07a1_035ff055847b["isDefined()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 549ed1ce_1b4e_6a1c_07a1_035ff055847b
  041ca752_10c1_3cda_1f5c_02f44a01310e["invariant()"]
  f255dd41_8c48_19a9_1bcc_8efd2d663f32 -->|calls| 041ca752_10c1_3cda_1f5c_02f44a01310e
  style f255dd41_8c48_19a9_1bcc_8efd2d663f32 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingEffects.ts lines 572–671

function applySignature(
  context: Context,
  state: InferenceState,
  signature: InstructionSignature,
  instruction: Instruction,
): Array<AliasingEffect> | null {
  const effects: Array<AliasingEffect> = [];
  /**
   * For function instructions, eagerly validate that they aren't mutating
   * a known-frozen value.
   *
   * TODO: make sure we're also validating against global mutations somewhere, but
   * account for this being allowed in effects/event handlers.
   */
  if (
    instruction.value.kind === 'FunctionExpression' ||
    instruction.value.kind === 'ObjectMethod'
  ) {
    const aliasingEffects =
      instruction.value.loweredFunc.func.aliasingEffects ?? [];
    const context = new Set(
      instruction.value.loweredFunc.func.context.map(p => p.identifier.id),
    );
    for (const effect of aliasingEffects) {
      if (effect.kind === 'Mutate' || effect.kind === 'MutateTransitive') {
        if (!context.has(effect.value.identifier.id)) {
          continue;
        }
        const value = state.kind(effect.value);
        switch (value.kind) {
          case ValueKind.Frozen: {
            const reason = getWriteErrorReason({
              kind: value.kind,
              reason: value.reason,
            });
            const variable =
              effect.value.identifier.name !== null &&
              effect.value.identifier.name.kind === 'named'
                ? `\`${effect.value.identifier.name.value}\``
                : 'value';
            const diagnostic = CompilerDiagnostic.create({
              category: ErrorCategory.Immutability,
              reason: 'This value cannot be modified',
              description: reason,
            }).withDetails({
              kind: 'error',
              loc: effect.value.loc,
              message: `${variable} cannot be modified`,
            });
            if (
              effect.kind === 'Mutate' &&
              effect.reason?.kind === 'AssignCurrentProperty'
            ) {
              diagnostic.withDetails({
                kind: 'hint',
                message: `Hint: If this value is a Ref (value returned by \`useRef()\`), rename the variable to end in "Ref".`,
              });
            }
            effects.push({
              kind: 'MutateFrozen',
              place: effect.value,
              error: diagnostic,
            });
          }
        }
      }
    }
  }

  /*
   * Track which values we've already aliased once, so that we can switch to
   * appendAlias() for subsequent aliases into the same value
   */
  const initialized = new Set<IdentifierId>();

  if (DEBUG) {
    console.log(printInstruction(instruction));
  }

  for (const effect of signature.effects) {
    applyEffect(context, state, effect, initialized, effects);

Domain

Subdomains

Frequently Asked Questions

What does applySignature() do?
applySignature() is a function in the react codebase, defined in compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingEffects.ts.
Where is applySignature() defined?
applySignature() is defined in compiler/packages/babel-plugin-react-compiler/src/Inference/InferMutationAliasingEffects.ts at line 572.
What does applySignature() call?
applySignature() calls 13 function(s): appendAlias, applyEffect, create, debugAbstractValue, getWriteErrorReason, invariant, isDefined, kind, and 5 more.
What calls applySignature()?
applySignature() is called by 2 function(s): computeEffectsForLegacySignature, inferBlock.

Analyze Your Own Codebase

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

Try Supermodel Free