fix invalidation in ++foo.bar (#4395)

pull/4404/head
Conduitry 5 years ago committed by GitHub
parent 59a5d4a52c
commit 0625fc218b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -9,6 +9,7 @@
* Permit reserved keywords as destructuring keys in `{#each}` ([#4372](https://github.com/sveltejs/svelte/issues/4372))
* Disallow reserved keywords in `{expressions}` ([#4372](https://github.com/sveltejs/svelte/issues/4372))
* Fix code generation error with precedence of arrow functions ([#4384](https://github.com/sveltejs/svelte/issues/4384))
* Fix invalidation in expressions like `++foo.bar` ([#4393](https://github.com/sveltejs/svelte/issues/4393))
## 3.18.1

@ -49,7 +49,7 @@ export function invalidate(renderer: Renderer, scope: Scope, node: Node, names:
const pass_value = (
extra_args.length > 0 ||
(node.type === 'AssignmentExpression' && node.left.type !== 'Identifier') ||
(node.type === 'UpdateExpression' && !node.prefix)
(node.type === 'UpdateExpression' && (!node.prefix || node.argument.type !== 'Identifier'))
);
if (pass_value) {

@ -0,0 +1,31 @@
export default {
html: `
<p>0</p>
<button>foo++</button>
<button>++foo</button>
<p>0</p>
<button>bar.bar++</button>
<button>++bar.bar</button>
`,
async test({ assert, target, window }) {
const [foo, bar] = target.querySelectorAll('p');
const [button1, button2, button3, button4] = target.querySelectorAll('button');
const event = new window.MouseEvent('click');
await button1.dispatchEvent(event);
assert.equal(foo.innerHTML, '1');
assert.equal(bar.innerHTML, '0');
await button2.dispatchEvent(event);
assert.equal(foo.innerHTML, '2');
assert.equal(bar.innerHTML, '0');
await button3.dispatchEvent(event);
assert.equal(foo.innerHTML, '2');
assert.equal(bar.innerHTML, '1');
await button4.dispatchEvent(event);
assert.equal(foo.innerHTML, '2');
assert.equal(bar.innerHTML, '2');
}
};

@ -0,0 +1,14 @@
<script>
let foo = 0;
let bar = { bar: 0 };
</script>
<p>{foo}</p>
<button on:click={() => foo++}>foo++</button>
<button on:click={() => ++foo}>++foo</button>
<p>{bar.bar}</p>
<button on:click={() => bar.bar++}>bar.bar++</button>
<button on:click={() => ++bar.bar}>++bar.bar</button>
Loading…
Cancel
Save