diff --git a/.changeset/unlucky-boxes-obey.md b/.changeset/unlucky-boxes-obey.md new file mode 100644 index 0000000000..677b15e2ed --- /dev/null +++ b/.changeset/unlucky-boxes-obey.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: correctly apply scope on component children diff --git a/packages/svelte/src/compiler/phases/scope.js b/packages/svelte/src/compiler/phases/scope.js index 1a65ed26fc..0beed37e54 100644 --- a/packages/svelte/src/compiler/phases/scope.js +++ b/packages/svelte/src/compiler/phases/scope.js @@ -370,7 +370,6 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) { } const scope = analyze_let_directives(node, state.scope); - scopes.set(node, scope); for (const child of node.fragment.nodes) { if ( @@ -382,9 +381,15 @@ export function create_scopes(ast, root, allow_reactive_declarations, parent) { //
inherits the scope above the component, because slots are hella weird scopes.set(child, state.scope); visit(child); - } else if (child.type === 'SnippetBlock') { - visit(child, { scope }); } else { + if (child.type === 'ExpressionTag') { + // expression tag is a special case — we don't visit it directly, but via process_children, + // so we need to set the scope on the expression rather than the tag itself + scopes.set(child.expression, scope); + } else { + scopes.set(child, scope); + } + visit(child, { scope }); } } diff --git a/packages/svelte/tests/runtime-runes/samples/slot-static/Child.svelte b/packages/svelte/tests/runtime-runes/samples/slot-static/Child.svelte new file mode 100644 index 0000000000..09d3f06494 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/slot-static/Child.svelte @@ -0,0 +1,5 @@ + + + diff --git a/packages/svelte/tests/runtime-runes/samples/slot-static/_config.js b/packages/svelte/tests/runtime-runes/samples/slot-static/_config.js new file mode 100644 index 0000000000..11f8f9613e --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/slot-static/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `

message: hello

` +}); diff --git a/packages/svelte/tests/runtime-runes/samples/slot-static/main.svelte b/packages/svelte/tests/runtime-runes/samples/slot-static/main.svelte new file mode 100644 index 0000000000..980970a132 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/slot-static/main.svelte @@ -0,0 +1,9 @@ + + + +

message: {message}

+