|
|
|
@ -4,12 +4,7 @@
|
|
|
|
|
import { dev, is_ignored } from '../../../../../state.js';
|
|
|
|
|
import { get_attribute_chunks, object } from '../../../../../utils/ast.js';
|
|
|
|
|
import * as b from '#compiler/builders';
|
|
|
|
|
import {
|
|
|
|
|
build_bind_this,
|
|
|
|
|
memoize_expression,
|
|
|
|
|
validate_binding,
|
|
|
|
|
add_svelte_meta
|
|
|
|
|
} from '../shared/utils.js';
|
|
|
|
|
import { add_svelte_meta, build_bind_this, Memoizer, validate_binding } from '../shared/utils.js';
|
|
|
|
|
import { build_attribute_value } from '../shared/element.js';
|
|
|
|
|
import { build_event_handler } from './events.js';
|
|
|
|
|
import { determine_slot } from '../../../../../utils/slot.js';
|
|
|
|
@ -48,6 +43,8 @@ export function build_component(node, component_name, context) {
|
|
|
|
|
/** @type {Record<string, Expression[]>} */
|
|
|
|
|
const events = {};
|
|
|
|
|
|
|
|
|
|
const memoizer = new Memoizer();
|
|
|
|
|
|
|
|
|
|
/** @type {Property[]} */
|
|
|
|
|
const custom_css_props = [];
|
|
|
|
|
|
|
|
|
@ -133,15 +130,13 @@ export function build_component(node, component_name, context) {
|
|
|
|
|
} else if (attribute.type === 'SpreadAttribute') {
|
|
|
|
|
const expression = /** @type {Expression} */ (context.visit(attribute));
|
|
|
|
|
if (attribute.metadata.expression.has_state) {
|
|
|
|
|
let value = expression;
|
|
|
|
|
|
|
|
|
|
if (attribute.metadata.expression.has_call) {
|
|
|
|
|
const id = b.id(context.state.scope.generate('spread_element'));
|
|
|
|
|
context.state.init.push(b.var(id, b.call('$.derived', b.thunk(value))));
|
|
|
|
|
value = b.call('$.get', id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
props_and_spreads.push(b.thunk(value));
|
|
|
|
|
props_and_spreads.push(
|
|
|
|
|
b.thunk(
|
|
|
|
|
attribute.metadata.expression.has_call
|
|
|
|
|
? b.call('$.get', memoizer.add(expression))
|
|
|
|
|
: expression
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
props_and_spreads.push(expression);
|
|
|
|
|
}
|
|
|
|
@ -150,10 +145,10 @@ export function build_component(node, component_name, context) {
|
|
|
|
|
custom_css_props.push(
|
|
|
|
|
b.init(
|
|
|
|
|
attribute.name,
|
|
|
|
|
build_attribute_value(attribute.value, context, (value, metadata) =>
|
|
|
|
|
build_attribute_value(attribute.value, context, (value, metadata) => {
|
|
|
|
|
// TODO put the derived in the local block
|
|
|
|
|
metadata.has_call ? memoize_expression(context.state, value) : value
|
|
|
|
|
).value
|
|
|
|
|
return metadata.has_call ? b.call('$.get', memoizer.add(value)) : value;
|
|
|
|
|
}).value
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
continue;
|
|
|
|
@ -184,7 +179,7 @@ export function build_component(node, component_name, context) {
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return should_wrap_in_derived ? memoize_expression(context.state, value) : value;
|
|
|
|
|
return should_wrap_in_derived ? b.call('$.get', memoizer.add(value)) : value;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
@ -444,7 +439,7 @@ export function build_component(node, component_name, context) {
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const statements = [...snippet_declarations];
|
|
|
|
|
const statements = [...snippet_declarations, ...memoizer.deriveds(context.state.analysis.runes)];
|
|
|
|
|
|
|
|
|
|
if (is_component_dynamic) {
|
|
|
|
|
const prev = fn;
|
|
|
|
@ -492,5 +487,7 @@ export function build_component(node, component_name, context) {
|
|
|
|
|
statements.push(add_svelte_meta(fn(anchor), node, 'component', { componentTag: node.name }));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memoizer.apply();
|
|
|
|
|
|
|
|
|
|
return statements.length > 1 ? b.block(statements) : statements[0];
|
|
|
|
|
}
|
|
|
|
|