From 7d6b60391ef83061cdfed287bdd63f6775477b60 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 27 Jun 2025 09:43:48 -0400 Subject: [PATCH] dry out --- .../phases/3-transform/client/visitors/RenderTag.js | 6 ++++-- .../phases/3-transform/client/visitors/SlotElement.js | 6 ++++-- .../3-transform/client/visitors/shared/component.js | 6 ++++-- .../phases/3-transform/client/visitors/shared/element.js | 3 +-- .../phases/3-transform/client/visitors/shared/utils.js | 8 ++++++-- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RenderTag.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RenderTag.js index 5255693fe3..83604380ca 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RenderTag.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RenderTag.js @@ -67,13 +67,15 @@ export function RenderTag(node, context) { ); } - if (memoizer.async.length > 0) { + const async_values = memoizer.async_values(); + + if (async_values) { context.state.init.push( b.stmt( b.call( '$.async', context.state.node, - b.array(memoizer.async.map((memo) => b.thunk(memo.expression, true))), + memoizer.async_values(), b.arrow( [context.state.node, ...memoizer.async.map((memo) => memo.id)], b.block(statements) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SlotElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SlotElement.js index 70de454c0e..1f5a13ffaf 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SlotElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SlotElement.js @@ -76,13 +76,15 @@ export function SlotElement(node, context) { b.stmt(b.call('$.slot', context.state.node, b.id('$$props'), name, props_expression, fallback)) ); - if (memoizer.async.length > 0) { + const async_values = memoizer.async_values(); + + if (async_values) { context.state.init.push( b.stmt( b.call( '$.async', context.state.node, - b.array(memoizer.async.map((memo) => b.thunk(memo.expression, true))), + async_values, b.arrow( [context.state.node, ...memoizer.async.map((memo) => memo.id)], b.block(statements) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 77535cf16e..96a9b776b6 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -501,12 +501,14 @@ export function build_component(node, component_name, context) { memoizer.apply(); - if (memoizer.async.length > 0) { + const async_values = memoizer.async_values(); + + if (async_values) { return b.stmt( b.call( '$.async', anchor, - b.array(memoizer.async.map(({ expression }) => b.thunk(expression, true))), + async_values, b.arrow([b.id('$$anchor'), ...memoizer.async.map(({ id }) => id)], b.block(statements)) ) ); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/element.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/element.js index 8da489409b..40c19c2b64 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/element.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/element.js @@ -91,8 +91,7 @@ export function build_attribute_effect( ), memoizer.sync.length > 0 && b.array(memoizer.sync.map(({ expression }) => b.thunk(expression))), - memoizer.async.length > 0 && - b.array(memoizer.async.map(({ expression }) => b.thunk(expression, true))), + memoizer.async_values(), element.metadata.scoped && context.state.analysis.css.hash !== '' && b.literal(context.state.analysis.css.hash), diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js index ed9b8ad8a4..45b368034c 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js @@ -38,6 +38,11 @@ export class Memoizer { return all; } + + async_values() { + if (this.async.length === 0) return; + return b.array(this.async.map((memo) => b.thunk(memo.expression, true))); + } } /** @@ -155,8 +160,7 @@ export function build_render_statement(state) { : b.block(state.update) ), all.length > 0 && b.array(memoizer.sync.map(({ expression }) => b.thunk(expression))), - memoizer.async.length > 0 && - b.array(memoizer.async.map(({ expression }) => b.thunk(expression, true))) + memoizer.async_values() ) ); }