From 8e4464166a75df1815e4c1df8136ba1baed571e8 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 9 Mar 2019 21:35:00 -0500 Subject: [PATCH] tweak semantics of reactive statements - fixes #2178 --- src/compile/Component.ts | 24 +++++++++++-------- .../_config.js | 19 +++++++++++++++ .../main.svelte | 9 +++++++ 3 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 test/runtime/samples/reactive-values-self-dependency-b/_config.js create mode 100644 test/runtime/samples/reactive-values-self-dependency-b/main.svelte diff --git a/src/compile/Component.ts b/src/compile/Component.ts index 8fa80d4cfd..89ed3fc8cb 100644 --- a/src/compile/Component.ts +++ b/src/compile/Component.ts @@ -1050,6 +1050,7 @@ export default class Component { this.reactive_declaration_nodes.add(node); const assignees = new Set(); + const assignee_nodes = new Set(); const dependencies = new Set(); let scope = this.instance_scope; @@ -1062,18 +1063,21 @@ export default class Component { } if (node.type === 'AssignmentExpression') { - const { name } = getObject(node.left) - assignees.add(name); - dependencies.delete(name); + const identifier = getObject(node.left) + assignee_nodes.add(identifier); + assignees.add(identifier.name); } else if (node.type === 'UpdateExpression') { - const { name } = getObject(node.argument); - assignees.add(name); - dependencies.delete(name); + const identifier = getObject(node.argument); + assignee_nodes.add(identifier); + assignees.add(identifier.name); } else if (isReference(node, parent)) { - const { name } = getObject(node); - const owner = scope.findOwner(name); - if ((!owner || owner === component.instance_scope) && (name[0] === '$' || component.var_lookup.has(name)) && !assignees.has(name)) { - dependencies.add(name); + const identifier = getObject(node); + 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))) { + dependencies.add(name); + } } this.skip(); diff --git a/test/runtime/samples/reactive-values-self-dependency-b/_config.js b/test/runtime/samples/reactive-values-self-dependency-b/_config.js new file mode 100644 index 0000000000..9b2b5a2dd6 --- /dev/null +++ b/test/runtime/samples/reactive-values-self-dependency-b/_config.js @@ -0,0 +1,19 @@ +export default { + html: ` +

count: 0

+ `, + + test({ assert, component, target }) { + component.count = 5; + + assert.htmlEqual(target.innerHTML, ` +

count: 5

+ `); + + component.count = 50; + + assert.htmlEqual(target.innerHTML, ` +

count: 9

+ `); + } +}; diff --git a/test/runtime/samples/reactive-values-self-dependency-b/main.svelte b/test/runtime/samples/reactive-values-self-dependency-b/main.svelte new file mode 100644 index 0000000000..c429097c09 --- /dev/null +++ b/test/runtime/samples/reactive-values-self-dependency-b/main.svelte @@ -0,0 +1,9 @@ + + +

count: {count}

\ No newline at end of file