From aa7bcb0a8e942680df318a595eb54cc5c31eda5f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 7 Feb 2019 11:20:48 -0500 Subject: [PATCH] prevent duplicated reactive declarations - fixes #2054 --- src/compile/Component.ts | 8 +-- .../expected.js | 53 +++++++++++++++++++ .../input.html | 9 ++++ 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 test/js/samples/reactive-values-non-topologically-ordered/expected.js create mode 100644 test/js/samples/reactive-values-non-topologically-ordered/input.html diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 659cf972cc..92d0c353ee 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1056,6 +1056,10 @@ export default class Component { }); } + if (this.reactive_declarations.indexOf(declaration) !== -1) { + return; + } + seen.add(declaration); if (declaration.dependencies.size === 0) { @@ -1069,9 +1073,7 @@ export default class Component { if (declaration.assignees.has(name)) return; const earlier_declarations = lookup.get(name); if (earlier_declarations) earlier_declarations.forEach(declaration => { - if (this.reactive_declarations.indexOf(declaration) === -1) { - add_declaration(declaration); - } + add_declaration(declaration); }); }); diff --git a/test/js/samples/reactive-values-non-topologically-ordered/expected.js b/test/js/samples/reactive-values-non-topologically-ordered/expected.js new file mode 100644 index 0000000000..de1a4cdc8c --- /dev/null +++ b/test/js/samples/reactive-values-non-topologically-ordered/expected.js @@ -0,0 +1,53 @@ +/* generated by Svelte vX.Y.Z */ +import { SvelteComponent as SvelteComponent_1, flush, init, noop, safe_not_equal } from "svelte/internal"; + +function create_fragment(ctx) { + return { + c: noop, + m: noop, + p: noop, + i: noop, + o: noop, + d: noop + }; +} + +function instance($$self, $$props, $$invalidate) { + let { x } = $$props; + + let a; + let b; + + $$self.$set = $$props => { + if ('x' in $$props) $$invalidate('x', x = $$props.x); + }; + + $$self.$$.update = ($$dirty = { b: 1, x: 1, a: 1 }) => { + if ($$dirty.b || $$dirty.x) { + b = x; $$invalidate('b', b); + } + if ($$dirty.a || $$dirty.b) { + a = b; $$invalidate('a', a); + } + }; + + return { x }; +} + +class SvelteComponent extends SvelteComponent_1 { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal); + } + + get x() { + return this.$$.ctx.x; + } + + set x(x) { + this.$set({ x }); + flush(); + } +} + +export default SvelteComponent; \ No newline at end of file diff --git a/test/js/samples/reactive-values-non-topologically-ordered/input.html b/test/js/samples/reactive-values-non-topologically-ordered/input.html new file mode 100644 index 0000000000..a443372b05 --- /dev/null +++ b/test/js/samples/reactive-values-non-topologically-ordered/input.html @@ -0,0 +1,9 @@ + \ No newline at end of file