From 7c5e28165bf4daea77cfa4af2827efc6a1f7cac2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 30 Jan 2024 21:23:29 -0500 Subject: [PATCH 1/3] chore: simpler const parsing --- .../src/compiler/phases/1-parse/state/tag.js | 45 +++++-------------- 1 file changed, 12 insertions(+), 33 deletions(-) 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 9f8a57c0556c..6deed7298e2d 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -550,42 +550,17 @@ function special(parser) { } if (parser.eat('const')) { - // {@const a = b} - const start_index = parser.index - 5; - parser.require_whitespace(); + parser.allow_whitespace(); - let end_index = parser.index; - /** @type {import('estree').VariableDeclaration | undefined} */ - let declaration = undefined; + const id = read_context(parser); + parser.allow_whitespace(); - // Can't use parse_expression_at here, so we try to parse until we find the correct range - const dummy_spaces = parser.template.substring(0, start_index).replace(/[^\n]/g, ' '); - while (true) { - end_index = parser.template.indexOf('}', end_index + 1); - if (end_index === -1) break; - try { - const node = parse( - dummy_spaces + parser.template.substring(start_index, end_index), - parser.ts - ).body[0]; - if (node?.type === 'VariableDeclaration') { - declaration = node; - break; - } - } catch (e) { - continue; - } - } + parser.eat('=', true); + parser.allow_whitespace(); - if ( - declaration === undefined || - declaration.declarations.length !== 1 || - declaration.declarations[0].init === undefined - ) { - error(start, 'invalid-const'); - } + const init = read_expression(parser); + parser.allow_whitespace(); - parser.index = end_index; parser.eat('}', true); parser.append( @@ -593,7 +568,11 @@ function special(parser) { type: 'ConstTag', start, end: parser.index, - declaration + declaration: { + type: 'VariableDeclaration', + kind: 'const', + declarations: [{ type: 'VariableDeclarator', id, init }] + } }) ); } From 818579cee12fa7a6d4534af56d867fd442c39728 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 5 Feb 2024 13:21:18 -0500 Subject: [PATCH 2/3] fix --- packages/svelte/src/compiler/phases/1-parse/state/tag.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 6deed7298e2d..b580b27c9e02 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -571,7 +571,9 @@ function special(parser) { declaration: { type: 'VariableDeclaration', kind: 'const', - declarations: [{ type: 'VariableDeclarator', id, init }] + declarations: [{ type: 'VariableDeclarator', id, init }], + start: id.start, + end: init.end } }) ); From 146017182daa5d45087488120488eb58b00e56f7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 5 Feb 2024 13:54:33 -0500 Subject: [PATCH 3/3] fix --- packages/svelte/src/compiler/phases/1-parse/state/tag.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b580b27c9e02..08f47f5717d8 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -572,8 +572,8 @@ function special(parser) { type: 'VariableDeclaration', kind: 'const', declarations: [{ type: 'VariableDeclarator', id, init }], - start: id.start, - end: init.end + start: start + 1, + end: parser.index - 1 } }) );