fix template effects

pull/16100/head
Rich Harris 3 months ago
parent c2a62070ee
commit 9d01d36649

@ -7,7 +7,7 @@ import { is_ignored } from '../../../../../state.js';
import { is_event_attribute } from '../../../../../utils/ast.js'; import { is_event_attribute } from '../../../../../utils/ast.js';
import * as b from '#compiler/builders'; import * as b from '#compiler/builders';
import { build_class_directives_object, build_style_directives_object } from '../RegularElement.js'; import { build_class_directives_object, build_style_directives_object } from '../RegularElement.js';
import { build_template_chunk, get_expression_id } from './utils.js'; import { build_expression, build_template_chunk, get_expression_id } from './utils.js';
/** /**
* @param {Array<AST.Attribute | AST.SpreadAttribute>} attributes * @param {Array<AST.Attribute | AST.SpreadAttribute>} attributes
@ -121,7 +121,7 @@ export function build_attribute_value(value, context, memoize = (value) => value
return { value: b.literal(chunk.data), has_state: false }; return { value: b.literal(chunk.data), has_state: false };
} }
let expression = /** @type {Expression} */ (context.visit(chunk.expression)); let expression = build_expression(context, chunk.expression, chunk.metadata.expression);
return { return {
value: memoize(expression, chunk.metadata.expression), value: memoize(expression, chunk.metadata.expression),

@ -66,7 +66,7 @@ export function build_template_chunk(
state.scope.get('undefined') state.scope.get('undefined')
) { ) {
let value = memoize( let value = memoize(
/** @type {Expression} */ (context.visit(node.expression, state)), build_expression(context, node.expression, node.metadata.expression, state),
node.metadata.expression node.metadata.expression
); );
@ -367,8 +367,8 @@ export function validate_mutation(node, context, expression) {
* @param {Expression} expression * @param {Expression} expression
* @param {ExpressionMetadata} metadata * @param {ExpressionMetadata} metadata
*/ */
export function build_expression(context, expression, metadata) { export function build_expression(context, expression, metadata, state = context.state) {
const value = /** @type {Expression} */ (context.visit(expression)); const value = /** @type {Expression} */ (context.visit(expression, state));
if (context.state.analysis.runes) { if (context.state.analysis.runes) {
return value; return value;
@ -385,7 +385,7 @@ export function build_expression(context, expression, metadata) {
continue; continue;
} }
var getter = build_getter({ ...binding.node }, context.state); var getter = build_getter({ ...binding.node }, state);
if (binding.kind === 'bindable_prop') { if (binding.kind === 'bindable_prop') {
getter = b.call('$.deep_read_state', getter); getter = b.call('$.deep_read_state', getter);

@ -5,8 +5,8 @@ export default test({
test({ assert, target }) { test({ assert, target }) {
const button = target.querySelector('button'); const button = target.querySelector('button');
assert.htmlEqual(target.innerHTML, `<div></div><button>inc</button> 10 - 10`); assert.htmlEqual(target.innerHTML, `<div></div><button data-foo="true">inc</button> 12 - 12`);
flushSync(() => button?.click()); flushSync(() => button?.click());
assert.htmlEqual(target.innerHTML, `<div></div><button>inc</button> 11 - 10`); assert.htmlEqual(target.innerHTML, `<div></div><button data-foo="true">inc</button> 13 - 12`);
} }
}); });

@ -30,7 +30,7 @@
{x} {x}
{/key} {/key}
<button on:click={() => count1++}>inc</button> <button data-foo={fn(true)} on:click={() => count1++}>{fn('inc')}</button>
{count1} - {count2} {count1} - {count2}

Loading…
Cancel
Save