Skip to content

Commit 203d0ec

Browse files
authored
Merge pull request #2634 from sveltejs/gh-2625
fix invalidating stores with UpdateExpression
2 parents 73bf582 + 10f6da3 commit 203d0ec

File tree

3 files changed

+27
-18
lines changed

3 files changed

+27
-18
lines changed

src/compile/render-dom/index.ts

+8-18
Original file line numberDiff line numberDiff line change
@@ -169,14 +169,15 @@ export default function dom(
169169
scope = scope.parent;
170170
}
171171

172-
if (node.type === 'AssignmentExpression') {
172+
if (node.type === 'AssignmentExpression' || node.type === 'UpdateExpression') {
173+
const assignee = node.type === 'AssignmentExpression' ? node.left : node.argument;
173174
let names = [];
174175

175-
if (node.left.type === 'MemberExpression') {
176-
const left_object_name = get_object(node.left).name;
176+
if (assignee.type === 'MemberExpression') {
177+
const left_object_name = get_object(assignee).name;
177178
left_object_name && (names = [left_object_name]);
178179
} else {
179-
names = extract_names(node.left);
180+
names = extract_names(assignee);
180181
}
181182

182183
if (node.operator === '=' && nodes_match(node.left, node.right)) {
@@ -189,9 +190,10 @@ export default function dom(
189190
code.overwrite(node.start, node.end, dirty.map(n => component.invalidate(n)).join('; '));
190191
} else {
191192
const single = (
192-
node.left.type === 'Identifier' &&
193+
node.type === 'AssignmentExpression' &&
194+
assignee.type === 'Identifier' &&
193195
parent.type === 'ExpressionStatement' &&
194-
node.left.name[0] !== '$'
196+
assignee.name[0] !== '$'
195197
);
196198

197199
names.forEach(name => {
@@ -213,18 +215,6 @@ export default function dom(
213215
}
214216
}
215217

216-
else if (node.type === 'UpdateExpression') {
217-
const { name } = get_object(node.argument);
218-
219-
if (scope.find_owner(name) !== component.instance_scope) return;
220-
221-
const variable = component.var_lookup.get(name);
222-
if (variable && variable.hoistable) return;
223-
224-
pending_assignments.add(name);
225-
component.has_reactive_assignments = true;
226-
}
227-
228218
if (pending_assignments.size > 0) {
229219
if (node.type === 'ArrowFunctionExpression') {
230220
const insert = Array.from(pending_assignments).map(name => component.invalidate(name)).join('; ');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export default {
2+
html: `0`,
3+
4+
async test({ assert, component, target }) {
5+
await component.increment();
6+
assert.htmlEqual(target.innerHTML, `1`);
7+
}
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script>
2+
import { writable } from '../../../../store.js';
3+
4+
const foo = writable(0);
5+
6+
export function increment() {
7+
$foo++;
8+
}
9+
</script>
10+
11+
{$foo}

0 commit comments

Comments
 (0)