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
Defined In
Calls
Source
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