simplify/fix

pull/16757/head
Rich Harris 1 week ago
parent f232aac240
commit 63e1571113

@ -1,4 +1,5 @@
/** @import { AST } from '#compiler' */ /** @import { AST } from '#compiler' */
import * as b from '#compiler/builders';
/** /**
* @param {any} transparent * @param {any} transparent
@ -13,7 +14,7 @@ export function create_fragment(transparent = false) {
dynamic: false, dynamic: false,
has_await: false, has_await: false,
// name is added later, after we've done scope analysis // name is added later, after we've done scope analysis
hoisted_promises: { name: '', promises: [] } hoisted_promises: { id: b.id('$$promises'), promises: [] }
} }
}; };
} }

@ -21,11 +21,7 @@ export function AwaitExpression(node, context) {
const len = context.state.fragment.metadata.hoisted_promises.promises.push(node.argument); const len = context.state.fragment.metadata.hoisted_promises.promises.push(node.argument);
context.state.analysis.hoisted_promises.set( context.state.analysis.hoisted_promises.set(
node.argument, node.argument,
b.member( b.member(context.state.fragment.metadata.hoisted_promises.id, b.literal(len - 1), true)
b.id(context.state.fragment.metadata.hoisted_promises.name),
b.literal(len - 1),
true
)
); );
} }

@ -14,9 +14,7 @@ export function Fragment(node, context) {
// and it works, so for now I'm doing it like this // and it works, so for now I'm doing it like this
node.metadata.is_async = node.metadata.hoisted_promises.promises.length > 0; node.metadata.is_async = node.metadata.hoisted_promises.promises.length > 0;
if (node.metadata.hoisted_promises.promises.length > 1) { if (node.metadata.hoisted_promises.promises.length === 1) {
node.metadata.hoisted_promises.name = context.state.scope.generate('promises');
} else {
// if there's only one promise in this fragment, we don't need to de-waterfall it // if there's only one promise in this fragment, we don't need to de-waterfall it
context.state.analysis.hoisted_promises.delete(node.metadata.hoisted_promises.promises[0]); context.state.analysis.hoisted_promises.delete(node.metadata.hoisted_promises.promises[0]);
node.metadata.hoisted_promises.promises.length = 0; node.metadata.hoisted_promises.promises.length = 0;

@ -49,10 +49,7 @@ export function Fragment(node, context) {
if (node.metadata.hoisted_promises.promises.length > 0) { if (node.metadata.hoisted_promises.promises.length > 0) {
return b.block([ return b.block([
b.const( b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises)),
node.metadata.hoisted_promises.name,
b.array(node.metadata.hoisted_promises.promises)
),
...state.init, ...state.init,
call_child_payload(b.block(build_template(state.template)), true) call_child_payload(b.block(build_template(state.template)), true)
]); ]);

@ -195,7 +195,7 @@ export function RegularElement(node, context) {
if (node.fragment.metadata.hoisted_promises.promises.length > 0) { if (node.fragment.metadata.hoisted_promises.promises.length > 0) {
state.template.push( state.template.push(
b.const( b.const(
node.fragment.metadata.hoisted_promises.name, node.fragment.metadata.hoisted_promises.id,
b.array(node.fragment.metadata.hoisted_promises.promises) b.array(node.fragment.metadata.hoisted_promises.promises)
) )
); );

@ -57,7 +57,7 @@ export namespace AST {
*/ */
dynamic: boolean; dynamic: boolean;
has_await: boolean; has_await: boolean;
hoisted_promises: { name: string; promises: Expression[] }; hoisted_promises: { id: Identifier; promises: Expression[] };
}; };
} }

Loading…
Cancel
Save