feat(electron): resolve stable local constant window options

Resolve stable local constant BrowserWindow options with retained provenance and shared early-exit mutation queries. Preserve source ordering and unknown results for relevant mutations or escapes.

Includes real Joplin correctness/cost receipts and regression coverage.

Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com>
This commit is contained in:
Ysopwnable
2026-10-16 14:52:33 +08:00
committed by GitHub
parent 5a77acfbcd
commit d72d856f58
20 changed files with 4544 additions and 64 deletions
@@ -571,8 +571,7 @@ const resolvedRequestTarget = (
// A toString result is selected before the enclosing request invocation.
const expression = unwrapJavaScriptExpression(node).node;
const capture = reference === expression ? site : expression;
if (referenceMayHaveChangedAtSite(reference, capture, index))
return undefined;
if (index.referenceMayHaveChangedAt(capture, reference)) return undefined;
if (!requestInitializerPrecedesSite(reference, capture, bindings, index))
return undefined;
const evaluated = evaluateSemanticExpression(node, bindings);
@@ -587,9 +586,7 @@ const requestInitializerPrecedesSite = (
bindings: JavaScriptSemanticAnalysisState,
index: JavaScriptBindingIndex,
): boolean => {
const effects = index.effectsForReferenceAt(site, reference);
if (effects.bindingId === null) return false;
const binding = bindings.bindingsById.get(effects.bindingId);
const binding = index.bindingForReferenceAt(reference);
const initializer = semanticStableInitializer(binding, bindings);
return (
initializer !== undefined &&
@@ -601,19 +598,6 @@ const requestInitializerPrecedesSite = (
);
};
const referenceMayHaveChangedAtSite = (
reference: t.Node,
site: t.Node,
index: JavaScriptBindingIndex,
): boolean => {
const effects = index.effectsForReferenceAt(site, reference);
return (
!effects.memberEffectsIndexed ||
effects.resolution !== "resolved" ||
effects.effects.some(({ timing }) => timing !== "after")
);
};
const requestReferenceNode = (node: t.Node): t.Node => {
const target = unwrapJavaScriptExpression(node).node;
if (
@@ -652,16 +636,9 @@ const urlObjectRequestTarget = (
)
target = unwrapJavaScriptExpression(callee.object).node;
}
if (
!t.isIdentifier(target) ||
referenceMayHaveChangedAtSite(target, site, index)
)
if (!t.isIdentifier(target) || index.referenceMayHaveChangedAt(site, target))
return undefined;
const effects = index.effectsForReferenceAt(site, target);
const binding =
effects.bindingId === null
? undefined
: bindings.bindingsById.get(effects.bindingId);
const binding = index.bindingForReferenceAt(target);
if (binding === undefined || seen.has(binding.bindingId)) return undefined;
seen.add(binding.bindingId);
const stable = semanticStableInitializer(binding, bindings);