From 6cf2ec5f832992c54dba9d8715b356f6671d205f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 6 Jun 2024 09:20:11 -0400 Subject: [PATCH] chore: finish up const tag work (#11931) simplify code a bit, revealed a state-not-updated-correctly bug --- .../3-transform/client/visitors/template.js | 3 +- .../3-transform/server/transform-server.js | 5 ++- .../src/compiler/phases/3-transform/utils.js | 41 ++++++++----------- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js index 9ad4b3d7d..e7bd5765f 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/template.js @@ -839,8 +839,7 @@ function serialize_inline_component(node, component_name, context) { } } - children[slot_name] = children[slot_name] || []; - children[slot_name].push(child); + (children[slot_name] ||= []).push(child); } // Serialize each slot diff --git a/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js b/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js index 0e5046e5b..78f677b8e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/transform-server.js @@ -1382,7 +1382,10 @@ const template_visitors = { node.fragment.nodes, inner_context.path, metadata.namespace, - context.state, + { + ...context.state, + scope: /** @type {import('../../scope').Scope} */ (context.state.scopes.get(node.fragment)) + }, state.preserve_whitespace, state.options.preserveComments ); diff --git a/packages/svelte/src/compiler/phases/3-transform/utils.js b/packages/svelte/src/compiler/phases/3-transform/utils.js index 251510ada..629917719 100644 --- a/packages/svelte/src/compiler/phases/3-transform/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/utils.js @@ -35,12 +35,10 @@ function sort_const_tags(nodes, state) { /** * @typedef {{ * node: import('#compiler').ConstTag; - * ids: import('#compiler').Binding[]; * deps: Set; * }} Tag */ - const const_tags = []; const other = []; /** @type {Map} */ @@ -52,19 +50,12 @@ function sort_const_tags(nodes, state) { if (node.type === 'ConstTag') { const declaration = node.declaration.declarations[0]; - /** @type {Tag} */ - const tag = { - node, - ids: extract_identifiers(declaration.id).map((id) => { - return /** @type {import('#compiler').Binding} */ (state.scope.get(id.name)); - }), - /** @type {Set} */ - deps: new Set() - }; - - for (const id of tag.ids) { - tags.set(id, tag); - } + const bindings = extract_identifiers(declaration.id).map((id) => { + return /** @type {import('#compiler').Binding} */ (state.scope.get(id.name)); + }); + + /** @type {Set} */ + const deps = new Set(); walk(declaration.init, state, { _, @@ -73,30 +64,30 @@ function sort_const_tags(nodes, state) { if (is_reference(node, parent)) { const binding = context.state.scope.get(node.name); - if (binding) tag.deps.add(binding); + if (binding) deps.add(binding); } } }); - const_tags.push(tag); + for (const binding of bindings) { + tags.set(binding, { node, deps }); + } } else { other.push(node); } } - if (const_tags.length === 0) { + if (tags.size === 0) { return nodes; } /** @type {Array<[import('#compiler').Binding, import('#compiler').Binding]>} */ const edges = []; - for (const tag of const_tags) { - for (const id of tag.ids) { - for (const dep of tag.deps) { - if (tags.has(dep)) { - edges.push([id, dep]); - } + for (const [id, tag] of tags) { + for (const dep of tag.deps) { + if (tags.has(dep)) { + edges.push([id, dep]); } } } @@ -124,7 +115,7 @@ function sort_const_tags(nodes, state) { sorted.push(tag.node); } - for (const tag of const_tags) { + for (const tag of tags.values()) { add(tag); }