diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/SnippetBlock.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/SnippetBlock.js index cd8af21f98..7b8cd7593f 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/SnippetBlock.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/SnippetBlock.js @@ -99,8 +99,9 @@ function can_hoist_snippet(scope, scopes, visited = new Set()) { if (binding.initial?.type === 'SnippetBlock') { if (visited.has(binding)) continue; visited.add(binding); + const snippet_scope = /** @type {Scope} */ (scopes.get(binding.initial)); - if (can_hoist_snippet(binding.scope, scopes, visited)) { + if (can_hoist_snippet(snippet_scope, scopes, visited)) { continue; } } diff --git a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json index 3dad9bb4e5..c6af77a47b 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json @@ -15,16 +15,16 @@ "end": 20, "type": "Action", "name": "autofocus", - "modifiers": [], - "expression": null + "expression": null, + "modifiers": [] }, { "start": 21, "end": 34, "type": "Action", "name": "autofocus", - "modifiers": [], - "expression": null + "expression": null, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json index 66ce187c62..a10d4eccf0 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json @@ -15,7 +15,6 @@ "end": 39, "type": "Action", "name": "tooltip", - "modifiers": [], "expression": { "type": "CallExpression", "start": 21, @@ -66,7 +65,8 @@ } ], "optional": false - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json index 39a6f5f647..e9a3e7e5da 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json @@ -15,7 +15,6 @@ "end": 28, "type": "Action", "name": "tooltip", - "modifiers": [], "expression": { "type": "Identifier", "start": 20, @@ -31,7 +30,8 @@ } }, "name": "message" - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json index 94c60b701a..94b60b9e5d 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json @@ -15,7 +15,6 @@ "end": 36, "type": "Action", "name": "tooltip", - "modifiers": [], "expression": { "type": "Literal", "start": 21, @@ -32,7 +31,8 @@ }, "value": "tooltip msg", "raw": "'tooltip msg'" - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/action/output.json b/packages/svelte/tests/parser-legacy/samples/action/output.json index d72bf7db10..f241c81a93 100644 --- a/packages/svelte/tests/parser-legacy/samples/action/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action/output.json @@ -15,8 +15,8 @@ "end": 20, "type": "Action", "name": "autofocus", - "modifiers": [], - "expression": null + "expression": null, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/animation/output.json b/packages/svelte/tests/parser-legacy/samples/animation/output.json index 0d82cb2bb9..bf4b43b875 100644 --- a/packages/svelte/tests/parser-legacy/samples/animation/output.json +++ b/packages/svelte/tests/parser-legacy/samples/animation/output.json @@ -20,8 +20,8 @@ "end": 50, "type": "Animation", "name": "flip", - "modifiers": [], - "expression": null + "expression": null, + "modifiers": [] } ], "children": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json index 9efe9acf8d..3cd54b6647 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json @@ -15,7 +15,6 @@ "end": 22, "type": "Class", "name": "foo", - "modifiers": [], "expression": { "type": "Identifier", "start": 16, @@ -31,7 +30,8 @@ } }, "name": "isFoo" - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json index 4d3a291808..2e45184be9 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json @@ -15,7 +15,6 @@ "end": 23, "type": "EventHandler", "name": "click", - "modifiers": [], "expression": { "type": "Identifier", "start": 19, @@ -31,7 +30,8 @@ } }, "name": "foo" - } + }, + "modifiers": [] } ], "children": [ diff --git a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json index 6720146297..4289245705 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json @@ -22,13 +22,13 @@ "end": 46, "type": "Binding", "name": "foo", - "modifiers": [], "expression": { "start": 43, "end": 46, "type": "Identifier", "name": "foo" - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/binding/output.json b/packages/svelte/tests/parser-legacy/samples/binding/output.json index 4ce069bd37..5256ede7bb 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding/output.json @@ -22,7 +22,6 @@ "end": 55, "type": "Binding", "name": "value", - "modifiers": [], "expression": { "type": "Identifier", "start": 50, @@ -38,7 +37,8 @@ } }, "name": "name" - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json index 45b6256677..11ee562297 100644 --- a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json +++ b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json @@ -15,7 +15,6 @@ "end": 45, "type": "EventHandler", "name": "click", - "modifiers": [], "expression": { "type": "ArrowFunctionExpression", "start": 19, @@ -100,7 +99,8 @@ } } } - } + }, + "modifiers": [] } ], "children": [ diff --git a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json index 15db05904c..42229b741f 100644 --- a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json +++ b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json @@ -22,7 +22,6 @@ "end": 692, "type": "EventHandler", "name": "click", - "modifiers": [], "expression": { "type": "ArrowFunctionExpression", "start": 596, @@ -137,7 +136,8 @@ "end": 594 } ] - } + }, + "modifiers": [] } ], "children": [ diff --git a/packages/svelte/tests/parser-legacy/samples/refs/output.json b/packages/svelte/tests/parser-legacy/samples/refs/output.json index e2bda741fa..7829a2787f 100644 --- a/packages/svelte/tests/parser-legacy/samples/refs/output.json +++ b/packages/svelte/tests/parser-legacy/samples/refs/output.json @@ -22,7 +22,6 @@ "end": 53, "type": "Binding", "name": "this", - "modifiers": [], "expression": { "type": "Identifier", "start": 49, @@ -38,7 +37,8 @@ } }, "name": "foo" - } + }, + "modifiers": [] } ], "children": [] diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json index f30788d758..18860d615b 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json @@ -15,8 +15,8 @@ "end": 12, "type": "Transition", "name": "fade", - "modifiers": [], "expression": null, + "modifiers": [], "intro": true, "outro": false } diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json index ae52f72c5d..973cfb7d33 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json @@ -15,7 +15,6 @@ "end": 30, "type": "Transition", "name": "style", - "modifiers": [], "expression": { "type": "ObjectExpression", "start": 16, @@ -85,6 +84,7 @@ } ] }, + "modifiers": [], "intro": true, "outro": false } diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json index 5d72e01b0a..0aa147911d 100644 --- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json +++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json @@ -25,7 +25,6 @@ "end": 147, "type": "OnDirective", "name": "click", - "modifiers": [], "expression": { "type": "ArrowFunctionExpression", "start": 73, @@ -316,7 +315,8 @@ } ] } - } + }, + "modifiers": [] } ], "fragment": { diff --git a/packages/svelte/tests/runtime-runes/samples/snippet-hoisting-3/_config.js b/packages/svelte/tests/runtime-runes/samples/snippet-hoisting-3/_config.js new file mode 100644 index 0000000000..240263603d --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/snippet-hoisting-3/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: '

Hello world!

' +}); diff --git a/packages/svelte/tests/runtime-runes/samples/snippet-hoisting-3/main.svelte b/packages/svelte/tests/runtime-runes/samples/snippet-hoisting-3/main.svelte new file mode 100644 index 0000000000..b23a69d53d --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/snippet-hoisting-3/main.svelte @@ -0,0 +1,13 @@ + + + + +

Hello {name}!

+ +{#snippet foo()} + oo +{/snippet} diff --git a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js index 58ccf7ed7f..bcddb6f658 100644 --- a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/client/index.svelte.js @@ -2,17 +2,17 @@ import "svelte/internal/disclose-version"; import * as $ from "svelte/internal/client"; import TextInput from './Child.svelte'; -var root = $.template(` `, 1); +const snippet = ($$anchor) => { + $.next(); -export default function Bind_component_snippet($$anchor) { - const snippet = ($$anchor) => { - $.next(); + var text = $.text("Something"); - var text = $.text("Something"); + $.append($$anchor, text); +}; - $.append($$anchor, text); - }; +var root = $.template(` `, 1); +export default function Bind_component_snippet($$anchor) { let value = $.state(''); const _snippet = snippet; var fragment = root(); diff --git a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js index b645d05570..d223a31502 100644 --- a/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/bind-component-snippet/_expected/server/index.svelte.js @@ -1,14 +1,13 @@ import * as $ from "svelte/internal/server"; import TextInput from './Child.svelte'; +function snippet($$payload) { + $$payload.out += `Something`; +} + export default function Bind_component_snippet($$payload) { let value = ''; const _snippet = snippet; - - function snippet($$payload) { - $$payload.out += `Something`; - } - let $$settled = true; let $$inner_payload;