pull/17038/head
Rich Harris 1 week ago
parent 8638d22ac7
commit 75867c43a4

@ -23,10 +23,10 @@ export function RenderTag(node, context) {
const arg = /** @type {Expression} */ (call.arguments[i]); const arg = /** @type {Expression} */ (call.arguments[i]);
const metadata = node.metadata.arguments[i]; const metadata = node.metadata.arguments[i];
let expression = build_expression(context, arg, metadata); let expression = memoizer.add(build_expression(context, arg, metadata), metadata);
if (metadata.has_await || metadata.has_call) { if (metadata.has_await || metadata.has_call) {
expression = b.call('$.get', memoizer.add(expression, metadata)); expression = b.call('$.get', expression);
} }
args.push(b.thunk(expression)); args.push(b.thunk(expression));

@ -25,8 +25,12 @@ export function AwaitBlock(node, context) {
) )
); );
if (node.metadata.expression.has_await) { if (node.metadata.expression.is_async()) {
statement = create_async_block(b.block([statement])); statement = create_async_block(
b.block([statement]),
node.metadata.expression.blockers(),
node.metadata.expression.has_await
);
} }
context.state.template.push(statement, block_close); context.state.template.push(statement, block_close);

@ -3,32 +3,48 @@
/** @import { ComponentContext } from '../types.js' */ /** @import { ComponentContext } from '../types.js' */
import { unwrap_optional } from '../../../../utils/ast.js'; import { unwrap_optional } from '../../../../utils/ast.js';
import * as b from '#compiler/builders'; import * as b from '#compiler/builders';
import { empty_comment } from './shared/utils.js'; import { create_async_block, empty_comment, PromiseOptimiser } from './shared/utils.js';
/** /**
* @param {AST.RenderTag} node * @param {AST.RenderTag} node
* @param {ComponentContext} context * @param {ComponentContext} context
*/ */
export function RenderTag(node, context) { export function RenderTag(node, context) {
const optimiser = new PromiseOptimiser();
const callee = unwrap_optional(node.expression).callee; const callee = unwrap_optional(node.expression).callee;
const raw_args = unwrap_optional(node.expression).arguments; const raw_args = unwrap_optional(node.expression).arguments;
const snippet_function = /** @type {Expression} */ (context.visit(callee)); const snippet_function = optimiser.transform(
/** @type {Expression} */ (context.visit(callee)),
node.metadata.expression
);
const snippet_args = raw_args.map((arg) => { const snippet_args = raw_args.map((arg, i) => {
return /** @type {Expression} */ (context.visit(arg)); return optimiser.transform(
/** @type {Expression} */ (context.visit(arg)),
node.metadata.arguments[i]
);
}); });
context.state.template.push( let statement = b.stmt(
b.stmt( (node.expression.type === 'CallExpression' ? b.call : b.maybe_call)(
(node.expression.type === 'CallExpression' ? b.call : b.maybe_call)( snippet_function,
snippet_function, b.id('$$renderer'),
b.id('$$renderer'), ...snippet_args
...snippet_args
)
) )
); );
if (optimiser.is_async()) {
statement = create_async_block(
b.block([optimiser.apply(), statement]),
optimiser.blockers(),
optimiser.has_await
);
}
context.state.template.push(statement);
if (!context.state.skip_hydration_boundaries) { if (!context.state.skip_hydration_boundaries) {
context.state.template.push(empty_comment); context.state.template.push(empty_comment);
} }

@ -65,10 +65,13 @@ export function SlotElement(node, context) {
fallback fallback
); );
const statement = const statement = optimiser.is_async()
optimiser.expressions.length > 0 ? create_async_block(
? create_async_block(b.block([optimiser.apply(), b.stmt(slot)])) b.block([optimiser.apply(), b.stmt(slot)]),
: b.stmt(slot); optimiser.blockers(),
optimiser.has_await
)
: b.stmt(slot);
context.state.template.push(block_open, statement, block_close); context.state.template.push(block_open, statement, block_close);
} }

Loading…
Cancel
Save