From e3c56fab4f288ac6a7144952967ffeb8f377dbba Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti Date: Wed, 18 Sep 2024 00:08:55 +0200 Subject: [PATCH] fix: correctly migrate sequence expressions (#13291) * fix: correctly migrate sequence expressions * remove unwanted parens --------- Co-authored-by: Rich Harris --- .changeset/brave-candles-serve.md | 5 +++ packages/svelte/src/compiler/migrate/index.js | 40 ++++++++++++------- .../samples/derivations-no-colon/input.svelte | 7 ---- .../derivations-no-colon/output.svelte | 7 ---- .../migrate/samples/derivations/input.svelte | 6 ++- .../migrate/samples/derivations/output.svelte | 6 ++- .../input.svelte | 14 +++++++ .../output.svelte | 14 +++++++ 8 files changed, 69 insertions(+), 30 deletions(-) create mode 100644 .changeset/brave-candles-serve.md delete mode 100644 packages/svelte/tests/migrate/samples/derivations-no-colon/input.svelte delete mode 100644 packages/svelte/tests/migrate/samples/derivations-no-colon/output.svelte create mode 100644 packages/svelte/tests/migrate/samples/state-and-derivations-sequence/input.svelte create mode 100644 packages/svelte/tests/migrate/samples/state-and-derivations-sequence/output.svelte diff --git a/.changeset/brave-candles-serve.md b/.changeset/brave-candles-serve.md new file mode 100644 index 0000000000..f758e3cc76 --- /dev/null +++ b/.changeset/brave-candles-serve.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly migrate sequence expressions diff --git a/packages/svelte/src/compiler/migrate/index.js b/packages/svelte/src/compiler/migrate/index.js index c14b577319..e4c759083d 100644 --- a/packages/svelte/src/compiler/migrate/index.js +++ b/packages/svelte/src/compiler/migrate/index.js @@ -368,8 +368,15 @@ const instance_script = { // state if (declarator.init) { - state.str.prependLeft(/** @type {number} */ (declarator.init.start), '$state('); - state.str.appendRight(/** @type {number} */ (declarator.init.end), ')'); + let { start, end } = /** @type {{ start: number, end: number }} */ (declarator.init); + + if (declarator.init.type === 'SequenceExpression') { + while (state.str.original[start] !== '(') start -= 1; + while (state.str.original[end - 1] !== ')') end += 1; + } + + state.str.prependLeft(start, '$state('); + state.str.appendRight(end, ')'); } else { state.str.prependLeft( /** @type {number} */ (declarator.id.typeAnnotation?.end ?? declarator.id.end), @@ -416,25 +423,30 @@ 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')) { + let { start, end } = /** @type {{ start: number, end: number }} */ ( + node.body.expression.right + ); + // $derived state.str.update( /** @type {number} */ (node.start), /** @type {number} */ (node.body.expression.start), 'let ' ); - state.str.prependRight( - /** @type {number} */ (node.body.expression.right.start), - '$derived(' - ); - if (node.body.expression.right.end !== node.end) { - state.str.update( - /** @type {number} */ (node.body.expression.right.end), - /** @type {number} */ (node.end), - ');' - ); - } else { - state.str.appendLeft(/** @type {number} */ (node.end), ');'); + + if (node.body.expression.right.type === 'SequenceExpression') { + while (state.str.original[start] !== '(') start -= 1; + while (state.str.original[end - 1] !== ')') end += 1; } + + state.str.prependRight(start, `$derived(`); + + // in a case like `$: ({ a } = b())`, there's already a trailing parenthesis. + // otherwise, we need to add one + if (state.str.original[/** @type {number} */ (node.body.start)] !== '(') { + state.str.appendLeft(end, `)`); + } + return; } else { for (const binding of reassigned_bindings) { diff --git a/packages/svelte/tests/migrate/samples/derivations-no-colon/input.svelte b/packages/svelte/tests/migrate/samples/derivations-no-colon/input.svelte deleted file mode 100644 index 7df9187a02..0000000000 --- a/packages/svelte/tests/migrate/samples/derivations-no-colon/input.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -{count} / {doubled} / {quadrupled} diff --git a/packages/svelte/tests/migrate/samples/derivations-no-colon/output.svelte b/packages/svelte/tests/migrate/samples/derivations-no-colon/output.svelte deleted file mode 100644 index f6af6dd450..0000000000 --- a/packages/svelte/tests/migrate/samples/derivations-no-colon/output.svelte +++ /dev/null @@ -1,7 +0,0 @@ - - -{count} / {doubled} / {quadrupled} \ No newline at end of file diff --git a/packages/svelte/tests/migrate/samples/derivations/input.svelte b/packages/svelte/tests/migrate/samples/derivations/input.svelte index 9fde4a4359..42b47b8272 100644 --- a/packages/svelte/tests/migrate/samples/derivations/input.svelte +++ b/packages/svelte/tests/migrate/samples/derivations/input.svelte @@ -1,7 +1,11 @@ -{count} / {doubled} / {quadrupled} +{count} / {doubled} / {quadrupled} / {time_8} / {time_16} diff --git a/packages/svelte/tests/migrate/samples/derivations/output.svelte b/packages/svelte/tests/migrate/samples/derivations/output.svelte index f6af6dd450..e797a4da1e 100644 --- a/packages/svelte/tests/migrate/samples/derivations/output.svelte +++ b/packages/svelte/tests/migrate/samples/derivations/output.svelte @@ -1,7 +1,11 @@ -{count} / {doubled} / {quadrupled} \ No newline at end of file +{count} / {doubled} / {quadrupled} / {time_8} / {time_16} diff --git a/packages/svelte/tests/migrate/samples/state-and-derivations-sequence/input.svelte b/packages/svelte/tests/migrate/samples/state-and-derivations-sequence/input.svelte new file mode 100644 index 0000000000..487f72429c --- /dev/null +++ b/packages/svelte/tests/migrate/samples/state-and-derivations-sequence/input.svelte @@ -0,0 +1,14 @@ + + + + + +{count} / {doubled} / {quadrupled} / {time_8} / {time_16} diff --git a/packages/svelte/tests/migrate/samples/state-and-derivations-sequence/output.svelte b/packages/svelte/tests/migrate/samples/state-and-derivations-sequence/output.svelte new file mode 100644 index 0000000000..bd9fe82142 --- /dev/null +++ b/packages/svelte/tests/migrate/samples/state-and-derivations-sequence/output.svelte @@ -0,0 +1,14 @@ + + + + + +{count} / {doubled} / {quadrupled} / {time_8} / {time_16}