From 7ec9e4b3b182b2ac2b5c0e3c8cbdda7d962b19d6 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 8 Dec 2025 12:07:51 -0800 Subject: [PATCH] fix: prevent erroneous `state_referenced_locally` warnings on prop fallbacks (#17329) * failing test * fix: prevent erroneous `state_referenced_locally` warnings on prop fallbacks --- .changeset/rude-points-attend.md | 5 +++++ .../phases/2-analyze/visitors/VariableDeclarator.js | 12 +++++++++++- .../samples/static-state-reference/input.svelte | 3 ++- .../samples/static-state-reference/warnings.json | 12 ++++++------ 4 files changed, 24 insertions(+), 8 deletions(-) create mode 100644 .changeset/rude-points-attend.md diff --git a/.changeset/rude-points-attend.md b/.changeset/rude-points-attend.md new file mode 100644 index 0000000000..b8e69c5064 --- /dev/null +++ b/.changeset/rude-points-attend.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: prevent erroneous `state_referenced_locally` warnings on prop fallbacks diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js index dfb1d54040..5cf231ad01 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/VariableDeclarator.js @@ -146,5 +146,15 @@ export function VariableDeclarator(node, context) { } } - context.next(); + if (node.init && get_rune(node.init, context.state.scope) === '$props') { + // prevent erroneous `state_referenced_locally` warnings on prop fallbacks + context.visit(node.id, { + ...context.state, + function_depth: context.state.function_depth + 1 + }); + + context.visit(node.init); + } else { + context.next(); + } } 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 9037760321..fdcf343626 100644 --- a/packages/svelte/tests/validator/samples/static-state-reference/input.svelte +++ b/packages/svelte/tests/validator/samples/static-state-reference/input.svelte @@ -9,7 +9,8 @@ console.log(doubled); let { - prop + prop, + other_prop = prop } = $props(); let prop_state = $state(prop); let prop_derived = $derived(prop); 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 a0ae24e37b..76e752573e 100644 --- a/packages/svelte/tests/validator/samples/static-state-reference/warnings.json +++ b/packages/svelte/tests/validator/samples/static-state-reference/warnings.json @@ -39,36 +39,36 @@ "code": "state_referenced_locally", "end": { "column": 29, - "line": 14 + "line": 15 }, "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 + "line": 15 } }, { "code": "state_referenced_locally", "end": { "column": 17, - "line": 16 + "line": 17 }, "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 + "line": 17 } }, { "code": "state_referenced_locally", "end": { "column": 25, - "line": 17 + "line": 18 }, "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 + "line": 18 } } ]