|
|
|
@ -1,11 +1,11 @@
|
|
|
|
|
/** @import { Expression, Identifier, ObjectExpression } from 'estree' */
|
|
|
|
|
/** @import { AST } from '#compiler' */
|
|
|
|
|
/** @import { AST, ExpressionMetadata } from '#compiler' */
|
|
|
|
|
/** @import { ComponentClientTransformState, ComponentContext } from '../../types' */
|
|
|
|
|
import { normalize_attribute } from '../../../../../../utils.js';
|
|
|
|
|
import { is_ignored } from '../../../../../state.js';
|
|
|
|
|
import { is_event_attribute } from '../../../../../utils/ast.js';
|
|
|
|
|
import * as b from '../../../../../utils/builders.js';
|
|
|
|
|
import { build_getter, create_derived } from '../../utils.js';
|
|
|
|
|
import { build_getter } from '../../utils.js';
|
|
|
|
|
import { build_template_chunk, get_expression_id } from './utils.js';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -35,8 +35,10 @@ export function build_set_attributes(
|
|
|
|
|
|
|
|
|
|
for (const attribute of attributes) {
|
|
|
|
|
if (attribute.type === 'Attribute') {
|
|
|
|
|
const { value, has_state } = build_attribute_value(attribute.value, context, (value) =>
|
|
|
|
|
get_expression_id(context.state, value)
|
|
|
|
|
const { value, has_state } = build_attribute_value(
|
|
|
|
|
attribute.value,
|
|
|
|
|
context,
|
|
|
|
|
(value, metadata) => (metadata.has_call ? get_expression_id(context.state, value) : value)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
@ -59,10 +61,9 @@ export function build_set_attributes(
|
|
|
|
|
let value = /** @type {Expression} */ (context.visit(attribute));
|
|
|
|
|
|
|
|
|
|
if (attribute.metadata.expression.has_call) {
|
|
|
|
|
const id = b.id(state.scope.generate('spread_with_call'));
|
|
|
|
|
state.init.push(b.const(id, create_derived(state, b.thunk(value))));
|
|
|
|
|
value = b.call('$.get', id);
|
|
|
|
|
value = get_expression_id(context.state, value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
values.push(b.spread(value));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -111,8 +112,8 @@ export function build_style_directives(
|
|
|
|
|
let value =
|
|
|
|
|
directive.value === true
|
|
|
|
|
? build_getter({ name: directive.name, type: 'Identifier' }, context.state)
|
|
|
|
|
: build_attribute_value(directive.value, context, (value) =>
|
|
|
|
|
get_expression_id(context.state, value)
|
|
|
|
|
: build_attribute_value(directive.value, context, (value, metadata) =>
|
|
|
|
|
metadata.has_call ? get_expression_id(context.state, value) : value
|
|
|
|
|
).value;
|
|
|
|
|
|
|
|
|
|
const update = b.stmt(
|
|
|
|
@ -169,7 +170,7 @@ export function build_class_directives(
|
|
|
|
|
/**
|
|
|
|
|
* @param {AST.Attribute['value']} value
|
|
|
|
|
* @param {ComponentContext} context
|
|
|
|
|
* @param {(value: Expression) => Expression} memoize
|
|
|
|
|
* @param {(value: Expression, metadata: ExpressionMetadata) => Expression} memoize
|
|
|
|
|
* @returns {{ value: Expression, has_state: boolean }}
|
|
|
|
|
*/
|
|
|
|
|
export function build_attribute_value(value, context, memoize = (value) => value) {
|
|
|
|
@ -187,7 +188,7 @@ export function build_attribute_value(value, context, memoize = (value) => value
|
|
|
|
|
let expression = /** @type {Expression} */ (context.visit(chunk.expression));
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
value: chunk.metadata.expression.has_call ? memoize(expression) : expression,
|
|
|
|
|
value: memoize(expression, chunk.metadata.expression),
|
|
|
|
|
has_state: chunk.metadata.expression.has_state
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|