Skip to content

Commit ac4eae4

Browse files
committed
fix: legacy reactive dependencies tweak
take into account member expressions when determining legacy reactive dependencies fixes #9954
1 parent 901cfc9 commit ac4eae4

File tree

4 files changed

+40
-3
lines changed

4 files changed

+40
-3
lines changed

.changeset/quiet-crabs-nail.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: take into account member expressions when determining legacy reactive dependencies

packages/svelte/src/compiler/phases/2-analyze/index.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,15 @@ const legacy_scope_tweaker = {
500500
node.body.type === 'ExpressionStatement' &&
501501
node.body.expression.type === 'AssignmentExpression'
502502
) {
503-
for (const id of extract_identifiers(node.body.expression.left)) {
503+
let ids = extract_identifiers(node.body.expression.left);
504+
if (node.body.expression.left.type === 'MemberExpression') {
505+
const id = object(node.body.expression.left);
506+
if (id !== null) {
507+
ids = [id];
508+
}
509+
}
510+
511+
for (const id of ids) {
504512
const binding = state.scope.get(id.name);
505513
if (binding?.kind === 'legacy_reactive') {
506514
// TODO does this include `let double; $: double = x * 2`?
@@ -511,8 +519,15 @@ const legacy_scope_tweaker = {
511519
},
512520
AssignmentExpression(node, { state, next }) {
513521
if (state.reactive_statement && node.operator === '=') {
514-
for (const id of extract_identifiers(node.left)) {
515-
state.reactive_statement.assignments.add(id);
522+
if (node.left.type === 'MemberExpression') {
523+
const id = object(node.left);
524+
if (id !== null) {
525+
state.reactive_statement.assignments.add(id);
526+
}
527+
} else {
528+
for (const id of extract_identifiers(node.left)) {
529+
state.reactive_statement.assignments.add(id);
530+
}
516531
}
517532
}
518533

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
html: `1 1`
5+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<script>
2+
let button = { title: '', label: '' };
3+
let title = '';
4+
let label = '';
5+
6+
title = label = '1'; // to add dependencies/generate update block
7+
8+
$: button.title = title;
9+
$: button.label = label;
10+
</script>
11+
12+
{button.title} {button.label}

0 commit comments

Comments
 (0)