From df03af2e9d6e53be6cfb72257c42b0c9e5e2c050 Mon Sep 17 00:00:00 2001 From: 7nik Date: Mon, 12 May 2025 23:15:03 +0300 Subject: [PATCH] fix: emit right error for a shadowed invalid rune (#15892) Co-authored-by: 7nik --- .changeset/tall-cherries-fix.md | 5 +++++ .../src/compiler/phases/2-analyze/visitors/Identifier.js | 2 +- .../samples/invalid-rune-name-shadowed/_config.js | 8 ++++++++ .../samples/invalid-rune-name-shadowed/main.svelte.js | 5 +++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/tall-cherries-fix.md create mode 100644 packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/_config.js create mode 100644 packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/main.svelte.js diff --git a/.changeset/tall-cherries-fix.md b/.changeset/tall-cherries-fix.md new file mode 100644 index 0000000000..df25e02da9 --- /dev/null +++ b/.changeset/tall-cherries-fix.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: emit right error for a shadowed invalid rune 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 efbbe6cfa2..89a81127c1 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js @@ -39,7 +39,7 @@ export function Identifier(node, context) { if ( is_rune(node.name) && context.state.scope.get(node.name) === null && - context.state.scope.get(node.name.slice(1)) === null + context.state.scope.get(node.name.slice(1))?.kind !== 'store_sub' ) { /** @type {Expression} */ let current = node; diff --git a/packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/_config.js b/packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/_config.js new file mode 100644 index 0000000000..a24996677c --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/_config.js @@ -0,0 +1,8 @@ +import { test } from '../../test'; + +export default test({ + error: { + code: 'rune_invalid_name', + message: '`$state.foo` is not a valid rune' + } +}); diff --git a/packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/main.svelte.js b/packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/main.svelte.js new file mode 100644 index 0000000000..966f7bc63b --- /dev/null +++ b/packages/svelte/tests/compiler-errors/samples/invalid-rune-name-shadowed/main.svelte.js @@ -0,0 +1,5 @@ +class State { + value = $state.foo(); +} + +export const state = new State();