From 158013473fc371b35d56c556e420e1a2e4ce5bb1 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 25 Oct 2025 19:02:30 -0400 Subject: [PATCH] WIP --- .../phases/2-analyze/visitors/AwaitExpression.js | 9 +++------ .../phases/3-transform/client/visitors/Program.js | 9 +++++---- .../phases/3-transform/server/visitors/Program.js | 9 +++++---- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js index a886d709ff..22a89db76e 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js @@ -10,16 +10,13 @@ import * as e from '../../../errors.js'; export function AwaitExpression(node, context) { const tla = context.state.ast_type === 'instance' && context.state.function_depth === 1; - // preserve context for - // a) top-level await and - // b) awaits that precede other expressions in template or `$derived(...)` + // preserve context for awaits that precede other expressions in template or `$derived(...)` if ( - tla || - (is_reactive_expression( + is_reactive_expression( context.path, context.state.derived_function_depth === context.state.function_depth ) && - !is_last_evaluated_expression(context.path, node)) + !is_last_evaluated_expression(context.path, node) ) { context.state.analysis.pickled_awaits.add(node); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Program.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Program.js index a4cd4d0eda..804bb64c6c 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Program.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Program.js @@ -314,10 +314,11 @@ function transform_body(program, context) { } if (s.node.type === 'ExpressionStatement') { - return b.thunk( - b.unary('void', /** @type {Expression} */ (context.visit(s.node.expression))), - s.has_await - ); + const expression = /** @type {Expression} */ (context.visit(s.node.expression)); + + return expression.type === 'AwaitExpression' + ? b.thunk(expression, true) + : b.thunk(b.unary('void', expression), s.has_await); } return b.thunk(b.block([/** @type {Statement} */ (context.visit(s.node))]), s.has_await); diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/Program.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/Program.js index fa51611cfd..76c2fe4e22 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/Program.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/Program.js @@ -184,10 +184,11 @@ function transform_body(program, context) { } if (s.node.type === 'ExpressionStatement') { - return b.thunk( - b.unary('void', /** @type {Expression} */ (context.visit(s.node.expression))), - s.has_await - ); + const expression = /** @type {Expression} */ (context.visit(s.node.expression)); + + return expression.type === 'AwaitExpression' + ? b.thunk(expression, true) + : b.thunk(b.unary('void', expression), s.has_await); } return b.thunk(b.block([/** @type {Statement} */ (context.visit(s.node))]), s.has_await);