From c2566ce259253ae6d128d8341d6c28aa581cb1e1 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Fri, 18 Oct 2024 15:46:43 +0100 Subject: [PATCH] better fix --- packages/svelte/src/compiler/migrate/index.js | 39 ++++++++++--------- .../output.svelte | 12 +++--- .../single-assignment-labeled/output.svelte | 15 +++---- 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index dc9ce0dbfb..3d70d54d9f 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -549,27 +549,28 @@ const instance_script = { let labeled_statement; // Analyze declaration bindings to see if they're exclusively updated within a single reactive statement - const possible_derived = bindings.every( - (binding) => - binding.initial !== null && - binding.references.every((reference) => { - 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 possible_derived = bindings.every((binding) => + binding.references.every((reference) => { + 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 === '$' + ); - if (assignment && labeled) { - if (assignment_in_labeled) return false; - assignment_in_labeled = /** @type {AssignmentExpression} */ (assignment); - labeled_statement = /** @type {LabeledStatement} */ (labeled); - } + if (assignment && labeled) { + if (assignment_in_labeled) return false; + assignment_in_labeled = /** @type {AssignmentExpression} */ (assignment); + labeled_statement = /** @type {LabeledStatement} */ (labeled); + } - return ( - !update && (declaration || (labeled && assignment) || (!labeled && !assignment)) - ); - }) + return ( + !update && + ((declaration && binding.initial) || + (labeled && assignment) || + (!labeled && !assignment)) + ); + }) ); const labeled_has_single_assignment = diff --git a/packages/svelte/tests/migrate/samples/reactive-statements-reorder-with-comments/output.svelte b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-with-comments/output.svelte index af40481379..48a3378d51 100644 --- a/packages/svelte/tests/migrate/samples/reactive-statements-reorder-with-comments/output.svelte +++ b/packages/svelte/tests/migrate/samples/reactive-statements-reorder-with-comments/output.svelte @@ -6,7 +6,10 @@ // triple - let triple = $state(); + // update triple + let triple = $derived(count * 3) + // trailing comment + // in triple; function increment() { count += 1; @@ -16,12 +19,7 @@ run(() => { console.log({ count, double }); }); - run(() => { - // update triple - triple = count * 3; - // trailing comment - // in triple - }); +