diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 78715415f2..a0ee6a5564 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -592,11 +592,11 @@ export default class Component { if (node.body.type !== 'ExpressionStatement') return; if (node.body.expression.type !== 'AssignmentExpression') return; - const { type, name } = node.body.expression.left; - - if (type === 'Identifier' && !this.var_lookup.has(name) && name[0] !== '$') { - this.injected_reactive_declaration_vars.add(name); - } + extract_names(node.body.expression.left).forEach(name => { + if (!this.var_lookup.has(name) && name[0] !== '$') { + this.injected_reactive_declaration_vars.add(name); + } + }); }); let { scope: instance_scope, map, globals } = create_scopes(script.content); @@ -1058,9 +1058,15 @@ export default class Component { } if (node.type === 'AssignmentExpression') { - const identifier = get_object(node.left) - assignee_nodes.add(identifier); - assignees.add(identifier.name); + if (node.left.type === 'MemberExpression' || node.left.type === 'Identifier') { + const identifier = get_object(node.left) + assignee_nodes.add(identifier); + assignees.add(identifier.name); + } else { + extract_names(node.left).forEach(name => { + assignees.add(name); + }); + } } else if (node.type === 'UpdateExpression') { const identifier = get_object(node.argument); assignees.add(identifier.name); @@ -1097,9 +1103,9 @@ export default class Component { injected: ( node.body.type === 'ExpressionStatement' && node.body.expression.type === 'AssignmentExpression' && - node.body.expression.left.type === 'Identifier' && - node.body.expression.left.name[0] !== '$' && - this.var_lookup.get(node.body.expression.left.name).injected + extract_names(node.body.expression.left).every(name => { + return name[0] !== '$' && this.var_lookup.get(name).injected; + }) ) }); } diff --git a/test/runtime/samples/reactive-values-implicit-destructured/_config.js b/test/runtime/samples/reactive-values-implicit-destructured/_config.js new file mode 100644 index 0000000000..f5e6b1784c --- /dev/null +++ b/test/runtime/samples/reactive-values-implicit-destructured/_config.js @@ -0,0 +1,16 @@ +export default { + props: { + coords: [0, 0] + }, + + html: ` +

0,0

+ `, + + test({ assert, component, target }) { + component.coords = [1, 2]; + assert.htmlEqual(target.innerHTML, ` +

1,2

+ `); + } +}; diff --git a/test/runtime/samples/reactive-values-implicit-destructured/main.svelte b/test/runtime/samples/reactive-values-implicit-destructured/main.svelte new file mode 100644 index 0000000000..0f49ebb590 --- /dev/null +++ b/test/runtime/samples/reactive-values-implicit-destructured/main.svelte @@ -0,0 +1,7 @@ + + +

{x},{y}

\ No newline at end of file