From 2dea431f09419183ceaa00031179c545d91363db Mon Sep 17 00:00:00 2001 From: adiguba Date: Sat, 29 Nov 2025 10:47:03 +0100 Subject: [PATCH 1/2] add props to state_referenced_locally --- .../phases/2-analyze/visitors/Identifier.js | 3 +- .../static-state-reference/input.svelte | 10 ++++++ .../static-state-reference/warnings.json | 36 +++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js index 1c98a95e630a..9daae33dd780 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js @@ -114,7 +114,8 @@ export function Identifier(node, context) { binding.initial.arguments[0].type !== 'SpreadElement' && !should_proxy(binding.initial.arguments[0], context.state.scope)))) || binding.kind === 'raw_state' || - binding.kind === 'derived') && + binding.kind === 'derived' || + binding.kind === 'prop') && // We're only concerned with reads here (parent.type !== 'AssignmentExpression' || parent.left !== node) && parent.type !== 'UpdateExpression' diff --git a/packages/svelte/tests/validator/samples/static-state-reference/input.svelte b/packages/svelte/tests/validator/samples/static-state-reference/input.svelte index 577527ee60c7..903776032124 100644 --- a/packages/svelte/tests/validator/samples/static-state-reference/input.svelte +++ b/packages/svelte/tests/validator/samples/static-state-reference/input.svelte @@ -8,11 +8,21 @@ console.log(count); console.log(doubled); + let { + prop + } = $props(); + let prop_state = $state(prop); + let prop_derived = $derived(prop); + console.log(prop); + console.log(prop_derived); + // writes are okay count++; count = 1; obj.a++; obj.a = 1; + prop_state = 1; + prop_derived = 1; // `count` here is correctly identified as a non-reference let typed: { count: number } | null = null; diff --git a/packages/svelte/tests/validator/samples/static-state-reference/warnings.json b/packages/svelte/tests/validator/samples/static-state-reference/warnings.json index a118d5e4a0d7..a0ae24e37bf8 100644 --- a/packages/svelte/tests/validator/samples/static-state-reference/warnings.json +++ b/packages/svelte/tests/validator/samples/static-state-reference/warnings.json @@ -34,5 +34,41 @@ "column": 20, "line": 9 } + }, + { + "code": "state_referenced_locally", + "end": { + "column": 29, + "line": 14 + }, + "message": "This reference only captures the initial value of `prop`. Did you mean to reference it inside a closure instead?", + "start": { + "column": 25, + "line": 14 + } + }, + { + "code": "state_referenced_locally", + "end": { + "column": 17, + "line": 16 + }, + "message": "This reference only captures the initial value of `prop`. Did you mean to reference it inside a closure instead?", + "start": { + "column": 13, + "line": 16 + } + }, + { + "code": "state_referenced_locally", + "end": { + "column": 25, + "line": 17 + }, + "message": "This reference only captures the initial value of `prop_derived`. Did you mean to reference it inside a closure instead?", + "start": { + "column": 13, + "line": 17 + } } ] From 42dc4863ad8dbf2e5f844778b29353deec4f9455 Mon Sep 17 00:00:00 2001 From: adiguba Date: Sat, 29 Nov 2025 10:50:53 +0100 Subject: [PATCH 2/2] changeset --- .changeset/curly-phones-cross.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curly-phones-cross.md diff --git a/.changeset/curly-phones-cross.md b/.changeset/curly-phones-cross.md new file mode 100644 index 000000000000..4398ec186228 --- /dev/null +++ b/.changeset/curly-phones-cross.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +add props to state_referenced_locally