we should keep this logic out of b.set, since it's very specific to accessors

pull/10797/head
Rich Harris 2 years ago
parent 2f0519186d
commit 43e97b8987

@ -255,16 +255,23 @@ export function client_component(source, analysis, options) {
const key = binding.prop_alias ?? name; const key = binding.prop_alias ?? name;
properties.push( const getter = b.get(key, [b.return(b.call(b.id(name)))]);
b.get(key, [b.return(b.call(b.id(name)))]),
b.set( const setter = b.set(key, [
key, b.stmt(b.call(b.id(name), b.id('$$value'))),
[b.stmt(b.call(b.id(name), b.id('$$value'))), b.stmt(b.call('$.flushSync'))], b.stmt(b.call('$.flushSync'))
analysis.runes && binding.initial ]);
? /** @type {import('estree').Expression} */ (binding.initial)
: undefined if (binding.initial) {
) // turn `set foo($$value)` into `set foo($$value = expression)`
); setter.value.params[0] = {
type: 'AssignmentPattern',
left: b.id('$$value'),
right: /** @type {import('estree').Expression} */ (binding.initial)
};
}
properties.push(getter, setter);
} }
} }

@ -210,7 +210,7 @@ export function function_declaration(id, params, body) {
/** /**
* @param {string} name * @param {string} name
* @param {import('estree').Statement[]} body * @param {import('estree').Statement[]} body
* @returns {import('estree').Property} * @returns {import('estree').Property & { value: import('estree').FunctionExpression}}}
*/ */
export function get(name, body) { export function get(name, body) {
return prop('get', key(name), function_builder(null, [], block(body))); return prop('get', key(name), function_builder(null, [], block(body)));
@ -305,11 +305,12 @@ export function object_pattern(properties) {
} }
/** /**
* @template {import('estree').Expression} Value
* @param {'init' | 'get' | 'set'} kind * @param {'init' | 'get' | 'set'} kind
* @param {import('estree').Expression} key * @param {import('estree').Expression} key
* @param {import('estree').Expression} value * @param {Value} value
* @param {boolean} computed * @param {boolean} computed
* @returns {import('estree').Property} * @returns {import('estree').Property & { value: Value }}
*/ */
export function prop(kind, key, value, computed = false) { export function prop(kind, key, value, computed = false) {
return { type: 'Property', kind, key, value, method: false, shorthand: false, computed }; return { type: 'Property', kind, key, value, method: false, shorthand: false, computed };
@ -355,23 +356,10 @@ export function sequence(expressions) {
/** /**
* @param {string} name * @param {string} name
* @param {import('estree').Statement[]} body * @param {import('estree').Statement[]} body
* @param {import('estree').Expression | null} [fallback] * @returns {import('estree').Property & { value: import('estree').FunctionExpression}}
* @returns {import('estree').Property}
*/ */
export function set(name, body, fallback) { export function set(name, body) {
return prop( return prop('set', key(name), function_builder(null, [id('$$value')], block(body)));
'set',
key(name),
function_builder(
null,
[
fallback
? { type: 'AssignmentPattern', left: id('$$value'), right: fallback }
: id('$$value')
],
block(body)
)
);
} }
/** /**

Loading…
Cancel
Save