From 2d0975782eadbef1d3d553e3a461752c12a5d5ce Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 19 Nov 2024 11:26:00 +0000 Subject: [PATCH 1/4] fix: output template effect for svg xlink attribute --- .changeset/serious-spiders-bake.md | 5 +++++ .../src/compiler/phases/2-analyze/visitors/Attribute.js | 4 ++++ .../samples/inline-expressions-3/_config.js | 5 +++++ .../samples/inline-expressions-3/main.svelte | 9 +++++++++ .../samples/inline-expressions-3/sprites.js | 3 +++ 5 files changed, 26 insertions(+) create mode 100644 .changeset/serious-spiders-bake.md create mode 100644 packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/_config.js create mode 100644 packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/main.svelte create mode 100644 packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/sprites.js diff --git a/.changeset/serious-spiders-bake.md b/.changeset/serious-spiders-bake.md new file mode 100644 index 000000000000..a2345ad41be0 --- /dev/null +++ b/.changeset/serious-spiders-bake.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: output template effect for svg xlink attribute diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js index ca0ea55d1fb0..d3637caadb36 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js @@ -52,6 +52,10 @@ export function Attribute(node, context) { node.metadata.expression.has_state ||= chunk.metadata.expression.has_state; node.metadata.expression.has_call ||= chunk.metadata.expression.has_call; node.metadata.expression.can_inline &&= chunk.metadata.expression.can_inline; + + if (!node.metadata.expression.can_inline) { + mark_subtree_dynamic(context.path); + } } if (is_event_attribute(node)) { diff --git a/packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/_config.js b/packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/_config.js new file mode 100644 index 000000000000..c229f97e0709 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: `
+ import { sprites } from './sprites.js' + + +
+ +
diff --git a/packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/sprites.js b/packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/sprites.js new file mode 100644 index 000000000000..055fdbd59a64 --- /dev/null +++ b/packages/svelte/tests/runtime-legacy/samples/inline-expressions-3/sprites.js @@ -0,0 +1,3 @@ +export const sprites = { + a: 'test' +}; From d0372454e9b62f0665d06fcae92f79c97ec4092c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 19 Nov 2024 11:30:25 -0500 Subject: [PATCH 2/4] mark subtree dynamic in MemberExpression visitor --- .../src/compiler/phases/2-analyze/visitors/Attribute.js | 4 ---- .../compiler/phases/2-analyze/visitors/MemberExpression.js | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js index d3637caadb36..ca0ea55d1fb0 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Attribute.js @@ -52,10 +52,6 @@ export function Attribute(node, context) { node.metadata.expression.has_state ||= chunk.metadata.expression.has_state; node.metadata.expression.has_call ||= chunk.metadata.expression.has_call; node.metadata.expression.can_inline &&= chunk.metadata.expression.can_inline; - - if (!node.metadata.expression.can_inline) { - mark_subtree_dynamic(context.path); - } } if (is_event_attribute(node)) { diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/MemberExpression.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/MemberExpression.js index adcc2da4226e..88adecbd359a 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/MemberExpression.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/MemberExpression.js @@ -4,6 +4,7 @@ import * as e from '../../../errors.js'; import * as w from '../../../warnings.js'; import { object } from '../../../utils/ast.js'; import { is_pure, is_safe_identifier } from './shared/utils.js'; +import { mark_subtree_dynamic } from './shared/fragment.js'; /** * @param {MemberExpression} node @@ -20,6 +21,8 @@ export function MemberExpression(node, context) { if (context.state.expression && !is_pure(node, context)) { context.state.expression.has_state = true; context.state.expression.can_inline = false; + + mark_subtree_dynamic(context.path); } if (!is_safe_identifier(node, context.state.scope)) { From 90a98e72f37fd0e32eb5df434d0947f313579339 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 19 Nov 2024 11:31:16 -0500 Subject: [PATCH 3/4] don't treat attributes and text nodes differently --- .../phases/2-analyze/visitors/Identifier.js | 13 ++++--------- .../_expected/client/index.svelte.js | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) 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 635f939c7520..042c467df1ed 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/Identifier.js @@ -126,16 +126,11 @@ export function Identifier(node, context) { } } - if (!can_inline && context.state.expression) { - context.state.expression.can_inline = false; - } + if (!can_inline) { + if (context.state.expression) { + context.state.expression.can_inline = false; + } - /** - * if the identifier is part of an expression tag of an attribute we want to check if it's inlinable - * before marking the subtree as dynamic. This is because if it's inlinable it will be inlined in the template - * directly making the whole thing actually static. - */ - if (!can_inline || !context.path.find((node) => node.type === 'Attribute')) { mark_subtree_dynamic(context.path); } } diff --git a/packages/svelte/tests/snapshot/samples/inline-module-vars/_expected/client/index.svelte.js b/packages/svelte/tests/snapshot/samples/inline-module-vars/_expected/client/index.svelte.js index 75e632239e0b..462262442437 100644 --- a/packages/svelte/tests/snapshot/samples/inline-module-vars/_expected/client/index.svelte.js +++ b/packages/svelte/tests/snapshot/samples/inline-module-vars/_expected/client/index.svelte.js @@ -11,7 +11,7 @@ var root = $.template(`