From 427726139f0aa90d97efafcbf30926d4b6b52a9a Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 29 Feb 2024 17:48:05 +0100 Subject: [PATCH] fix: prevent false positive non-state warnings for `bind:this` `bind:this` doesn't need to be a state reference if it will never change fixes #10435 --- .../src/compiler/phases/2-analyze/index.js | 19 +++++++++++++++++++ .../_config.js | 3 +++ .../input.svelte | 11 +++++++++++ .../warnings.json | 14 ++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/_config.js create mode 100644 packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/input.svelte create mode 100644 packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/warnings.json diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index 6a00e81f58..04b3d72b8a 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -460,6 +460,25 @@ export function analyze_component(root, options) { ) { continue inner; } + // bind:this doesn't need to be a state reference if it will never change + if ( + type === 'BindDirective' && + /** @type {import('#compiler').BindDirective} */ (path[i]).name === 'this' + ) { + for (let j = i - 1; j >= 0; j -= 1) { + const type = path[j].type; + if ( + type === 'IfBlock' || + type === 'EachBlock' || + type === 'AwaitBlock' || + type === 'KeyBlock' + ) { + warn(warnings, binding.node, [], 'non-state-reference', name); + continue outer; + } + } + continue inner; + } } warn(warnings, binding.node, [], 'non-state-reference', name); diff --git a/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/_config.js b/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/_config.js new file mode 100644 index 0000000000..f47bee71df --- /dev/null +++ b/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/_config.js @@ -0,0 +1,3 @@ +import { test } from '../../test'; + +export default test({}); diff --git a/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/input.svelte b/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/input.svelte new file mode 100644 index 0000000000..a863d53db6 --- /dev/null +++ b/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/input.svelte @@ -0,0 +1,11 @@ + + +
+{#if true} +
+
+{/if} diff --git a/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/warnings.json b/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/warnings.json new file mode 100644 index 0000000000..d0b8f7bd3d --- /dev/null +++ b/packages/svelte/tests/validator/samples/runes-referenced-nonstate-bind-this/warnings.json @@ -0,0 +1,14 @@ +[ + { + "code": "non-state-reference", + "message": "does_need1 is updated, but is not declared with $state(...). Changing its value will not correctly trigger updates.", + "start": { + "column": 5, + "line": 3 + }, + "end": { + "column": 15, + "line": 3 + } + } +]