fix(javascript): retain implicit property conversion and disposal effects

This commit is contained in:
morluto committed 2026-10-24 02:41:05 +08:00
1 parent 44efd920c6
commit 905ae18451
9 files changed
+569 -68

No files matched your search

@@ -0,0 +1,33 @@
import * as t from "@babel/types";
/** Operands exposed to user-defined primitive conversion by language operations. */
export const semanticCoercionOperands = (node: t.Node): readonly t.Node[] => {
if (t.isBinaryExpression(node)) {
if (["===", "!==", "instanceof"].includes(node.operator)) return [];
return node.operator === "in" ? [node.left] : [node.left, node.right];
}
if (t.isUnaryExpression(node) && ["+", "-", "~"].includes(node.operator))
return [node.argument];
if (t.isUpdateExpression(node)) return [node.argument];
if (
t.isAssignmentExpression(node) &&
!["=", "&&=", "||=", "??="].includes(node.operator)
)
return [node.left, node.right];
if (
(t.isMemberExpression(node) ||
t.isOptionalMemberExpression(node) ||
t.isObjectProperty(node) ||
t.isObjectMethod(node) ||
t.isClassProperty(node) ||
t.isClassMethod(node) ||
t.isClassAccessorProperty(node)) &&
node.computed
)
return [
t.isMemberExpression(node) || t.isOptionalMemberExpression(node)
? node.property
: node.key,
];
return [];
};