Skip to content

Commit 46bb54d

Browse files
committed
Merge branch 'adjust-boundary-error-message' into remove-await-outside-boundary
2 parents e72f4af + 6a8ab8e commit 46bb54d

File tree

16 files changed

+137
-104
lines changed

16 files changed

+137
-104
lines changed

packages/svelte/src/compiler/phases/1-parse/utils/create.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ export function create_fragment(transparent = false) {
1313
transparent,
1414
dynamic: false,
1515
has_await: false,
16-
// name is added later, after we've done scope analysis
17-
hoisted_promises: { id: b.id('$$promises'), promises: [] }
16+
is_async: false
1817
}
1918
};
2019
}

packages/svelte/src/compiler/phases/2-analyze/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -542,8 +542,7 @@ export function analyze_component(root, source, options) {
542542
source,
543543
snippet_renderers: new Map(),
544544
snippets: new Set(),
545-
async_deriveds: new Set(),
546-
hoisted_promises: new Map()
545+
async_deriveds: new Set()
547546
};
548547

549548
if (!runes) {

packages/svelte/src/compiler/phases/2-analyze/visitors/AwaitExpression.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,6 @@ export function AwaitExpression(node, context) {
1717
context.state.fragment.metadata.has_await = true;
1818
}
1919

20-
if (context.state.fragment) {
21-
// const len = context.state.fragment.metadata.hoisted_promises.promises.push(node.argument);
22-
// context.state.analysis.hoisted_promises.set(
23-
// node.argument,
24-
// b.member(context.state.fragment.metadata.hoisted_promises.id, b.literal(len - 1), true)
25-
// );
26-
}
27-
2820
suspend = true;
2921
}
3022

packages/svelte/src/compiler/phases/2-analyze/visitors/Fragment.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,4 @@
77
*/
88
export function Fragment(node, context) {
99
context.next({ ...context.state, fragment: node });
10-
11-
// TODO this indicates whether the fragment contains an `await` expression (not inside
12-
// a child fragment), which is necessary for ensuring that a `SnippetBlock` creates an
13-
// async function in SSR. It feels like this is probably duplicative, but it's late
14-
// and it works, so for now I'm doing it like this
15-
node.metadata.is_async ||= node.metadata.hoisted_promises.promises.length > 0;
16-
17-
if (node.metadata.hoisted_promises.promises.length === 1) {
18-
// if there's only one promise in this fragment, we don't need to de-waterfall it
19-
context.state.analysis.hoisted_promises.delete(node.metadata.hoisted_promises.promises[0]);
20-
node.metadata.hoisted_promises.promises.length = 0;
21-
}
2210
}

packages/svelte/src/compiler/phases/3-transform/server/transform-server.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { dev, filename } from '../../../state.js';
1010
import { render_stylesheet } from '../css/index.js';
1111
import { AssignmentExpression } from './visitors/AssignmentExpression.js';
1212
import { AwaitBlock } from './visitors/AwaitBlock.js';
13-
import { AwaitExpression } from './visitors/AwaitExpression.js';
1413
import { CallExpression } from './visitors/CallExpression.js';
1514
import { ClassBody } from './visitors/ClassBody.js';
1615
import { Component } from './visitors/Component.js';
@@ -59,7 +58,6 @@ const global_visitors = {
5958

6059
/** @type {ComponentVisitors} */
6160
const template_visitors = {
62-
AwaitExpression,
6361
AwaitBlock,
6462
Component,
6563
ConstTag,

packages/svelte/src/compiler/phases/3-transform/server/visitors/AwaitExpression.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/svelte/src/compiler/phases/3-transform/server/visitors/Fragment.js

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,6 @@ export function Fragment(node, context) {
5252
/** @type {Statement[]} */
5353
const statements = [];
5454

55-
if (node.metadata.hoisted_promises.promises.length > 0) {
56-
statements.push(
57-
b.const(node.metadata.hoisted_promises.id, b.array(node.metadata.hoisted_promises.promises))
58-
);
59-
}
60-
6155
statements.push(...state.init);
6256
statements.push(...build_template(state.template));
6357

packages/svelte/src/compiler/phases/3-transform/server/visitors/SlotElement.js

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22
/** @import { AST } from '#compiler' */
33
/** @import { ComponentContext } from '../types.js' */
44
import * as b from '#compiler/builders';
5-
import { empty_comment, build_attribute_value } from './shared/utils.js';
5+
import {
6+
empty_comment,
7+
build_attribute_value,
8+
PromiseOptimiser,
9+
call_child_payload
10+
} from './shared/utils.js';
611

712
/**
813
* @param {AST.SlotElement} node
@@ -15,13 +20,22 @@ export function SlotElement(node, context) {
1520
/** @type {Expression[]} */
1621
const spreads = [];
1722

23+
const optimiser = new PromiseOptimiser();
24+
1825
let name = b.literal('default');
1926

2027
for (const attribute of node.attributes) {
2128
if (attribute.type === 'SpreadAttribute') {
22-
spreads.push(/** @type {Expression} */ (context.visit(attribute)));
29+
let expression = /** @type {Expression} */ (context.visit(attribute));
30+
spreads.push(optimiser.transform(expression, attribute.metadata.expression));
2331
} else if (attribute.type === 'Attribute') {
24-
const value = build_attribute_value(attribute.value, context, false, true);
32+
const value = build_attribute_value(
33+
attribute.value,
34+
context,
35+
false,
36+
true,
37+
optimiser.transform
38+
);
2539

2640
if (attribute.name === 'name') {
2741
name = /** @type {Literal} */ (value);
@@ -50,5 +64,10 @@ export function SlotElement(node, context) {
5064
fallback
5165
);
5266

53-
context.state.template.push(empty_comment, b.stmt(slot), empty_comment);
67+
const statement =
68+
optimiser.expressions.length > 0
69+
? call_child_payload(b.block([optimiser.apply(), b.stmt(slot)]), true)
70+
: b.stmt(slot);
71+
72+
context.state.template.push(empty_comment, statement, empty_comment);
5473
}

packages/svelte/src/compiler/phases/3-transform/server/visitors/SvelteHead.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ export function SvelteHead(node, context) {
1111
const block = /** @type {BlockStatement} */ (context.visit(node.fragment));
1212

1313
context.state.template.push(
14-
b.stmt(
15-
b.call(
16-
'$.head',
17-
b.id('$$payload'),
18-
b.arrow([b.id('$$payload')], block, node.fragment.metadata.is_sync)
19-
)
20-
)
14+
b.stmt(b.call('$.head', b.id('$$payload'), b.arrow([b.id('$$payload')], block)))
2115
);
2216
}

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,6 @@ import { process_children, build_template, call_child_payload } from './shared/u
88
* @param {ComponentContext} context
99
*/
1010
export function TitleElement(node, context) {
11-
if (node.fragment.metadata.hoisted_promises.promises.length > 0) {
12-
context.state.init.push(
13-
b.const(
14-
node.fragment.metadata.hoisted_promises.id,
15-
b.array(node.fragment.metadata.hoisted_promises.promises)
16-
)
17-
);
18-
}
19-
2011
// title is guaranteed to contain only text/expression tag children
2112
const template = [b.literal('<title>')];
2213
process_children(node.fragment.nodes, { ...context, state: { ...context.state, template } });

0 commit comments

Comments
 (0)