From 20c9695e7befb3e1002e672eb43ff68edac43bed Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 25 Jul 2024 17:31:40 -0400 Subject: [PATCH] simplify --- .../server/visitors/AssignmentExpression.js | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js index 1d82d3e302..550f3ad18e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/AssignmentExpression.js @@ -29,29 +29,21 @@ function serialize_assignment(node, context, is_standalone, fallback) { node.left.type === 'RestElement' ) { const value = /** @type {Expression} */ (context.visit(node.right)); - const should_cache = value.type !== 'Identifier'; const rhs = should_cache ? b.id('$$value') : value; - /** @type {Expression[]} */ - const assignments = []; - let should_transform = false; + let unchanged = 0; - for (const path of extract_paths(node.left)) { + const assignments = extract_paths(node.left).map((path) => { const assignment = b.assignment('=', path.node, path.expression?.(rhs)); - let changed = true; - - assignments.push( - serialize_assignment(assignment, context, false, () => { - changed = false; - return assignment; - }) - ); - should_transform ||= changed; - } + return serialize_assignment(assignment, context, false, () => { + unchanged += 1; + return assignment; + }); + }); - if (!should_transform) { + if (unchanged === assignments.length) { // No change to output -> nothing to transform -> we can keep the original assignment return fallback(); } @@ -64,6 +56,7 @@ function serialize_assignment(node, context, is_standalone, fallback) { } if (should_cache) { + // the right hand side is a complex expression, wrap in an IIFE to cache it return b.call(b.arrow([rhs], sequence), value); }