simplify/fix

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

@ -1,4 +1,5 @@
/** @import { AST } from '#compiler' */
import * as b from '#compiler/builders';
/**
* @param {any} transparent
@ -13,7 +14,7 @@ export function create_fragment(transparent = false) {
dynamic: false,
has_await: false,
// 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);
context.state.analysis.hoisted_promises.set(
node.argument,
b.member(
b.id(context.state.fragment.metadata.hoisted_promises.name),
b.literal(len - 1),
true
)
b.member(context.state.fragment.metadata.hoisted_promises.id, 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
node.metadata.is_async = node.metadata.hoisted_promises.promises.length > 0;
if (node.metadata.hoisted_promises.promises.length > 1) {
node.metadata.hoisted_promises.name = context.state.scope.generate('promises');
} else {
if (node.metadata.hoisted_promises.promises.length === 1) {
// 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]);
node.metadata.hoisted_promises.promises.length = 0;

@ -49,10 +49,7 @@ export function Fragment(node, context) {
if (node.metadata.hoisted_promises.promises.length > 0) {
return b.block([
b.const(
node.metadata.hoisted_promises.name,
b.array(node.metadata.hoisted_promises.promises)
),
b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises)),
...state.init,
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) {
state.template.push(
b.const(
node.fragment.metadata.hoisted_promises.name,
node.fragment.metadata.hoisted_promises.id,
b.array(node.fragment.metadata.hoisted_promises.promises)
)
);

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

Loading…
Cancel
Save