Skip to content

Commit 3e2fa00

Browse files
paoloricciutiRich-Harris
authored andcommitted
fix: throw compilation error for malformed snippets (sveltejs#12144)
* fix: throw compilation error for malformed snippets * fix: support multiline * tweak --------- Co-authored-by: Rich Harris <[email protected]>
1 parent 25e0166 commit 3e2fa00

File tree

6 files changed

+35
-11
lines changed

6 files changed

+35
-11
lines changed

.changeset/polite-ways-serve.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
fix: throw compilation error for malformed snippets

packages/svelte/src/compiler/phases/1-parse/state/tag.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -269,28 +269,27 @@ function open(parser) {
269269
e.expected_identifier(parser.index);
270270
}
271271

272-
let slice_end = parser.index;
272+
const params_start = parser.index;
273273

274274
parser.eat('(', true);
275-
276275
let parentheses = 1;
277-
let params = '';
278276

279-
while (!parser.match(')') || parentheses !== 1) {
277+
while (parser.index < parser.template.length && (!parser.match(')') || parentheses !== 1)) {
280278
if (parser.match('(')) parentheses++;
281279
if (parser.match(')')) parentheses--;
282-
params += parser.read(/^./);
280+
parser.index += 1;
283281
}
284282

283+
parser.eat(')', true);
284+
285+
const prelude = parser.template.slice(0, params_start).replace(/\S/g, ' ');
286+
const params = parser.template.slice(params_start, parser.index);
287+
285288
let function_expression = /** @type {import('estree').ArrowFunctionExpression} */ (
286-
parse_expression_at(
287-
parser.template.slice(0, slice_end).replace(/\S/g, ' ') + `(${params}) => {}`,
288-
parser.ts,
289-
0
290-
)
289+
parse_expression_at(prelude + `${params} => {}`, parser.ts, params_start)
291290
);
292291

293-
parser.index += 2;
292+
parser.eat('}', true);
294293

295294
/** @type {ReturnType<typeof parser.append<import('#compiler').SnippetBlock>>} */
296295
const block = parser.append({
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
error: {
5+
code: 'expected_token',
6+
message: 'Expected token )',
7+
position: [31, 31]
8+
}
9+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{#snippet children(hi{/snippet}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
error: {
5+
code: 'expected_token',
6+
message: 'Expected token }',
7+
position: [20, 20]
8+
}
9+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{#snippet children()hi{/snippet}

0 commit comments

Comments
 (0)