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();
}

@ -15,8 +15,9 @@ export function MemberExpression(node, context) {
}
}
if (context.state.expression && !is_pure(node, context)) {
context.state.expression.has_state = true;
if (context.state.expression) {
context.state.expression.has_member_expression = true;
context.state.expression.has_state ||= !is_pure(node, context);
}
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();
}

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

@ -63,7 +63,9 @@ export function create_expression_metadata() {
return {
dependencies: new Set(),
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;
/** True if the expression involves a call expression (often, it will need to be wrapped in a derived) */
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 {

Loading…
Cancel
Save