From 570f64963b6c740819b9d2d0464dfd36cb9318c1 Mon Sep 17 00:00:00 2001 From: adiGuba Date: Sat, 29 Nov 2025 20:53:26 +0100 Subject: [PATCH] fix: add props to state_referenced_locally (#17266) * add props to state_referenced_locally * changeset --- .changeset/curly-phones-cross.md | 5 +++ .../phases/2-analyze/visitors/Identifier.js | 3 +- .../static-state-reference/input.svelte | 10 ++++++ .../static-state-reference/warnings.json | 36 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) 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 0000000000..4398ec1862 --- /dev/null +++ b/.changeset/curly-phones-cross.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +add props to state_referenced_locally 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 1c98a95e63..9daae33dd7 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 577527ee60..9037760321 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 a118d5e4a0..a0ae24e37b 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 + } } ]