fix(javascript): retain conditional mutation ordering uncertainty
This commit is contained in:
parent
001851fde6
commit
b8a8190b2f
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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 = (
|
||||
|
|
|
|||
Loading…
Reference in New Issue