From f2f3c8b5344711e434dffdc6ada3fc269f1da5ed Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 21 Oct 2024 13:18:26 +0200 Subject: [PATCH 1/5] wip --- .../svelte/tests/migrate/samples/derivations/input.svelte | 5 +++++ packages/svelte/tests/migrate/samples/effects/input.svelte | 3 +++ packages/svelte/tests/migrate/samples/effects/output.svelte | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/svelte/tests/migrate/samples/derivations/input.svelte b/packages/svelte/tests/migrate/samples/derivations/input.svelte index 42b47b8272c9..8f89a593851f 100644 --- a/packages/svelte/tests/migrate/samples/derivations/input.svelte +++ b/packages/svelte/tests/migrate/samples/derivations/input.svelte @@ -6,6 +6,11 @@ // no semicolon at the end $: time_8 = count * 8 $: ({ time_16 } = { time_16: count * 16 }) + // preceeding let that doesn't do anything + let time_32; + $: time_32 = count * doubled; + let very_high; + $: very_high = time_32 * count; {count} / {doubled} / {quadrupled} / {time_8} / {time_16} diff --git a/packages/svelte/tests/migrate/samples/effects/input.svelte b/packages/svelte/tests/migrate/samples/effects/input.svelte index f7f1edfb97b3..a81c030aba55 100644 --- a/packages/svelte/tests/migrate/samples/effects/input.svelte +++ b/packages/svelte/tests/migrate/samples/effects/input.svelte @@ -10,4 +10,7 @@ console.log('bar'); } $: $count = 1; + $: $count.x = count; + + \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/effects/output.svelte b/packages/svelte/tests/migrate/samples/effects/output.svelte index 006ce4b23db3..20fe07943920 100644 --- a/packages/svelte/tests/migrate/samples/effects/output.svelte +++ b/packages/svelte/tests/migrate/samples/effects/output.svelte @@ -18,4 +18,6 @@ run(() => { $count = 1; }); - \ No newline at end of file + + + From 38738a8e33abde09c83d92c762b5a7bfc4390aae Mon Sep 17 00:00:00 2001 From: ComputerGuy <63362464+Ocean-OS@users.noreply.github.com> Date: Mon, 21 Oct 2024 04:21:04 -0700 Subject: [PATCH 2/5] Fix migration bug (#13729) Ensure that $derived is only applied to Identifiers --- packages/svelte/src/compiler/migrate/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index f2b6977ea14b..f957524b77bd 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -739,7 +739,7 @@ const instance_script = { ); const bindings = ids.map((id) => state.scope.get(id.name)); const reassigned_bindings = bindings.filter((b) => b?.reassigned); - if (reassigned_bindings.length === 0 && !bindings.some((b) => b?.kind === 'store_sub')) { + if (reassigned_bindings.length === 0 && !bindings.some((b) => b?.kind === 'store_sub') && node.body.expression.left.type === "Identifier") { let { start, end } = /** @type {{ start: number, end: number }} */ ( node.body.expression.right ); From c36784ccafdab7334a1a9ef80543b3a07a58160e Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 21 Oct 2024 13:23:34 +0200 Subject: [PATCH 3/5] fix + test --- packages/svelte/src/compiler/migrate/index.js | 6 +++++- .../svelte/tests/migrate/samples/effects/output.svelte | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index f957524b77bd..abe940af7c4a 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -739,7 +739,11 @@ const instance_script = { ); const bindings = ids.map((id) => state.scope.get(id.name)); const reassigned_bindings = bindings.filter((b) => b?.reassigned); - if (reassigned_bindings.length === 0 && !bindings.some((b) => b?.kind === 'store_sub') && node.body.expression.left.type === "Identifier") { + if ( + reassigned_bindings.length === 0 && + !bindings.some((b) => b?.kind === 'store_sub') && + node.body.expression.left.type !== 'MemberExpression' + ) { let { start, end } = /** @type {{ start: number, end: number }} */ ( node.body.expression.right ); diff --git a/packages/svelte/tests/migrate/samples/effects/output.svelte b/packages/svelte/tests/migrate/samples/effects/output.svelte index 20fe07943920..5808929e6a30 100644 --- a/packages/svelte/tests/migrate/samples/effects/output.svelte +++ b/packages/svelte/tests/migrate/samples/effects/output.svelte @@ -1,7 +1,7 @@ - + \ No newline at end of file From ab18c982694e1634b8cef05f2040a5a53705972c Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 21 Oct 2024 14:16:54 +0200 Subject: [PATCH 4/5] fix #13727 --- packages/svelte/src/compiler/migrate/index.js | 17 +++++++++++++---- .../migrate/samples/derivations/output.svelte | 5 +++++ .../tests/migrate/samples/effects/input.svelte | 2 +- .../tests/migrate/samples/effects/output.svelte | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index abe940af7c4a..1bbb71abef9a 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -558,14 +558,22 @@ const instance_script = { const declaration = reference.path.find((el) => el.type === 'VariableDeclaration'); const assignment = reference.path.find((el) => el.type === 'AssignmentExpression'); const update = reference.path.find((el) => el.type === 'UpdateExpression'); - const labeled = reference.path.find( - (el) => el.type === 'LabeledStatement' && el.label.name === '$' + const labeled = /** @type {LabeledStatement | undefined} */ ( + reference.path.find((el) => el.type === 'LabeledStatement' && el.label.name === '$') ); - if (assignment && labeled) { + if ( + assignment && + labeled && + // ensure that $: foo = bar * 2 is not counted as a reassignment of bar + (labeled.body.type !== 'ExpressionStatement' || + labeled.body.expression !== assignment || + (assignment.left.type === 'Identifier' && + assignment.left.name === binding.node.name)) + ) { if (assignment_in_labeled) return false; assignment_in_labeled = /** @type {AssignmentExpression} */ (assignment); - labeled_statement = /** @type {LabeledStatement} */ (labeled); + labeled_statement = labeled; } return ( @@ -739,6 +747,7 @@ const instance_script = { ); const bindings = ids.map((id) => state.scope.get(id.name)); const reassigned_bindings = bindings.filter((b) => b?.reassigned); + if ( reassigned_bindings.length === 0 && !bindings.some((b) => b?.kind === 'store_sub') && diff --git a/packages/svelte/tests/migrate/samples/derivations/output.svelte b/packages/svelte/tests/migrate/samples/derivations/output.svelte index ed6e72dfabc8..23bac4ccaf02 100644 --- a/packages/svelte/tests/migrate/samples/derivations/output.svelte +++ b/packages/svelte/tests/migrate/samples/derivations/output.svelte @@ -6,6 +6,11 @@ // no semicolon at the end let time_8 = $derived(count * 8) let { time_16 } = $derived({ time_16: count * 16 }) + // preceeding let that doesn't do anything + let time_32 = $derived(count * doubled); + + let very_high = $derived(time_32 * count); + {count} / {doubled} / {quadrupled} / {time_8} / {time_16} \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/effects/input.svelte b/packages/svelte/tests/migrate/samples/effects/input.svelte index a81c030aba55..35d7c1bd5184 100644 --- a/packages/svelte/tests/migrate/samples/effects/input.svelte +++ b/packages/svelte/tests/migrate/samples/effects/input.svelte @@ -10,7 +10,7 @@ console.log('bar'); } $: $count = 1; - $: $count.x = count; + $: foo.x = count; \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/effects/output.svelte b/packages/svelte/tests/migrate/samples/effects/output.svelte index 5808929e6a30..59d7eec618ed 100644 --- a/packages/svelte/tests/migrate/samples/effects/output.svelte +++ b/packages/svelte/tests/migrate/samples/effects/output.svelte @@ -19,7 +19,7 @@ $count = 1; }); run(() => { - $count.x = count; + foo.x = count; }); From d0bb0f1998731c8101a86335814681ce8e05d0a6 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Mon, 21 Oct 2024 14:17:35 +0200 Subject: [PATCH 5/5] changeset --- .changeset/nasty-geese-turn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nasty-geese-turn.md diff --git a/.changeset/nasty-geese-turn.md b/.changeset/nasty-geese-turn.md new file mode 100644 index 000000000000..b8b1a9fc79bd --- /dev/null +++ b/.changeset/nasty-geese-turn.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: more accurately detect `$derived` migration opportunities