out-of-order-rendering
Rich Harris 3 days ago
parent 249faa5588
commit 271623f6b2

@ -269,7 +269,7 @@ export function RegularElement(node, context) {
context,
(value, metadata) =>
metadata.has_call || metadata.has_await
? context.state.memoizer.add(value, metadata.has_await)
? context.state.memoizer.add(value, metadata)
: value
);
@ -511,7 +511,7 @@ export function build_class_directives_object(
const directives = b.object(properties);
return has_call_or_state || has_await ? memoizer.add(directives, has_await) : directives;
return has_call_or_state || has_await ? memoizer.add(directives, metadata) : directives;
}
/**
@ -546,7 +546,7 @@ export function build_style_directives_object(
const directives = important.properties.length ? b.array([normal, important]) : normal;
return has_call_or_state || has_await ? memoizer.add(directives, has_await) : directives;
return has_call_or_state || has_await ? memoizer.add(directives, metadata) : directives;
}
/**
@ -675,7 +675,7 @@ function build_element_special_value_attribute(
element === 'select' && attribute.value !== true && !is_text_attribute(attribute);
const { value, has_state } = build_attribute_value(attribute.value, context, (value, metadata) =>
metadata.has_call || metadata.has_await ? state.memoizer.add(value, metadata.has_await) : value
metadata.has_call || metadata.has_await ? state.memoizer.add(value, metadata) : value
);
const evaluated = context.state.scope.evaluate(value);

@ -26,7 +26,7 @@ export function RenderTag(node, context) {
let expression = build_expression(context, arg, metadata);
if (metadata.has_await || metadata.has_call) {
expression = b.call('$.get', memoizer.add(expression, metadata.has_await));
expression = b.call('$.get', memoizer.add(expression, metadata));
}
args.push(b.thunk(expression));

@ -35,7 +35,7 @@ export function SlotElement(node, context) {
context,
(value, metadata) =>
metadata.has_call || metadata.has_await
? b.call('$.get', memoizer.add(value, metadata.has_await))
? b.call('$.get', memoizer.add(value, metadata))
: value
);

@ -134,7 +134,7 @@ export function build_component(node, component_name, context) {
props_and_spreads.push(
b.thunk(
attribute.metadata.expression.has_await || attribute.metadata.expression.has_call
? b.call('$.get', memoizer.add(expression, attribute.metadata.expression.has_await))
? b.call('$.get', memoizer.add(expression, attribute.metadata.expression))
: expression
)
);
@ -149,7 +149,7 @@ export function build_component(node, component_name, context) {
build_attribute_value(attribute.value, context, (value, metadata) => {
// TODO put the derived in the local block
return metadata.has_call || metadata.has_await
? b.call('$.get', memoizer.add(value, metadata.has_await))
? b.call('$.get', memoizer.add(value, metadata))
: value;
}).value
)
@ -184,9 +184,7 @@ export function build_component(node, component_name, context) {
);
});
return should_wrap_in_derived
? b.call('$.get', memoizer.add(value, metadata.has_await))
: value;
return should_wrap_in_derived ? b.call('$.get', memoizer.add(value, metadata)) : value;
}
);

@ -35,7 +35,7 @@ export function build_attribute_effect(
for (const attribute of attributes) {
if (attribute.type === 'Attribute') {
const { value } = build_attribute_value(attribute.value, context, (value, metadata) =>
metadata.has_call || metadata.has_await ? memoizer.add(value, metadata.has_await) : value
metadata.has_call || metadata.has_await ? memoizer.add(value, metadata) : value
);
if (
@ -53,7 +53,7 @@ export function build_attribute_effect(
let value = /** @type {Expression} */ (context.visit(attribute));
if (attribute.metadata.expression.has_call || attribute.metadata.expression.has_await) {
value = memoizer.add(value, attribute.metadata.expression.has_await);
value = memoizer.add(value, attribute.metadata.expression);
}
values.push(b.spread(value));
@ -156,7 +156,7 @@ export function build_set_class(element, node_id, attribute, class_directives, c
}
return metadata.has_call || metadata.has_await
? context.state.memoizer.add(value, metadata.has_await)
? context.state.memoizer.add(value, metadata)
: value;
});
@ -227,7 +227,7 @@ export function build_set_class(element, node_id, attribute, class_directives, c
*/
export function build_set_style(node_id, attribute, style_directives, context) {
let { value, has_state } = build_attribute_value(attribute.value, context, (value, metadata) =>
metadata.has_call ? context.state.memoizer.add(value, metadata.has_await) : value
metadata.has_call ? context.state.memoizer.add(value, metadata) : value
);
/** @type {Identifier | undefined} */

@ -23,12 +23,12 @@ export class Memoizer {
/**
* @param {Expression} expression
* @param {boolean} has_await
* @param {ExpressionMetadata} metadata
*/
add(expression, has_await) {
add(expression, metadata) {
const id = b.id('#'); // filled in later
(has_await ? this.#async : this.#sync).push({ id, expression });
(metadata.has_await ? this.#async : this.#sync).push({ id, expression });
return id;
}
@ -73,7 +73,7 @@ export function build_template_chunk(
context,
state = context.state,
memoize = (value, metadata) =>
metadata.has_call || metadata.has_await ? state.memoizer.add(value, metadata.has_await) : value
metadata.has_call || metadata.has_await ? state.memoizer.add(value, metadata) : value
) {
/** @type {Expression[]} */
const expressions = [];

Loading…
Cancel
Save