diff --git a/packages/svelte/src/compiler/phases/1-parse/acorn.js b/packages/svelte/src/compiler/phases/1-parse/acorn.js index 45a7c2a58c..6432487c1a 100644 --- a/packages/svelte/src/compiler/phases/1-parse/acorn.js +++ b/packages/svelte/src/compiler/phases/1-parse/acorn.js @@ -92,6 +92,13 @@ export function parse_expression_at(parser, source, index) { add_comments(ast); + let end = ast.end; + + const last_comment = parser.root.comments.at(-1); + if (last_comment && last_comment.end > end) end = last_comment.end; + + parser.index = end; + return ast; } catch (e) { handle_parse_error(e); diff --git a/packages/svelte/src/compiler/phases/1-parse/read/context.js b/packages/svelte/src/compiler/phases/1-parse/read/context.js index cdb239ef5b..2857bb5ac0 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -60,6 +60,8 @@ export default function read_pattern(parser) { expression.end = expression.typeAnnotation.end; } + parser.index = expression.end; + return expression; } diff --git a/packages/svelte/src/compiler/phases/1-parse/read/expression.js b/packages/svelte/src/compiler/phases/1-parse/read/expression.js index 1c8f097c2f..9d97d7a389 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/expression.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/expression.js @@ -36,13 +36,6 @@ export default function read_expression(parser, opening_token, disallow_loose) { try { const node = parse_expression_at(parser, parser.template, parser.index); - let index = /** @type {number} */ (node.end); - - const last_comment = parser.root.comments.at(-1); - if (last_comment && last_comment.end > index) index = last_comment.end; - - parser.index = index; - return /** @type {Expression} */ (remove_parens(node)); } catch (err) { // If we are in an each loop we need the error to be thrown in cases like diff --git a/packages/svelte/src/compiler/phases/1-parse/state/tag.js b/packages/svelte/src/compiler/phases/1-parse/state/tag.js index ff153128a5..606ce99d1e 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -387,14 +387,20 @@ function open(parser) { parser.eat(')', true); } - const prelude = parser.template.slice(0, params_start).replace(/\S/g, ' '); - const params = parser.template.slice(params_start, parser.index); + /** @type {Pattern[]} */ + let params = []; - let function_expression = matched - ? /** @type {ArrowFunctionExpression} */ ( - parse_expression_at(parser, prelude + `${params} => {}`, params_start) - ) - : { params: [] }; + if (matched) { + const prelude = parser.template.slice(0, params_start).replace(/\S/g, ' '); + const params_string = parser.template.slice(params_start, parser.index); + + const fn = /** @type {ArrowFunctionExpression} */ ( + parse_expression_at(parser, prelude + `${params_string} => {}`, params_start) + ); + + params = fn.params; + parser.index -= 6; + } parser.allow_whitespace(); parser.eat('}', true); @@ -406,7 +412,7 @@ function open(parser) { end: -1, expression: id, typeParams: type_params, - parameters: function_expression.params, + parameters: params, body: create_fragment(), metadata: { can_hoist: false,