From d91cf4b2efc9df0937c21c1297372a435909bcf8 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 18:30:08 -0400 Subject: [PATCH 1/2] skip non-writable vars in reactive declaration deps (#2173) --- src/compile/Component.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 9dbfb3b41c..0a8fee5cf0 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1034,7 +1034,10 @@ export default class Component { if (!assignee_nodes.has(identifier)) { const { name } = identifier; 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) && component.var_lookup.get(name).writable) + ) { dependencies.add(name); } } From a26b276c5eeda35e5c1828cbd0973a61a43a01c0 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Fri, 15 Mar 2019 18:39:02 -0400 Subject: [PATCH 2/2] update tests --- .../reactive-values-non-writable-dependencies/expected.js | 4 ++-- .../samples/reactive-declaration-no-deps/errors.json | 7 +++++++ .../samples/reactive-declaration-no-deps/input.svelte | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 test/validator/samples/reactive-declaration-no-deps/errors.json create mode 100644 test/validator/samples/reactive-declaration-no-deps/input.svelte 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 42f57a0037..deded0d4e9 100644 --- a/test/js/samples/reactive-values-non-writable-dependencies/expected.js +++ b/test/js/samples/reactive-values-non-writable-dependencies/expected.js @@ -17,11 +17,11 @@ let a = 1; let b = 2; function instance($$self, $$props, $$invalidate) { - + let max; - $$self.$$.update = ($$dirty = { Math: 1, a: 1, b: 1 }) => { + $$self.$$.update = ($$dirty = { a: 1, b: 1 }) => { if ($$dirty.a || $$dirty.b) { max = Math.max(a, b); $$invalidate('max', max); } diff --git a/test/validator/samples/reactive-declaration-no-deps/errors.json b/test/validator/samples/reactive-declaration-no-deps/errors.json new file mode 100644 index 0000000000..0063d4005e --- /dev/null +++ b/test/validator/samples/reactive-declaration-no-deps/errors.json @@ -0,0 +1,7 @@ +[{ + "message": "Invalid reactive declaration — must depend on local state", + "code": "invalid-reactive-declaration", + "start": { "line": 2, "column": 1, "character": 10 }, + "end": { "line": 2, "column": 23, "character": 32 }, + "pos": 10 +}] diff --git a/test/validator/samples/reactive-declaration-no-deps/input.svelte b/test/validator/samples/reactive-declaration-no-deps/input.svelte new file mode 100644 index 0000000000..c334f92ab5 --- /dev/null +++ b/test/validator/samples/reactive-declaration-no-deps/input.svelte @@ -0,0 +1,3 @@ +