Skip to content

Commit 055dda4

Browse files
committed
improve build_template_literal
1 parent b000202 commit 055dda4

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@ import { build_template_literal } from './shared/utils.js';
88
* @param {ComponentContext} context
99
*/
1010
export function TitleElement(node, context) {
11-
let has_state = node.fragment.nodes.some(
12-
(node) => node.type === 'ExpressionTag' && node.metadata.expression.has_state
13-
);
14-
15-
const value = build_template_literal(
11+
const { has_state, value } = build_template_literal(
1612
/** @type {any} */ (node.fragment.nodes),
1713
context.visit,
1814
context.state
19-
)[1];
15+
);
2016

2117
const statement = b.stmt(b.assignment('=', b.member(b.id('$.document'), b.id('title')), value));
2218

packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/element.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ export function build_attribute_value(value, context) {
112112
];
113113
}
114114

115-
return build_template_literal(value, context.visit, context.state);
115+
const { has_call, value: v } = build_template_literal(value, context.visit, context.state);
116+
117+
// TODO return the same signature
118+
return [has_call, v];
116119
}
117120

118121
/**

packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export function process_children(nodes, expression, is_element, { visit, state }
6666

6767
state.template.push(' ');
6868

69-
const [has_call, value] = build_template_literal(sequence, visit, state);
69+
const { has_call, value } = build_template_literal(sequence, visit, state);
7070

7171
const update = b.stmt(b.call('$.set_text', text_id, value));
7272

packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,41 @@ import { locator } from '../../../../../state.js';
1414
* @param {Array<Text | ExpressionTag>} values
1515
* @param {(node: SvelteNode, state: any) => any} visit
1616
* @param {ComponentClientTransformState} state
17-
* @returns {[boolean, TemplateLiteral]}
1817
*/
1918
export function build_template_literal(values, visit, state) {
20-
/** @type {TemplateElement[]} */
21-
const quasis = [];
22-
2319
/** @type {Expression[]} */
2420
const expressions = [];
21+
22+
let quasi = b.quasi('');
23+
const quasis = [quasi];
24+
2525
let has_call = false;
26+
let has_state = false;
2627
let contains_multiple_call_expression = false;
27-
quasis.push(b.quasi(''));
2828

2929
for (let i = 0; i < values.length; i++) {
3030
const node = values[i];
3131

32-
if (node.type === 'ExpressionTag' && node.metadata.expression.has_call) {
33-
if (has_call) {
34-
contains_multiple_call_expression = true;
32+
if (node.type === 'ExpressionTag') {
33+
if (node.metadata.expression.has_call) {
34+
if (has_call) {
35+
contains_multiple_call_expression = true;
36+
}
37+
has_call = true;
3538
}
36-
has_call = true;
39+
40+
has_state ||= node.metadata.expression.has_state;
3741
}
3842
}
3943

4044
for (let i = 0; i < values.length; i++) {
4145
const node = values[i];
4246

4347
if (node.type === 'Text') {
44-
const last = /** @type {TemplateElement} */ (quasis.at(-1));
45-
last.value.raw += sanitize_template_string(node.data);
48+
quasi.value.raw += sanitize_template_string(node.data);
4649
} else if (node.type === 'ExpressionTag' && node.expression.type === 'Literal') {
47-
const last = /** @type {TemplateElement} */ (quasis.at(-1));
4850
if (node.expression.value != null) {
49-
last.value.raw += sanitize_template_string(node.expression.value + '');
51+
quasi.value.raw += sanitize_template_string(node.expression.value + '');
5052
}
5153
} else {
5254
if (contains_multiple_call_expression) {
@@ -65,12 +67,15 @@ export function build_template_literal(values, visit, state) {
6567
} else {
6668
expressions.push(b.logical('??', visit(node.expression, state), b.literal('')));
6769
}
68-
quasis.push(b.quasi('', i + 1 === values.length));
70+
71+
quasi = b.quasi('', i + 1 === values.length);
72+
quasis.push(quasi);
6973
}
7074
}
7175

72-
// TODO instead of this tuple, return a `{ dynamic, complex, value }` object. will DRY stuff out
73-
return [has_call, b.template(quasis, expressions)];
76+
const value = b.template(quasis, expressions);
77+
78+
return { value, has_state, has_call };
7479
}
7580

7681
/**

0 commit comments

Comments
 (0)