fix(javascript): retain uncertainty for conditionally skipped writes

Own skipped-write interpretation at definition collection, including conditional branches, loop iterations and optional-chain arguments. Remove the narrower initializer-only representation.

Fixes #2562
This commit is contained in:
morluto
2026-10-14 14:46:36 +08:00
parent 36c91428fc
commit 410537667e
7 changed files with 172 additions and 33 deletions
@@ -92,7 +92,8 @@ export interface JavaScriptSemanticAnalysisState {
JavaScriptSemanticModuleLink,
JavaScriptSemanticBindingState
>;
readonly conditionalInitializers: WeakSet<t.Node>;
/** Initializer expressions whose write can be skipped by enclosing control flow. */
readonly conditionallySkippedExpressions: WeakSet<t.Node>;
/** Unbound identifier writes retain their source sites for capture ordering. */
readonly ambientBindingWrites: Map<string, t.Node[]>;
/** Source-local writes, tagged by global object or import.meta identity. */
@@ -120,7 +121,7 @@ export const semanticStableInitializer = (
(definition?.kind === "function" || definition?.kind === "class"))) &&
binding.initializers.length === 1 &&
initializer !== undefined &&
!state.conditionalInitializers.has(initializer.node)
!state.conditionallySkippedExpressions.has(initializer.node)
? initializer
: undefined;
};