handle destructuring assignments in template

pull/1839/head
Rich Harris 7 years ago
parent 1eab084122
commit a534c66d5b

@ -2,7 +2,7 @@ import Component from '../../Component';
import { walk } from 'estree-walker';
import isReference from 'is-reference';
import flattenReference from '../../../utils/flattenReference';
import { createScopes, Scope } from '../../../utils/annotateWithScopes';
import { createScopes, Scope, extractNames } from '../../../utils/annotateWithScopes';
import { Node } from '../../../interfaces';
import globalWhitelist from '../../../utils/globalWhitelist';
import deindent from '../../../utils/deindent';
@ -247,9 +247,15 @@ export default class Expression {
if (function_expression) {
if (node.type === 'AssignmentExpression') {
// TODO handle destructuring assignments
const { name } = getObject(node.left);
pending_assignments.add(name);
const names = node.left.type === 'MemberExpression'
? [getObject(node.left).name]
: extractNames(node.left);
names.forEach(name => {
if (!scope.declarations.has(name)) {
pending_assignments.add(name);
}
});
}
} else {
if (node.type === 'AssignmentExpression') {

@ -1,5 +1,5 @@
<script>
export let x = 0;
let x = 0;
function foo() {
({ x } = { x: 1 });

@ -0,0 +1,29 @@
export default {
html: `
<button>foo</button>
<button>bar</button>
<p>x: 0</p>
`,
async test({ assert, component, target, window }) {
const buttons = target.querySelectorAll('button');
const click = new window.MouseEvent('click');
await buttons[0].dispatchEvent(click);
assert.htmlEqual(target.innerHTML, `
<button>foo</button>
<button>bar</button>
<p>x: 1</p>
`);
await buttons[1].dispatchEvent(click);
assert.htmlEqual(target.innerHTML, `
<button>foo</button>
<button>bar</button>
<p>x: 2</p>
`);
}
};

@ -0,0 +1,8 @@
<script>
let x = 0;
</script>
<button on:click="{() => ({ x } = { x: 1 })}">foo</button>
<button on:click="{() => ([x] = [2])}">bar</button>
<p>x: {x}</p>
Loading…
Cancel
Save