diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 1b843e9ca2..7ff56dfa2d 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1042,15 +1042,17 @@ export default class Component { } if (node.type === 'AssignmentExpression') { - assignees.add(getObject(node.left).name); + const { name } = getObject(node.left) + assignees.add(name); + dependencies.delete(name); } else if (node.type === 'UpdateExpression') { - assignees.add(getObject(node.argument).name); + const { name } = getObject(node.argument); + assignees.add(name); + dependencies.delete(name); } else if (isReference(node, parent)) { - const object = getObject(node); - const { name } = object; - + const { name } = getObject(node); const owner = scope.findOwner(name); - if ((!owner || owner === component.instance_scope) && (name[0] === '$' || component.var_lookup.has(name))) { + if ((!owner || owner === component.instance_scope) && (name[0] === '$' || component.var_lookup.has(name)) && !assignees.has(name)) { dependencies.add(name); } diff --git a/test/js/samples/dev-warning-missing-data-computed/expected.js b/test/js/samples/dev-warning-missing-data-computed/expected.js index e3dff9649d..dcd1078a6d 100644 --- a/test/js/samples/dev-warning-missing-data-computed/expected.js +++ b/test/js/samples/dev-warning-missing-data-computed/expected.js @@ -56,8 +56,8 @@ function instance($$self, $$props, $$invalidate) { if ('foo' in $$props) $$invalidate('foo', foo = $$props.foo); }; - $$self.$$.update = ($$dirty = { bar: 1, foo: 1 }) => { - if ($$dirty.bar || $$dirty.foo) { + $$self.$$.update = ($$dirty = { foo: 1 }) => { + if ($$dirty.foo) { bar = foo * 2; $$invalidate('bar', bar); } }; diff --git a/test/js/samples/reactive-values-non-topologically-ordered/expected.js b/test/js/samples/reactive-values-non-topologically-ordered/expected.js index de1a4cdc8c..edf98e9613 100644 --- a/test/js/samples/reactive-values-non-topologically-ordered/expected.js +++ b/test/js/samples/reactive-values-non-topologically-ordered/expected.js @@ -22,11 +22,11 @@ function instance($$self, $$props, $$invalidate) { if ('x' in $$props) $$invalidate('x', x = $$props.x); }; - $$self.$$.update = ($$dirty = { b: 1, x: 1, a: 1 }) => { - if ($$dirty.b || $$dirty.x) { + $$self.$$.update = ($$dirty = { x: 1, b: 1 }) => { + if ($$dirty.x) { b = x; $$invalidate('b', b); } - if ($$dirty.a || $$dirty.b) { + if ($$dirty.b) { a = b; $$invalidate('a', a); } }; diff --git a/test/js/samples/reactive-values-non-writable-dependencies/expected.js b/test/js/samples/reactive-values-non-writable-dependencies/expected.js index fc2ca37d31..42f57a0037 100644 --- a/test/js/samples/reactive-values-non-writable-dependencies/expected.js +++ b/test/js/samples/reactive-values-non-writable-dependencies/expected.js @@ -17,12 +17,12 @@ let a = 1; let b = 2; function instance($$self, $$props, $$invalidate) { - + let max; - $$self.$$.update = ($$dirty = { max: 1, Math: 1, a: 1, b: 1 }) => { - if ($$dirty.max || $$dirty.a || $$dirty.b) { + $$self.$$.update = ($$dirty = { Math: 1, a: 1, b: 1 }) => { + if ($$dirty.a || $$dirty.b) { max = Math.max(a, b); $$invalidate('max', max); } }; diff --git a/test/runtime/samples/reactive-values-readonly/_config.js b/test/runtime/samples/reactive-values-overwrite/_config.js similarity index 76% rename from test/runtime/samples/reactive-values-readonly/_config.js rename to test/runtime/samples/reactive-values-overwrite/_config.js index bf5c9dbb67..644a49ec0d 100644 --- a/test/runtime/samples/reactive-values-readonly/_config.js +++ b/test/runtime/samples/reactive-values-overwrite/_config.js @@ -11,11 +11,11 @@ export default {
doubled: 4
`); - component.doubled = 6; + component.doubled = 3; - assert.equal(component.doubled, 4); + assert.equal(component.doubled, 3); assert.htmlEqual(target.innerHTML, ` -doubled: 4
+doubled: 3
`); } }; diff --git a/test/runtime/samples/reactive-values-readonly/main.svelte b/test/runtime/samples/reactive-values-overwrite/main.svelte similarity index 100% rename from test/runtime/samples/reactive-values-readonly/main.svelte rename to test/runtime/samples/reactive-values-overwrite/main.svelte diff --git a/test/runtime/samples/reactive-values-subscript-assignment/_config.js b/test/runtime/samples/reactive-values-subscript-assignment/_config.js new file mode 100644 index 0000000000..e29fe2c676 --- /dev/null +++ b/test/runtime/samples/reactive-values-subscript-assignment/_config.js @@ -0,0 +1,11 @@ +export default { + test({ assert, component }) { + assert.deepEqual(component.foo, {}); + component.bar = 'hello'; + assert.deepEqual(component.foo, { hello: true }); + component.bar = 'world'; + assert.deepEqual(component.foo, { hello: true, world: true }); + component.bar = false; + assert.deepEqual(component.foo, { hello: true, world: true }); + } +}; diff --git a/test/runtime/samples/reactive-values-subscript-assignment/main.svelte b/test/runtime/samples/reactive-values-subscript-assignment/main.svelte new file mode 100644 index 0000000000..9753032618 --- /dev/null +++ b/test/runtime/samples/reactive-values-subscript-assignment/main.svelte @@ -0,0 +1,7 @@ +