From 27b077edea844dd998bb7176053ed4d3e7517aa7 Mon Sep 17 00:00:00 2001 From: morluto <76467478+morluto@users.noreply.github.com> Date: Sat, 24 Oct 2026 04:39:28 +0800 Subject: [PATCH] fix(javascript): capture primitive return values at evaluation --- .../javascriptSemanticMutationInitializers.ts | 4 +++- src/domain/javascript/javascriptSemanticValues.ts | 12 ++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/domain/javascript/javascriptSemanticMutationInitializers.ts b/src/domain/javascript/javascriptSemanticMutationInitializers.ts index 61f70b1f8c..6c6768a14b 100644 --- a/src/domain/javascript/javascriptSemanticMutationInitializers.ts +++ b/src/domain/javascript/javascriptSemanticMutationInitializers.ts @@ -1000,7 +1000,7 @@ const retainedInitializerOrigins = ( }; }; -/** Locate a capture only in an unconditional declaration or literal initializer. */ +/** Locate an initializer or completed return-expression capture in its body. */ export const semanticCapturePosition = ( node: t.Node, parents: WeakMap, @@ -1010,6 +1010,8 @@ export const semanticCapturePosition = ( const direct = directInitializerPosition(current, parents); if (direct !== null) return direct; const parent = parents.get(current); + if (t.isReturnStatement(parent) && parent.argument === current) + return statementPosition(parent, parents); if ( t.isObjectProperty(parent) && parent.value === current && diff --git a/src/domain/javascript/javascriptSemanticValues.ts b/src/domain/javascript/javascriptSemanticValues.ts index 68aeb9e679..af5d487b7c 100644 --- a/src/domain/javascript/javascriptSemanticValues.ts +++ b/src/domain/javascript/javascriptSemanticValues.ts @@ -257,12 +257,12 @@ export const evaluateSemanticExpression = ( dependence: { lowest: CALLER_INDEPENDENT }, memo: createEvaluationMemo(state), }; - return evaluateExpression( - node, - capturePoint === undefined - ? context - : (captureContextAt(capturePoint, context) ?? context), - ); + return capturePoint === undefined + ? evaluateCapturedExpression(node, context) + : evaluateExpression( + node, + captureContextAt(capturePoint, context) ?? context, + ); }; /** Resolve an expression using the same alias and module provenance owner. */