Skip to content

Commit fe15ad4

Browse files
authored
fix: treat spread elements the same as call expressions (#14488)
1 parent 9fcfd7f commit fe15ad4

File tree

6 files changed

+51
-0
lines changed

6 files changed

+51
-0
lines changed

.changeset/silly-readers-double.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: treat spread elements the same as call expressions

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

+2
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import { RenderTag } from './visitors/RenderTag.js';
5151
import { SlotElement } from './visitors/SlotElement.js';
5252
import { SnippetBlock } from './visitors/SnippetBlock.js';
5353
import { SpreadAttribute } from './visitors/SpreadAttribute.js';
54+
import { SpreadElement } from './visitors/SpreadElement.js';
5455
import { StyleDirective } from './visitors/StyleDirective.js';
5556
import { SvelteBody } from './visitors/SvelteBody.js';
5657
import { SvelteComponent } from './visitors/SvelteComponent.js';
@@ -163,6 +164,7 @@ const visitors = {
163164
SlotElement,
164165
SnippetBlock,
165166
SpreadAttribute,
167+
SpreadElement,
166168
StyleDirective,
167169
SvelteBody,
168170
SvelteComponent,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/** @import { SpreadElement } from 'estree' */
2+
/** @import { Context } from '../types' */
3+
4+
/**
5+
* @param {SpreadElement} node
6+
* @param {Context} context
7+
*/
8+
export function SpreadElement(node, context) {
9+
if (context.state.expression) {
10+
// treat e.g. `[...x]` the same as `[...x.values()]`
11+
context.state.expression.has_call = true;
12+
context.state.expression.has_state = true;
13+
}
14+
15+
context.next();
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
let { numbers } = $props();
3+
</script>
4+
5+
{numbers.join(', ')}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
html: '<button>+1</button> 0, 1, 2',
6+
7+
test({ target, assert }) {
8+
const btn = target.querySelector('button');
9+
10+
flushSync(() => btn?.click());
11+
assert.htmlEqual(target.innerHTML, '<button>+1</button> 0, 1, 2, 3');
12+
}
13+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script>
2+
import { SvelteSet } from 'svelte/reactivity';
3+
import Child from './Child.svelte';
4+
5+
const numbers = new SvelteSet([0, 1, 2]);
6+
</script>
7+
8+
<button onclick={() => numbers.add(numbers.size)}>+1</button>
9+
10+
<Child numbers={[...numbers]} />

0 commit comments

Comments
 (0)