pull/16100/head
Rich Harris 4 months ago
parent 1d188f595c
commit 90baec16e6

@ -23,5 +23,9 @@ export function AssignmentExpression(node, context) {
} }
} }
if (context.state.expression) {
context.state.expression.has_assignment = true;
}
context.next(); context.next();
} }

@ -15,8 +15,9 @@ export function MemberExpression(node, context) {
} }
} }
if (context.state.expression && !is_pure(node, context)) { if (context.state.expression) {
context.state.expression.has_state = true; context.state.expression.has_member_expression = true;
context.state.expression.has_state ||= !is_pure(node, context);
} }
if (!is_safe_identifier(node, context.state.scope)) { if (!is_safe_identifier(node, context.state.scope)) {

@ -21,5 +21,9 @@ export function UpdateExpression(node, context) {
} }
} }
if (context.state.expression) {
context.state.expression.has_assignment = true;
}
context.next(); context.next();
} }

@ -442,6 +442,12 @@ function is_pure_expression(expression) {
* @param {ExpressionMetadata} metadata * @param {ExpressionMetadata} metadata
*/ */
export function build_legacy_expression_2(context, expression, metadata) { export function build_legacy_expression_2(context, expression, metadata) {
const value = /** @type {Expression} */ (context.visit(expression));
if (!metadata.has_call && !metadata.has_member_expression && !metadata.has_assignment) {
return value;
}
const sequence = b.sequence([]); const sequence = b.sequence([]);
for (const binding of metadata.dependencies) { for (const binding of metadata.dependencies) {
@ -460,7 +466,6 @@ export function build_legacy_expression_2(context, expression, metadata) {
sequence.expressions.push(getter); sequence.expressions.push(getter);
} }
const value = /** @type {Expression} */ (context.visit(expression));
sequence.expressions.push(b.call('$.untrack', b.thunk(value))); sequence.expressions.push(b.call('$.untrack', b.thunk(value)));
return sequence; return sequence;

@ -63,7 +63,9 @@ export function create_expression_metadata() {
return { return {
dependencies: new Set(), dependencies: new Set(),
has_state: false, has_state: false,
has_call: false has_call: false,
has_member_expression: false,
has_assignment: false
}; };
} }

@ -285,6 +285,10 @@ export interface ExpressionMetadata {
has_state: boolean; has_state: boolean;
/** True if the expression involves a call expression (often, it will need to be wrapped in a derived) */ /** True if the expression involves a call expression (often, it will need to be wrapped in a derived) */
has_call: boolean; has_call: boolean;
/** True if the expression includes a member expression */
has_member_expression: boolean;
/** True if the expression includes an assignment or an update */
has_assignment: boolean;
} }
export interface StateField { export interface StateField {

Loading…
Cancel
Save