fix(javascript): retain conditional mutation ordering uncertainty

This commit is contained in:
morluto 2026-10-10 07:40:25 +08:00
parent 001851fde6
commit b8a8190b2f
2 changed files with 17 additions and 9 deletions

View File

@ -72,6 +72,8 @@ describe("reference lifetimes across calls and shallow copies", () => {
"mutate(alias); alias={};",
"if(flag) alias={}; mutate(alias);",
"alias={}; if(flag) mutate(alias);",
"alias={}; flag && mutate(alias);",
"alias={}; flag ? mutate(alias) : noop();",
"function invoke(){mutate(alias);} alias={}; invoke();",
"alias={}; mutate(alias); alias=source;",
])("retains uncertain call ordering: %s", (body) => {

View File

@ -94,19 +94,25 @@ const directMutationPosition = (
!t.isTaggedTemplateExpression(node)
)
return null;
let current = parents.get(node);
while (current !== undefined) {
if (t.isFunction(current)) return null;
if (t.isStatement(current)) return statementPosition(current, parents);
if (t.isVariableDeclarator(current)) {
const declaration = parents.get(current);
let current: t.Node = node;
while (true) {
const parent = parents.get(current);
if (
parent === undefined ||
t.isFunction(parent) ||
(t.isLogicalExpression(parent) && parent.right === current) ||
(t.isConditionalExpression(parent) && parent.test !== current)
)
return null;
if (t.isStatement(parent)) return statementPosition(parent, parents);
if (t.isVariableDeclarator(parent)) {
const declaration = parents.get(parent);
return t.isVariableDeclaration(declaration)
? statementPosition(declaration, parents, current)
? statementPosition(declaration, parents, parent)
: null;
}
current = parents.get(current);
current = parent;
}
return null;
};
const referenceInitializerPosition = (