From 5d56c592ff7b800d95b7776a87f8aca285866d51 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 19 Sep 2024 02:35:48 -0400 Subject: [PATCH] fix: delete transformers shadowed by unreassigned state (#13316) fixes #13314 --- .changeset/hot-grapes-destroy.md | 5 +++++ .../phases/3-transform/client/transform-client.js | 9 +++++++-- .../runtime-runes/samples/derived-shadowed/_config.js | 5 +++++ .../runtime-runes/samples/derived-shadowed/main.svelte | 8 ++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 .changeset/hot-grapes-destroy.md create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-shadowed/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-shadowed/main.svelte diff --git a/.changeset/hot-grapes-destroy.md b/.changeset/hot-grapes-destroy.md new file mode 100644 index 0000000000..f80e2aa01b --- /dev/null +++ b/.changeset/hot-grapes-destroy.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: delete transformers shadowed by unreassigned state diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js index 04815dbc28..d0e6efc6d8 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-client.js @@ -4,7 +4,7 @@ /** @import { Visitors, ComponentClientTransformState, ClientTransformState } from './types' */ import { walk } from 'zimmerframe'; import * as b from '../../../utils/builders.js'; -import { build_getter } from './utils.js'; +import { build_getter, is_state_source } from './utils.js'; import { render_stylesheet } from '../css/index.js'; import { dev, filename } from '../../../state.js'; import { AnimateDirective } from './visitors/AnimateDirective.js'; @@ -66,7 +66,12 @@ const visitors = { const transform = { ...state.transform }; for (const [name, binding] of scope.declarations) { - if (binding.kind === 'normal') { + if ( + binding.kind === 'normal' || + // Reads of `$state(...)` declarations are not + // transformed if they are never reassigned + (binding.kind === 'state' && !is_state_source(binding, state.analysis)) + ) { delete transform[name]; } } diff --git a/packages/svelte/tests/runtime-runes/samples/derived-shadowed/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-shadowed/_config.js new file mode 100644 index 0000000000..a9ff1fbabe --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-shadowed/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `
0
` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-shadowed/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-shadowed/main.svelte new file mode 100644 index 0000000000..5ae3d3b494 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-shadowed/main.svelte @@ -0,0 +1,8 @@ + + +
{value}