From 53d57500f7b0d3f99ead426450ef40c73ebdf919 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 10:45:20 -0500 Subject: [PATCH 01/29] preserve node locations --- .../phases/3-transform/client/visitors/CallExpression.js | 3 ++- .../3-transform/client/visitors/VariableDeclaration.js | 3 ++- packages/svelte/src/compiler/utils/builders.js | 8 ++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js index e7468291a05c..f69bc5fe6e8d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/CallExpression.js @@ -39,7 +39,8 @@ export function CallExpression(node, context) { } } - return b.call('$.state', value); + const callee = b.id('$.state', node.callee.loc); + return b.call(callee, value); } case '$derived': diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js index f830e8c57d88..57dba202baf2 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/VariableDeclaration.js @@ -136,7 +136,8 @@ export function VariableDeclaration(node, context) { } if (is_state) { - value = b.call('$.state', value); + const callee = b.id('$.state', /** @type {CallExpression} */ (init).callee.loc); + value = b.call(callee, value); if (dev) { value = b.call('$.tag', value, b.literal(id.name)); diff --git a/packages/svelte/src/compiler/utils/builders.js b/packages/svelte/src/compiler/utils/builders.js index 82fce262b9d9..223676d22ff0 100644 --- a/packages/svelte/src/compiler/utils/builders.js +++ b/packages/svelte/src/compiler/utils/builders.js @@ -262,10 +262,14 @@ export function get(name, body) { /** * @param {string} name + * @param {ESTree.SourceLocation | null} [loc] * @returns {ESTree.Identifier} */ -export function id(name) { - return { type: 'Identifier', name }; +export function id(name, loc) { + const node = /** @type {ESTree.Identifier} */ ({ type: 'Identifier', name }); + if (loc) node.loc = loc; + + return node; } /** From 2f8a07939d967442f2dc7fb70020c3caf6bae1ee Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 11:51:32 -0500 Subject: [PATCH 02/29] preserve component IDs --- .../compiler/phases/1-parse/state/element.js | 27 ++++++++++++++++++- .../3-transform/client/visitors/Component.js | 3 +-- .../client/visitors/SvelteComponent.js | 3 ++- .../3-transform/client/visitors/SvelteSelf.js | 4 ++- .../client/visitors/shared/component.js | 12 ++++----- .../svelte/src/compiler/types/template.d.ts | 1 + packages/svelte/types/index.d.ts | 1 + 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index bd1bd33c418f..7b5ddc87aa13 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -1,4 +1,5 @@ -/** @import { Expression } from 'estree' */ +/** @import { Expression, SourceLocation } from 'estree' */ +/** @import { Location } from 'locate-character' */ /** @import { AST } from '#compiler' */ /** @import { Parser } from '../index.js' */ import { is_void } from '../../../../utils.js'; @@ -13,6 +14,8 @@ import { create_attribute, ExpressionMetadata, is_element_node } from '../../nod import { get_attribute_expression, is_expression_attribute } from '../../../utils/ast.js'; import { closing_tag_omitted } from '../../../../html-tree-validation.js'; import { list } from '../../../utils/string.js'; +import { locator } from '../../../state.js'; +import * as b from '#compiler/builders'; const regex_invalid_unquoted_attribute_value = /^(\/>|[\s"'=<>`])/; const regex_closing_textarea_tag = /^<\/textarea(\s[^>]*)?>/i; @@ -67,6 +70,20 @@ export default function element(parser) { return; } + const start_location = /** @type {Location} */ (locator(parser.index)); + + /** @type {SourceLocation} */ + const loc = { + start: { + line: start_location.line, + column: start_location.column + }, + end: { + line: -1, + column: -1 + } + }; + const is_closing_tag = parser.eat('/'); const name = parser.read_until(regex_whitespace_or_slash_or_closing_tag); @@ -125,6 +142,10 @@ export default function element(parser) { return; } + const end_location = /** @type {Location} */ (locator(parser.index)); + loc.end.line = end_location.line; + loc.end.column = end_location.column; + if (name.startsWith('svelte:') && !meta_tags.has(name)) { const bounds = { start: start + 1, end: start + 1 + name.length }; e.svelte_meta_invalid_tag(bounds, list(Array.from(meta_tags.keys()))); @@ -161,6 +182,8 @@ export default function element(parser) { ? 'SlotElement' : 'RegularElement'; + const id = b.id(name, loc); + /** @type {AST.ElementLike} */ const element = type === 'RegularElement' @@ -168,6 +191,7 @@ export default function element(parser) { type, start, end: -1, + id, name, attributes: [], fragment: create_fragment(true), @@ -184,6 +208,7 @@ export default function element(parser) { type, start, end: -1, + id, name, attributes: [], fragment: create_fragment(true), diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js index 9b86557536d0..549bd3b18889 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js @@ -1,6 +1,5 @@ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../types' */ -import { regex_is_valid_identifier } from '../../../patterns.js'; import { build_component } from './shared/component.js'; /** @@ -8,6 +7,6 @@ import { build_component } from './shared/component.js'; * @param {ComponentContext} context */ export function Component(node, context) { - const component = build_component(node, node.name, context); + const component = build_component(node, node.id, context); context.state.init.push(component); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js index 85a4b611c013..dd0796697c1e 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js @@ -1,12 +1,13 @@ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../types' */ import { build_component } from './shared/component.js'; +import * as b from '#compiler/builders'; /** * @param {AST.SvelteComponent} node * @param {ComponentContext} context */ export function SvelteComponent(node, context) { - const component = build_component(node, '$$component', context); + const component = build_component(node, b.id('$$component'), context); context.state.init.push(component); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js index 285951499caf..4d2a552eb2f8 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js @@ -1,12 +1,14 @@ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../types' */ +import { component_name } from '../../../../state.js'; import { build_component } from './shared/component.js'; +import * as b from '#compiler/builders'; /** * @param {AST.SvelteSelf} node * @param {ComponentContext} context */ export function SvelteSelf(node, context) { - const component = build_component(node, context.state.analysis.name, context); + const component = build_component(node, b.id(component_name), context); context.state.init.push(component); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index d70048ad7eb9..0ef1bb35a158 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -11,11 +11,11 @@ import { determine_slot } from '../../../../../utils/slot.js'; /** * @param {AST.Component | AST.SvelteComponent | AST.SvelteSelf} node - * @param {string} component_name + * @param {Identifier} id * @param {ComponentContext} context * @returns {Statement} */ -export function build_component(node, component_name, context) { +export function build_component(node, id, context) { /** @type {Expression} */ const anchor = context.state.node; @@ -220,7 +220,7 @@ export function build_component(node, component_name, context) { b.call( '$$ownership_validator.binding', b.literal(binding.node.name), - b.id(is_component_dynamic ? intermediate_name : component_name), + is_component_dynamic ? b.id(intermediate_name) : id, b.thunk(expression) ) ) @@ -438,9 +438,7 @@ export function build_component(node, component_name, context) { // TODO We can remove this ternary once we remove legacy mode, since in runes mode dynamic components // will be handled separately through the `$.component` function, and then the component name will // always be referenced through just the identifier here. - is_component_dynamic - ? intermediate_name - : /** @type {Expression} */ (context.visit(b.member_id(component_name))), + is_component_dynamic ? intermediate_name : /** @type {Expression} */ (context.visit(id)), node_id, props_expression ); @@ -470,7 +468,7 @@ export function build_component(node, component_name, context) { node_id, b.thunk( /** @type {Expression} */ ( - context.visit(node.type === 'Component' ? b.member_id(component_name) : node.expression) + context.visit(node.type === 'Component' ? id : node.expression) ) ), b.arrow( diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index c06b77c53cd9..c24f7a46b66f 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -309,6 +309,7 @@ export namespace AST { } export interface BaseElement extends BaseNode { + id: Identifier; name: string; attributes: Array; fragment: Fragment; diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 8561268689ca..56de9f6ff6a3 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -1392,6 +1392,7 @@ declare module 'svelte/compiler' { } export interface BaseElement extends BaseNode { + id: Identifier; name: string; attributes: Array; fragment: Fragment; From aaf5094a1024f44e108ebb2e0ff6d709ab9b2c87 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 12:38:50 -0500 Subject: [PATCH 03/29] update tests --- packages/svelte/tests/parser-legacy/test.ts | 2 +- .../samples/attachments/output.json | 14 ++ .../output.json | 14 ++ .../samples/css-nth-syntax/output.json | 14 ++ .../samples/if-block-else/output.json | 28 +++ .../samples/if-block-elseif/output.json | 28 +++ .../loose-invalid-expression/output.json | 84 +++++++ .../loose-unclosed-open-tag/output.json | 98 ++++++++ .../samples/loose-unclosed-tag/output.json | 210 ++++++++++++++++++ .../samples/loose-valid-each-as/output.json | 14 ++ .../semicolon-inside-quotes/output.json | 14 ++ .../samples/snippets/output.json | 14 ++ .../samples/template-shadowroot/output.json | 98 ++++++++ .../typescript-in-event-handler/output.json | 14 ++ packages/svelte/tests/parser-modern/test.ts | 16 +- 15 files changed, 660 insertions(+), 2 deletions(-) diff --git a/packages/svelte/tests/parser-legacy/test.ts b/packages/svelte/tests/parser-legacy/test.ts index 987253d8d069..2e64389404fe 100644 --- a/packages/svelte/tests/parser-legacy/test.ts +++ b/packages/svelte/tests/parser-legacy/test.ts @@ -18,7 +18,7 @@ const { test, run } = suite(async (config, cwd) => { // run `UPDATE_SNAPSHOTS=true pnpm test parser` to update parser tests if (process.env.UPDATE_SNAPSHOTS) { - fs.writeFileSync(`${cwd}/output.json`, JSON.stringify(actual, null, '\t')); + fs.writeFileSync(`${cwd}/output.json`, JSON.stringify(actual, null, '\t') + '\n'); } else { fs.writeFileSync(`${cwd}/_actual.json`, JSON.stringify(actual, null, '\t')); diff --git a/packages/svelte/tests/parser-modern/samples/attachments/output.json b/packages/svelte/tests/parser-modern/samples/attachments/output.json index 42e9880fccdd..bdb80cde805f 100644 --- a/packages/svelte/tests/parser-modern/samples/attachments/output.json +++ b/packages/svelte/tests/parser-modern/samples/attachments/output.json @@ -11,6 +11,20 @@ "type": "RegularElement", "start": 0, "end": 57, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + } + } + }, "name": "div", "attributes": [ { diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json index dba258a6b164..6de5ed1b562b 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json @@ -18,6 +18,20 @@ "type": "RegularElement", "start": 37, "end": 117, + "id": { + "type": "Identifier", + "name": "input", + "loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 6 + } + } + }, "name": "input", "attributes": [ { diff --git a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json index a126acb4c3f8..0cb852064b99 100644 --- a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json +++ b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json @@ -1096,6 +1096,20 @@ "type": "RegularElement", "start": 808, "end": 820, + "id": { + "type": "Identifier", + "name": "h1", + "loc": { + "start": { + "line": 46, + "column": 1 + }, + "end": { + "line": 46, + "column": 3 + } + } + }, "name": "h1", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/if-block-else/output.json b/packages/svelte/tests/parser-modern/samples/if-block-else/output.json index cf47e3e0bb74..3df6a07ba52c 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block-else/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block-else/output.json @@ -42,6 +42,20 @@ "type": "RegularElement", "start": 11, "end": 21, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -80,6 +94,20 @@ "type": "RegularElement", "start": 31, "end": 45, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json b/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json index b10d50c93906..dc171636e5f3 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json @@ -75,6 +75,20 @@ "type": "RegularElement", "start": 14, "end": 41, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -170,6 +184,20 @@ "type": "RegularElement", "start": 60, "end": 83, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json index 56fa4286ddae..b9ba26eca44e 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json @@ -11,6 +11,20 @@ "type": "RegularElement", "start": 0, "end": 14, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + } + } + }, "name": "div", "attributes": [ { @@ -47,6 +61,20 @@ "type": "RegularElement", "start": 15, "end": 33, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 2, + "column": 1 + }, + "end": { + "line": 2, + "column": 4 + } + } + }, "name": "div", "attributes": [ { @@ -83,6 +111,20 @@ "type": "RegularElement", "start": 35, "end": 55, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 4, + "column": 1 + }, + "end": { + "line": 4, + "column": 4 + } + } + }, "name": "div", "attributes": [ { @@ -119,6 +161,20 @@ "type": "RegularElement", "start": 56, "end": 80, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 4 + } + } + }, "name": "div", "attributes": [ { @@ -155,6 +211,20 @@ "type": "Component", "start": 81, "end": 113, + "id": { + "type": "Identifier", + "name": "Component", + "loc": { + "start": { + "line": 6, + "column": 1 + }, + "end": { + "line": 6, + "column": 10 + } + } + }, "name": "Component", "attributes": [ { @@ -191,6 +261,20 @@ "type": "RegularElement", "start": 115, "end": 140, + "id": { + "type": "Identifier", + "name": "input", + "loc": { + "start": { + "line": 8, + "column": 1 + }, + "end": { + "line": 8, + "column": 6 + } + } + }, "name": "input", "attributes": [ { diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json index a0e13d4352aa..3b526797b147 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json @@ -11,6 +11,20 @@ "type": "RegularElement", "start": 0, "end": 29, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -27,6 +41,20 @@ "type": "Component", "start": 7, "end": 23, + "id": { + "type": "Identifier", + "name": "Comp", + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 + } + } + }, "name": "Comp", "attributes": [ { @@ -76,6 +104,20 @@ "type": "RegularElement", "start": 31, "end": 60, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -92,6 +134,20 @@ "type": "RegularElement", "start": 38, "end": 54, + "id": { + "type": "Identifier", + "name": "span", + "loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 6 + } + } + }, "name": "span", "attributes": [ { @@ -172,6 +228,20 @@ "type": "Component", "start": 73, "end": 89, + "id": { + "type": "Identifier", + "name": "Comp", + "loc": { + "start": { + "line": 10, + "column": 2 + }, + "end": { + "line": 10, + "column": 6 + } + } + }, "name": "Comp", "attributes": [ { @@ -253,6 +323,20 @@ "type": "Component", "start": 107, "end": 124, + "id": { + "type": "Identifier", + "name": "Comp", + "loc": { + "start": { + "line": 14, + "column": 2 + }, + "end": { + "line": 14, + "column": 6 + } + } + }, "name": "Comp", "attributes": [ { @@ -373,6 +457,20 @@ "type": "RegularElement", "start": 156, "end": 170, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 20, + "column": 1 + }, + "end": { + "line": 20, + "column": 4 + } + } + }, "name": "div", "attributes": [ { diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json index cf9138c02629..5ffb38eeed8b 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json @@ -11,6 +11,20 @@ "type": "RegularElement", "start": 0, "end": 20, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -27,6 +41,20 @@ "type": "Component", "start": 7, "end": 14, + "id": { + "type": "Identifier", + "name": "Comp", + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 + } + } + }, "name": "Comp", "attributes": [], "fragment": { @@ -56,6 +84,20 @@ "type": "RegularElement", "start": 22, "end": 51, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -72,6 +114,20 @@ "type": "Component", "start": 29, "end": 45, + "id": { + "type": "Identifier", + "name": "Comp", + "loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 6 + } + } + }, "name": "Comp", "attributes": [ { @@ -121,6 +177,20 @@ "type": "RegularElement", "start": 53, "end": 72, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 9, + "column": 1 + }, + "end": { + "line": 9, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -137,6 +207,20 @@ "type": "RegularElement", "start": 60, "end": 66, + "id": { + "type": "Identifier", + "name": "span", + "loc": { + "start": { + "line": 10, + "column": 2 + }, + "end": { + "line": 10, + "column": 6 + } + } + }, "name": "span", "attributes": [], "fragment": { @@ -158,6 +242,20 @@ "type": "RegularElement", "start": 74, "end": 94, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 13, + "column": 1 + }, + "end": { + "line": 13, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -174,6 +272,20 @@ "type": "Component", "start": 81, "end": 88, + "id": { + "type": "Identifier", + "name": "Comp.", + "loc": { + "start": { + "line": 14, + "column": 2 + }, + "end": { + "line": 14, + "column": 7 + } + } + }, "name": "Comp.", "attributes": [], "fragment": { @@ -195,6 +307,20 @@ "type": "RegularElement", "start": 96, "end": 116, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 17, + "column": 1 + }, + "end": { + "line": 17, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -211,6 +337,20 @@ "type": "Component", "start": 103, "end": 110, + "id": { + "type": "Identifier", + "name": "comp.", + "loc": { + "start": { + "line": 18, + "column": 2 + }, + "end": { + "line": 18, + "column": 7 + } + } + }, "name": "comp.", "attributes": [], "fragment": { @@ -263,6 +403,20 @@ "type": "RegularElement", "start": 129, "end": 135, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 22, + "column": 2 + }, + "end": { + "line": 22, + "column": 5 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -324,6 +478,20 @@ "type": "Component", "start": 153, "end": 169, + "id": { + "type": "Identifier", + "name": "Comp", + "loc": { + "start": { + "line": 26, + "column": 2 + }, + "end": { + "line": 26, + "column": 6 + } + } + }, "name": "Comp", "attributes": [ { @@ -374,6 +542,20 @@ "type": "RegularElement", "start": 176, "end": 204, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 29, + "column": 1 + }, + "end": { + "line": 29, + "column": 4 + } + } + }, "name": "div", "attributes": [], "fragment": { @@ -390,6 +572,20 @@ "type": "RegularElement", "start": 182, "end": 191, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 30, + "column": 1 + }, + "end": { + "line": 30, + "column": 2 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -416,6 +612,20 @@ "type": "RegularElement", "start": 193, "end": 204, + "id": { + "type": "Identifier", + "name": "open-ended", + "loc": { + "start": { + "line": 32, + "column": 1 + }, + "end": { + "line": 32, + "column": 11 + } + } + }, "name": "open-ended", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json index 181f1ba25000..c8450f185a2f 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json @@ -48,6 +48,20 @@ "type": "RegularElement", "start": 86, "end": 111, + "id": { + "type": "Identifier", + "name": "div", + "loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 5 + } + } + }, "name": "div", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json index 33dd78879cff..2eb1eba81177 100644 --- a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json +++ b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json @@ -86,6 +86,20 @@ "type": "RegularElement", "start": 0, "end": 35, + "id": { + "type": "Identifier", + "name": "h1", + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 3 + } + } + }, "name": "h1", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json index acf484d8ae16..f8fc0427e780 100644 --- a/packages/svelte/tests/parser-modern/samples/snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json @@ -86,6 +86,20 @@ "type": "RegularElement", "start": 58, "end": 70, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json index 65d716a82b8f..29272828eaa3 100644 --- a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json +++ b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json @@ -11,6 +11,20 @@ "type": "RegularElement", "start": 0, "end": 66, + "id": { + "type": "Identifier", + "name": "template", + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 9 + } + } + }, "name": "template", "attributes": [ { @@ -43,6 +57,20 @@ "type": "RegularElement", "start": 34, "end": 54, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -52,6 +80,20 @@ "type": "RegularElement", "start": 37, "end": 50, + "id": { + "type": "Identifier", + "name": "slot", + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 9 + } + } + }, "name": "slot", "attributes": [], "fragment": { @@ -83,6 +125,20 @@ "type": "RegularElement", "start": 67, "end": 111, + "id": { + "type": "Identifier", + "name": "template", + "loc": { + "start": { + "line": 4, + "column": 1 + }, + "end": { + "line": 4, + "column": 9 + } + } + }, "name": "template", "attributes": [], "fragment": { @@ -99,6 +155,20 @@ "type": "RegularElement", "start": 79, "end": 99, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 5, + "column": 2 + }, + "end": { + "line": 5, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -108,6 +178,20 @@ "type": "SlotElement", "start": 82, "end": 95, + "id": { + "type": "Identifier", + "name": "slot", + "loc": { + "start": { + "line": 5, + "column": 5 + }, + "end": { + "line": 5, + "column": 9 + } + } + }, "name": "slot", "attributes": [], "fragment": { @@ -139,6 +223,20 @@ "type": "SlotElement", "start": 112, "end": 125, + "id": { + "type": "Identifier", + "name": "slot", + "loc": { + "start": { + "line": 7, + "column": 1 + }, + "end": { + "line": 7, + "column": 5 + } + } + }, "name": "slot", "attributes": [], "fragment": { diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json index 9c515ad9058f..600d12c2c0a6 100644 --- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json +++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json @@ -18,6 +18,20 @@ "type": "RegularElement", "start": 54, "end": 173, + "id": { + "type": "Identifier", + "name": "button", + "loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 7 + } + } + }, "name": "button", "attributes": [ { diff --git a/packages/svelte/tests/parser-modern/test.ts b/packages/svelte/tests/parser-modern/test.ts index e38bfc7525e4..4bcc7a97c4b6 100644 --- a/packages/svelte/tests/parser-modern/test.ts +++ b/packages/svelte/tests/parser-modern/test.ts @@ -29,7 +29,7 @@ const { test, run } = suite(async (config, cwd) => { // run `UPDATE_SNAPSHOTS=true pnpm test parser` to update parser tests if (process.env.UPDATE_SNAPSHOTS) { - fs.writeFileSync(`${cwd}/output.json`, JSON.stringify(actual, null, '\t')); + fs.writeFileSync(`${cwd}/output.json`, JSON.stringify(actual, null, '\t') + '\n'); } else { fs.writeFileSync(`${cwd}/_actual.json`, JSON.stringify(actual, null, '\t')); @@ -132,6 +132,20 @@ it('Strips BOM from the input', () => { nodes: [], type: 'Fragment' }, + id: { + type: 'Identifier', + name: 'div', + loc: { + end: { + column: 4, + line: 1 + }, + start: { + column: 1, + line: 1 + } + } + }, name: 'div', start: 0, type: 'RegularElement' From b41eb4e5c42bc38253e18ea17ac72f5a24eb2973 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 12:52:44 -0500 Subject: [PATCH 04/29] use IDs for elements --- .../client/visitors/shared/fragment.js | 12 ++-- .../output.json | 20 +++--- .../each-block-object-pattern/output.json | 66 +++++++++++++++---- 3 files changed, 70 insertions(+), 28 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js index 67982b6150b7..61759531ed23 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js @@ -1,4 +1,4 @@ -/** @import { Expression } from 'estree' */ +/** @import { Expression, Identifier } from 'estree' */ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../../types' */ import { cannot_be_set_statically } from '../../../../../../utils.js'; @@ -41,14 +41,14 @@ export function process_children(nodes, initial, is_element, context) { /** * @param {boolean} is_text - * @param {string} name + * @param {Identifier} node */ - function flush_node(is_text, name) { + function flush_node(is_text, node) { const expression = get_node(is_text); let id = expression; if (id.type !== 'Identifier') { - id = b.id(context.state.scope.generate(name)); + id = b.id(context.state.scope.generate(node.name), node.loc); context.state.init.push(b.var(id, expression)); } @@ -75,7 +75,7 @@ export function process_children(nodes, initial, is_element, context) { // if this is a standalone `{expression}`, make sure we handle the case where // no text node was created because the expression was empty during SSR const is_text = sequence.length === 1; - const id = flush_node(is_text, 'text'); + const id = flush_node(is_text, b.id('text')); const update = b.stmt(b.call('$.set_text', id, value)); @@ -109,7 +109,7 @@ export function process_children(nodes, initial, is_element, context) { ) { node.metadata.is_controlled = true; } else { - const id = flush_node(false, node.type === 'RegularElement' ? node.name : 'node'); + const id = flush_node(false, node.type === 'RegularElement' ? node.id : b.id('node')); child_state = { ...context.state, node: id }; } diff --git a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json index b962db322640..7fd5deb3eaed 100644 --- a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json +++ b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json @@ -79,7 +79,6 @@ }, "name": "y" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 14, @@ -127,7 +126,8 @@ "value": "z", "raw": "'z'" } - } + }, + "kind": "init" } ] } @@ -211,7 +211,6 @@ }, "name": "y" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 47, @@ -259,7 +258,8 @@ "value": "{", "raw": "'{'" } - } + }, + "kind": "init" } ] } @@ -343,7 +343,6 @@ }, "name": "y" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 80, @@ -391,7 +390,8 @@ "value": "]", "raw": "']'" } - } + }, + "kind": "init" } ] } @@ -475,7 +475,6 @@ }, "name": "y" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 113, @@ -603,7 +602,8 @@ } ] } - } + }, + "kind": "init" } ] } @@ -687,7 +687,6 @@ }, "name": "y" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 151, @@ -815,7 +814,8 @@ } ] } - } + }, + "kind": "init" } ] } diff --git a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json index 144016417b84..67c6a92384ee 100644 --- a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json +++ b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json @@ -41,6 +41,20 @@ "type": "RegularElement", "start": 41, "end": 86, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -204,7 +218,6 @@ }, "name": "name" }, - "kind": "init", "value": { "type": "Identifier", "start": 19, @@ -220,7 +233,8 @@ } }, "name": "name" - } + }, + "kind": "init" }, { "type": "Property", @@ -255,7 +269,6 @@ }, "name": "cool" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 25, @@ -303,7 +316,8 @@ "value": true, "raw": "true" } - } + }, + "kind": "init" } ] } @@ -349,6 +363,20 @@ "type": "RegularElement", "start": 155, "end": 200, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -512,7 +540,6 @@ }, "name": "name" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 115, @@ -619,7 +646,8 @@ } ] } - } + }, + "kind": "init" }, { "type": "Property", @@ -654,7 +682,6 @@ }, "name": "cool" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 139, @@ -702,7 +729,8 @@ "value": true, "raw": "true" } - } + }, + "kind": "init" } ] } @@ -748,6 +776,20 @@ "type": "RegularElement", "start": 291, "end": 336, + "id": { + "type": "Identifier", + "name": "p", + "loc": { + "start": { + "line": 10, + "column": 2 + }, + "end": { + "line": 10, + "column": 3 + } + } + }, "name": "p", "attributes": [], "fragment": { @@ -911,7 +953,6 @@ }, "name": "name" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 229, @@ -1087,7 +1128,8 @@ "arguments": [], "optional": false } - } + }, + "kind": "init" }, { "type": "Property", @@ -1122,7 +1164,6 @@ }, "name": "cool" }, - "kind": "init", "value": { "type": "AssignmentPattern", "start": 275, @@ -1170,7 +1211,8 @@ "value": true, "raw": "true" } - } + }, + "kind": "init" } ] } From 99531a72fa369b74cdef0090d33c2580183fb29e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 13:05:17 -0500 Subject: [PATCH 05/29] more --- .../compiler/phases/3-transform/client/visitors/SvelteHead.js | 2 +- .../compiler/phases/3-transform/client/visitors/TitleElement.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js index 3a45389dd73d..596a00f4ec36 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js @@ -14,7 +14,7 @@ export function SvelteHead(node, context) { context.state.init.push( b.stmt( b.call( - '$.head', + b.id('$.head', node.id.loc), b.literal(hash(filename)), b.arrow([b.id('$$anchor')], /** @type {BlockStatement} */ (context.visit(node.fragment))) ) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js index f815f3ae0576..f1b42bcc8468 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js @@ -20,7 +20,7 @@ export function TitleElement(node, context) { const statement = b.stmt( b.assignment( '=', - b.id('$.document.title'), + b.member(b.id('$.document'), b.id('title', node.id.loc)), evaluated.is_known ? b.literal(evaluated.value) : evaluated.is_defined From 22cd7abcf5335dd250024bdffd0628bed412a800 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 15:03:41 -0500 Subject: [PATCH 06/29] WIP --- .../src/compiler/phases/1-parse/state/element.js | 12 +++++------- .../phases/3-transform/client/visitors/Component.js | 2 +- .../3-transform/client/visitors/SvelteComponent.js | 2 +- .../3-transform/client/visitors/SvelteHead.js | 2 +- .../3-transform/client/visitors/SvelteSelf.js | 3 +-- .../3-transform/client/visitors/TitleElement.js | 2 +- .../3-transform/client/visitors/shared/component.js | 9 +++++---- .../3-transform/client/visitors/shared/fragment.js | 13 +++++++------ packages/svelte/src/compiler/types/template.d.ts | 5 +++-- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 7b5ddc87aa13..3ee98e04a7a6 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -73,7 +73,7 @@ export default function element(parser) { const start_location = /** @type {Location} */ (locator(parser.index)); /** @type {SourceLocation} */ - const loc = { + const name_loc = { start: { line: start_location.line, column: start_location.column @@ -143,8 +143,8 @@ export default function element(parser) { } const end_location = /** @type {Location} */ (locator(parser.index)); - loc.end.line = end_location.line; - loc.end.column = end_location.column; + name_loc.end.line = end_location.line; + name_loc.end.column = end_location.column; if (name.startsWith('svelte:') && !meta_tags.has(name)) { const bounds = { start: start + 1, end: start + 1 + name.length }; @@ -182,8 +182,6 @@ export default function element(parser) { ? 'SlotElement' : 'RegularElement'; - const id = b.id(name, loc); - /** @type {AST.ElementLike} */ const element = type === 'RegularElement' @@ -191,8 +189,8 @@ export default function element(parser) { type, start, end: -1, - id, name, + name_loc, attributes: [], fragment: create_fragment(true), metadata: { @@ -208,8 +206,8 @@ export default function element(parser) { type, start, end: -1, - id, name, + name_loc, attributes: [], fragment: create_fragment(true), metadata: { diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js index 549bd3b18889..12c7b2142b73 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Component.js @@ -7,6 +7,6 @@ import { build_component } from './shared/component.js'; * @param {ComponentContext} context */ export function Component(node, context) { - const component = build_component(node, node.id, context); + const component = build_component(node, node.name, node.name_loc, context); context.state.init.push(component); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js index dd0796697c1e..d6a0418dd041 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteComponent.js @@ -8,6 +8,6 @@ import * as b from '#compiler/builders'; * @param {ComponentContext} context */ export function SvelteComponent(node, context) { - const component = build_component(node, b.id('$$component'), context); + const component = build_component(node, '$$component', null, context); context.state.init.push(component); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js index 596a00f4ec36..f57e333a3571 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteHead.js @@ -14,7 +14,7 @@ export function SvelteHead(node, context) { context.state.init.push( b.stmt( b.call( - b.id('$.head', node.id.loc), + b.id('$.head', node.name_loc), b.literal(hash(filename)), b.arrow([b.id('$$anchor')], /** @type {BlockStatement} */ (context.visit(node.fragment))) ) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js index 4d2a552eb2f8..3d076177acc0 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/SvelteSelf.js @@ -2,13 +2,12 @@ /** @import { ComponentContext } from '../types' */ import { component_name } from '../../../../state.js'; import { build_component } from './shared/component.js'; -import * as b from '#compiler/builders'; /** * @param {AST.SvelteSelf} node * @param {ComponentContext} context */ export function SvelteSelf(node, context) { - const component = build_component(node, b.id(component_name), context); + const component = build_component(node, component_name, node.name_loc, context); context.state.init.push(component); } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js index f1b42bcc8468..d91c3874966c 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/TitleElement.js @@ -20,7 +20,7 @@ export function TitleElement(node, context) { const statement = b.stmt( b.assignment( '=', - b.member(b.id('$.document'), b.id('title', node.id.loc)), + b.member(b.id('$.document'), b.id('title', node.name_loc)), evaluated.is_known ? b.literal(evaluated.value) : evaluated.is_defined diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 0ef1bb35a158..c98fb6e3218f 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -1,4 +1,4 @@ -/** @import { BlockStatement, Expression, ExpressionStatement, Identifier, MemberExpression, Pattern, Property, SequenceExpression, Statement } from 'estree' */ +/** @import { BlockStatement, Expression, ExpressionStatement, Identifier, MemberExpression, Pattern, Property, SequenceExpression, SourceLocation, Statement } from 'estree' */ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../../types.js' */ import { dev, is_ignored } from '../../../../../state.js'; @@ -11,11 +11,12 @@ import { determine_slot } from '../../../../../utils/slot.js'; /** * @param {AST.Component | AST.SvelteComponent | AST.SvelteSelf} node - * @param {Identifier} id + * @param {string} name + * @param {SourceLocation | null} loc * @param {ComponentContext} context * @returns {Statement} */ -export function build_component(node, id, context) { +export function build_component(node, name, loc, context) { /** @type {Expression} */ const anchor = context.state.node; @@ -220,7 +221,7 @@ export function build_component(node, id, context) { b.call( '$$ownership_validator.binding', b.literal(binding.node.name), - is_component_dynamic ? b.id(intermediate_name) : id, + b.id(is_component_dynamic ? intermediate_name : name), b.thunk(expression) ) ) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js index 61759531ed23..32cc3d1cbfdf 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js @@ -1,4 +1,4 @@ -/** @import { Expression, Identifier } from 'estree' */ +/** @import { Expression, Identifier, SourceLocation } from 'estree' */ /** @import { AST } from '#compiler' */ /** @import { ComponentContext } from '../../types' */ import { cannot_be_set_statically } from '../../../../../../utils.js'; @@ -41,14 +41,15 @@ export function process_children(nodes, initial, is_element, context) { /** * @param {boolean} is_text - * @param {Identifier} node + * @param {string} name + * @param {SourceLocation | null} [loc] */ - function flush_node(is_text, node) { + function flush_node(is_text, name, loc) { const expression = get_node(is_text); let id = expression; if (id.type !== 'Identifier') { - id = b.id(context.state.scope.generate(node.name), node.loc); + id = b.id(context.state.scope.generate(name), loc); context.state.init.push(b.var(id, expression)); } @@ -75,7 +76,7 @@ export function process_children(nodes, initial, is_element, context) { // if this is a standalone `{expression}`, make sure we handle the case where // no text node was created because the expression was empty during SSR const is_text = sequence.length === 1; - const id = flush_node(is_text, b.id('text')); + const id = flush_node(is_text, 'text'); const update = b.stmt(b.call('$.set_text', id, value)); @@ -109,7 +110,7 @@ export function process_children(nodes, initial, is_element, context) { ) { node.metadata.is_controlled = true; } else { - const id = flush_node(false, node.type === 'RegularElement' ? node.id : b.id('node')); + const id = flush_node(false, node.type === 'RegularElement' ? node.name : 'node'); child_state = { ...context.state, node: id }; } diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index c24f7a46b66f..31efb75d479e 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -13,7 +13,8 @@ import type { Program, ChainExpression, SimpleCallExpression, - SequenceExpression + SequenceExpression, + SourceLocation } from 'estree'; import type { Scope } from '../phases/scope'; import type { _CSS } from './css'; @@ -309,8 +310,8 @@ export namespace AST { } export interface BaseElement extends BaseNode { - id: Identifier; name: string; + name_loc: SourceLocation; attributes: Array; fragment: Fragment; } From df631b9f8a3ac703904855eccb0a08d43f618a84 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 15:05:26 -0500 Subject: [PATCH 07/29] WIP --- .../3-transform/client/visitors/shared/component.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index c98fb6e3218f..38939a783796 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -11,12 +11,12 @@ import { determine_slot } from '../../../../../utils/slot.js'; /** * @param {AST.Component | AST.SvelteComponent | AST.SvelteSelf} node - * @param {string} name + * @param {string} component_name * @param {SourceLocation | null} loc * @param {ComponentContext} context * @returns {Statement} */ -export function build_component(node, name, loc, context) { +export function build_component(node, component_name, loc, context) { /** @type {Expression} */ const anchor = context.state.node; @@ -221,7 +221,7 @@ export function build_component(node, name, loc, context) { b.call( '$$ownership_validator.binding', b.literal(binding.node.name), - b.id(is_component_dynamic ? intermediate_name : name), + b.id(is_component_dynamic ? intermediate_name : component_name), b.thunk(expression) ) ) @@ -439,7 +439,9 @@ export function build_component(node, name, loc, context) { // TODO We can remove this ternary once we remove legacy mode, since in runes mode dynamic components // will be handled separately through the `$.component` function, and then the component name will // always be referenced through just the identifier here. - is_component_dynamic ? intermediate_name : /** @type {Expression} */ (context.visit(id)), + is_component_dynamic + ? intermediate_name + : /** @type {Expression} */ (context.visit(b.member_id(component_name))), node_id, props_expression ); @@ -469,7 +471,7 @@ export function build_component(node, name, loc, context) { node_id, b.thunk( /** @type {Expression} */ ( - context.visit(node.type === 'Component' ? id : node.expression) + context.visit(node.type === 'Component' ? b.member_id(component_name) : node.expression) ) ), b.arrow( From 3893d70242a1dc00ca03a129238ff52be4685cd5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 15:07:56 -0500 Subject: [PATCH 08/29] WIP --- .../samples/action-duplicate/output.json | 2 +- .../samples/action-with-call/output.json | 2 +- .../action-with-identifier/output.json | 2 +- .../samples/action-with-literal/output.json | 2 +- .../parser-legacy/samples/action/output.json | 2 +- .../samples/animation/output.json | 2 +- .../attribute-class-directive/output.json | 2 +- .../attribute-containing-solidus/output.json | 2 +- .../attribute-curly-bracket/output.json | 2 +- .../attribute-dynamic-boolean/output.json | 2 +- .../samples/attribute-dynamic/output.json | 2 +- .../samples/attribute-empty/output.json | 2 +- .../samples/attribute-escaped/output.json | 2 +- .../samples/attribute-multiple/output.json | 2 +- .../samples/attribute-shorthand/output.json | 2 +- .../attribute-static-boolean/output.json | 2 +- .../samples/attribute-static/output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../output.json | 2 +- .../attribute-style-directive/output.json | 2 +- .../samples/attribute-style/output.json | 2 +- .../samples/attribute-unquoted/output.json | 2 +- .../attribute-with-whitespace/output.json | 2 +- .../samples/await-catch/output.json | 2 +- .../samples/await-then-catch/output.json | 2 +- .../samples/binding-shorthand/output.json | 2 +- .../parser-legacy/samples/binding/output.json | 2 +- .../samples/comment-with-ignores/output.json | 2 +- .../parser-legacy/samples/comment/output.json | 2 +- .../samples/component-dynamic/output.json | 2 +- .../convert-entities-in-element/output.json | 2 +- .../samples/convert-entities/output.json | 2 +- .../parser-legacy/samples/css/output.json | 2 +- .../dynamic-element-string/output.json | 2 +- .../dynamic-element-variable/output.json | 2 +- .../samples/dynamic-import/output.json | 2 +- .../each-block-destructured/output.json | 2 +- .../samples/each-block-else/output.json | 2 +- .../samples/each-block-indexed/output.json | 2 +- .../samples/each-block-keyed/output.json | 2 +- .../samples/each-block/output.json | 2 +- .../output.json | 2 +- .../element-with-attribute/output.json | 2 +- .../samples/element-with-mustache/output.json | 2 +- .../samples/element-with-text/output.json | 2 +- .../samples/elements/output.json | 2 +- .../samples/event-handler/output.json | 2 +- .../samples/generic-snippets/output.json | 2 +- .../samples/if-block-else/output.json | 2 +- .../samples/if-block-elseif/output.json | 2 +- .../samples/if-block/output.json | 2 +- .../samples/implicitly-closed-li/output.json | 2 +- .../samples/javascript-comments/output.json | 2 +- .../samples/loose-invalid-block/output.json | 2 +- .../loose-invalid-expression/output.json | 2 +- .../samples/loose-unclosed-block/output.json | 2 +- .../loose-unclosed-open-tag/output.json | 2 +- .../samples/loose-unclosed-tag/output.json | 2 +- .../parser-legacy/samples/nbsp/output.json | 2 +- .../no-error-if-before-closing/output.json | 2 +- .../samples/raw-mustaches/output.json | 2 +- .../parser-legacy/samples/refs/output.json | 2 +- .../output.json | 2 +- .../samples/script-comment-only/output.json | 2 +- .../output.json | 2 +- .../parser-legacy/samples/script/output.json | 2 +- .../samples/self-closing-element/output.json | 2 +- .../samples/self-reference/output.json | 2 +- .../samples/slotted-element/output.json | 2 +- .../space-between-mustaches/output.json | 2 +- .../parser-legacy/samples/spread/output.json | 2 +- .../samples/style-inside-head/output.json | 2 +- .../samples/textarea-children/output.json | 2 +- .../samples/textarea-end-tag/output.json | 2 +- .../transition-intro-no-params/output.json | 2 +- .../samples/transition-intro/output.json | 2 +- .../samples/unusual-identifier/output.json | 2 +- .../whitespace-after-script-tag/output.json | 2 +- .../whitespace-after-style-tag/output.json | 2 +- .../whitespace-leading-trailing/output.json | 2 +- .../samples/whitespace-normal/output.json | 2 +- .../samples/attachments/output.json | 24 +- .../output.json | 24 +- .../samples/comment-before-script/output.json | 2 +- .../samples/css-nth-syntax/output.json | 24 +- .../samples/css-pseudo-classes/output.json | 2 +- .../output.json | 2 +- .../each-block-object-pattern/output.json | 68 ++-- .../samples/generic-snippets/output.json | 2 +- .../samples/if-block-else/output.json | 46 +-- .../samples/if-block-elseif/output.json | 46 +-- .../samples/if-block/output.json | 2 +- .../samples/loose-invalid-block/output.json | 2 +- .../loose-invalid-expression/output.json | 134 +++---- .../loose-unclosed-open-tag/output.json | 156 ++++---- .../samples/loose-unclosed-tag/output.json | 332 +++++++----------- .../samples/loose-valid-each-as/output.json | 24 +- .../parser-modern/samples/options/output.json | 2 +- .../semicolon-inside-quotes/output.json | 24 +- .../samples/snippets/output.json | 24 +- .../samples/template-shadowroot/output.json | 156 ++++---- .../typescript-in-event-handler/output.json | 24 +- packages/svelte/tests/parser-modern/test.ts | 20 +- 104 files changed, 552 insertions(+), 752 deletions(-) diff --git a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json index 2318720f79a0..c6af77a47b6f 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json @@ -31,4 +31,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json index f2ef97f14574..a10d4eccf0eb 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json @@ -73,4 +73,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json index d6f14ad053d4..e9a3e7e5da6f 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json @@ -38,4 +38,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json index 240f80df091a..94b60b9e5d13 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json @@ -39,4 +39,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/action/output.json b/packages/svelte/tests/parser-legacy/samples/action/output.json index 0e5d8775849b..f241c81a933a 100644 --- a/packages/svelte/tests/parser-legacy/samples/action/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action/output.json @@ -23,4 +23,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/animation/output.json b/packages/svelte/tests/parser-legacy/samples/animation/output.json index 4b4700dd98b6..bf4b43b87595 100644 --- a/packages/svelte/tests/parser-legacy/samples/animation/output.json +++ b/packages/svelte/tests/parser-legacy/samples/animation/output.json @@ -88,4 +88,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json index 2585fcfe9403..3cd54b66479b 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json @@ -38,4 +38,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json index c67811fab964..2c63b3a43d13 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json @@ -38,4 +38,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json index a137dd795b3f..2453dc9e0a07 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json @@ -52,4 +52,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json index 5462eaf71333..5793afe896fd 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json @@ -44,4 +44,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json index 6acc5ebeb133..9fd98c80ec27 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json @@ -80,4 +80,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json index 478ba2e52560..d2a3dcd93bf6 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json @@ -105,4 +105,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json index 74fa6f2aec1b..e2eb99f32774 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json @@ -30,4 +30,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json index 80bbdf0e21ed..66b780e53661 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json @@ -45,4 +45,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json index 87a01d4b09f3..2ae3acfdc7eb 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json @@ -34,4 +34,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json index a059934e4075..8cb93b75ec08 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json @@ -22,4 +22,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json index 94608a0eba0e..3e19a4727ea3 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json @@ -30,4 +30,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json index 45bb6f0e2ec8..06bdae28629c 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json @@ -47,4 +47,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json index 4ad7aaf7f78b..d7f53cb00ca2 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json @@ -23,4 +23,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json index 9693f9778275..5acf7d797eaa 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json @@ -359,4 +359,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json index 08e2032db321..2cce9fef952c 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json @@ -45,4 +45,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json index d029f9ef7108..1d9a528d6d3d 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json @@ -38,4 +38,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json index a8fb61f58c37..ab2912a2c019 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json @@ -108,4 +108,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json index 174e2b174f72..2e45184be928 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json @@ -46,4 +46,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json index 5c2fa74e425e..5572d573f89e 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json @@ -183,4 +183,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json index 5548cfc22eb5..b71365f39deb 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json @@ -252,4 +252,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json index 61065609496c..42892457059c 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json @@ -109,4 +109,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/binding/output.json b/packages/svelte/tests/parser-legacy/samples/binding/output.json index b6d24d6579d0..5256ede7bb9a 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding/output.json @@ -119,4 +119,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/comment-with-ignores/output.json b/packages/svelte/tests/parser-legacy/samples/comment-with-ignores/output.json index 74d0a5270773..2caf252de8c3 100644 --- a/packages/svelte/tests/parser-legacy/samples/comment-with-ignores/output.json +++ b/packages/svelte/tests/parser-legacy/samples/comment-with-ignores/output.json @@ -16,4 +16,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/comment/output.json b/packages/svelte/tests/parser-legacy/samples/comment/output.json index a721ddd8dc5b..6017db404cb9 100644 --- a/packages/svelte/tests/parser-legacy/samples/comment/output.json +++ b/packages/svelte/tests/parser-legacy/samples/comment/output.json @@ -13,4 +13,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/component-dynamic/output.json b/packages/svelte/tests/parser-legacy/samples/component-dynamic/output.json index 7e7267498fdc..f624a04c617b 100644 --- a/packages/svelte/tests/parser-legacy/samples/component-dynamic/output.json +++ b/packages/svelte/tests/parser-legacy/samples/component-dynamic/output.json @@ -77,4 +77,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/convert-entities-in-element/output.json b/packages/svelte/tests/parser-legacy/samples/convert-entities-in-element/output.json index 3025f2c8007e..f7a8a3c67794 100644 --- a/packages/svelte/tests/parser-legacy/samples/convert-entities-in-element/output.json +++ b/packages/svelte/tests/parser-legacy/samples/convert-entities-in-element/output.json @@ -22,4 +22,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/convert-entities/output.json b/packages/svelte/tests/parser-legacy/samples/convert-entities/output.json index c43621cc6bb8..c336a3978c30 100644 --- a/packages/svelte/tests/parser-legacy/samples/convert-entities/output.json +++ b/packages/svelte/tests/parser-legacy/samples/convert-entities/output.json @@ -13,4 +13,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/css/output.json b/packages/svelte/tests/parser-legacy/samples/css/output.json index 443d6d2d5000..b3ecd7b6712a 100644 --- a/packages/svelte/tests/parser-legacy/samples/css/output.json +++ b/packages/svelte/tests/parser-legacy/samples/css/output.json @@ -82,4 +82,4 @@ "comment": null } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json index 5f73e70b5ee7..9ba15d604484 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json @@ -171,4 +171,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json index 7c75c8bc2a5f..291cdaa73405 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json @@ -77,4 +77,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-import/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-import/output.json index 943376010ca1..ee19d5874222 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-import/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-import/output.json @@ -481,4 +481,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-destructured/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-destructured/output.json index 21b059b7ae08..637da24aea98 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-destructured/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-destructured/output.json @@ -266,4 +266,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json index f5145063e44c..a6db309edb08 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json @@ -100,4 +100,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json index ce2f921d86ac..bce7fd81a211 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json @@ -106,4 +106,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json index 637dab61b897..2f6206a6cbeb 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json @@ -126,4 +126,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/each-block/output.json b/packages/svelte/tests/parser-legacy/samples/each-block/output.json index 82390bb62874..f26f557958db 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block/output.json @@ -77,4 +77,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json index afdcbf4297cf..7773256d44ea 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json @@ -61,4 +61,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json index b6740a61357c..9477886bb289 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json @@ -61,4 +61,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-mustache/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-mustache/output.json index 9bb92244ce68..ce0dc25e85c6 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-mustache/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-mustache/output.json @@ -50,4 +50,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-text/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-text/output.json index d8bb9e9c1185..fde57c470a64 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-text/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-text/output.json @@ -22,4 +22,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/elements/output.json b/packages/svelte/tests/parser-legacy/samples/elements/output.json index 97513445d695..6b51383d9339 100644 --- a/packages/svelte/tests/parser-legacy/samples/elements/output.json +++ b/packages/svelte/tests/parser-legacy/samples/elements/output.json @@ -22,4 +22,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json index 218b349628a7..11ee562297ed 100644 --- a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json +++ b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json @@ -161,4 +161,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json b/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json index 72672cafbc95..37fb499e7b0f 100644 --- a/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json @@ -241,4 +241,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/if-block-else/output.json b/packages/svelte/tests/parser-legacy/samples/if-block-else/output.json index 34efb9fd7b22..4ba9370d8870 100644 --- a/packages/svelte/tests/parser-legacy/samples/if-block-else/output.json +++ b/packages/svelte/tests/parser-legacy/samples/if-block-else/output.json @@ -68,4 +68,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/if-block-elseif/output.json b/packages/svelte/tests/parser-legacy/samples/if-block-elseif/output.json index d246cd117900..f2af3d5a4b92 100644 --- a/packages/svelte/tests/parser-legacy/samples/if-block-elseif/output.json +++ b/packages/svelte/tests/parser-legacy/samples/if-block-elseif/output.json @@ -221,4 +221,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/if-block/output.json b/packages/svelte/tests/parser-legacy/samples/if-block/output.json index 1c60df0d31c8..61ecf6e3b2b4 100644 --- a/packages/svelte/tests/parser-legacy/samples/if-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/if-block/output.json @@ -36,4 +36,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/implicitly-closed-li/output.json b/packages/svelte/tests/parser-legacy/samples/implicitly-closed-li/output.json index be5fba538e42..a56701894e63 100644 --- a/packages/svelte/tests/parser-legacy/samples/implicitly-closed-li/output.json +++ b/packages/svelte/tests/parser-legacy/samples/implicitly-closed-li/output.json @@ -70,4 +70,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json index a5fe5749da34..42229b741fbd 100644 --- a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json +++ b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json @@ -869,4 +869,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json index c8f248ee6c2c..480fcf2edcf7 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json @@ -104,4 +104,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json index b04a37e5e9d6..0564d6d29517 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json @@ -505,4 +505,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json index ee4efc2a9c7f..e6e909f0d5e1 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json @@ -273,4 +273,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json index 1002df6b67c0..1792d6b8e638 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json @@ -346,4 +346,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json index 4b6d31902f8f..2205a00e203a 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json @@ -360,4 +360,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/nbsp/output.json b/packages/svelte/tests/parser-legacy/samples/nbsp/output.json index a120b08f327a..7d2158955a64 100644 --- a/packages/svelte/tests/parser-legacy/samples/nbsp/output.json +++ b/packages/svelte/tests/parser-legacy/samples/nbsp/output.json @@ -22,4 +22,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json index 369cd4acc4bf..c60efd4fbaf0 100644 --- a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json +++ b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json @@ -289,4 +289,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/raw-mustaches/output.json b/packages/svelte/tests/parser-legacy/samples/raw-mustaches/output.json index b8e1da749937..7db0bb7ec15a 100644 --- a/packages/svelte/tests/parser-legacy/samples/raw-mustaches/output.json +++ b/packages/svelte/tests/parser-legacy/samples/raw-mustaches/output.json @@ -78,4 +78,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/refs/output.json b/packages/svelte/tests/parser-legacy/samples/refs/output.json index 108fa78697c4..7829a2787fab 100644 --- a/packages/svelte/tests/parser-legacy/samples/refs/output.json +++ b/packages/svelte/tests/parser-legacy/samples/refs/output.json @@ -119,4 +119,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/script-attribute-with-curly-braces/output.json b/packages/svelte/tests/parser-legacy/samples/script-attribute-with-curly-braces/output.json index e9298ec50c24..e0b50e3b92db 100644 --- a/packages/svelte/tests/parser-legacy/samples/script-attribute-with-curly-braces/output.json +++ b/packages/svelte/tests/parser-legacy/samples/script-attribute-with-curly-braces/output.json @@ -147,4 +147,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/script-comment-only/output.json b/packages/svelte/tests/parser-legacy/samples/script-comment-only/output.json index 502d5df57600..b04a823e8db6 100644 --- a/packages/svelte/tests/parser-legacy/samples/script-comment-only/output.json +++ b/packages/svelte/tests/parser-legacy/samples/script-comment-only/output.json @@ -52,4 +52,4 @@ ] } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/script-context-module-unquoted/output.json b/packages/svelte/tests/parser-legacy/samples/script-context-module-unquoted/output.json index 5a380a32404a..64250cb302e4 100644 --- a/packages/svelte/tests/parser-legacy/samples/script-context-module-unquoted/output.json +++ b/packages/svelte/tests/parser-legacy/samples/script-context-module-unquoted/output.json @@ -176,4 +176,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/script/output.json b/packages/svelte/tests/parser-legacy/samples/script/output.json index e30414a2a839..d3d4abd6b24f 100644 --- a/packages/svelte/tests/parser-legacy/samples/script/output.json +++ b/packages/svelte/tests/parser-legacy/samples/script/output.json @@ -147,4 +147,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/self-closing-element/output.json b/packages/svelte/tests/parser-legacy/samples/self-closing-element/output.json index fe59cac4b760..f0ba3a5c0d7a 100644 --- a/packages/svelte/tests/parser-legacy/samples/self-closing-element/output.json +++ b/packages/svelte/tests/parser-legacy/samples/self-closing-element/output.json @@ -14,4 +14,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/self-reference/output.json b/packages/svelte/tests/parser-legacy/samples/self-reference/output.json index 44547698fd3c..34310fcce46c 100644 --- a/packages/svelte/tests/parser-legacy/samples/self-reference/output.json +++ b/packages/svelte/tests/parser-legacy/samples/self-reference/output.json @@ -133,4 +133,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json b/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json index c6717f3074bd..90ded681031c 100644 --- a/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json +++ b/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json @@ -39,4 +39,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/space-between-mustaches/output.json b/packages/svelte/tests/parser-legacy/samples/space-between-mustaches/output.json index 7553651864cc..bb6de0bea951 100644 --- a/packages/svelte/tests/parser-legacy/samples/space-between-mustaches/output.json +++ b/packages/svelte/tests/parser-legacy/samples/space-between-mustaches/output.json @@ -106,4 +106,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/spread/output.json b/packages/svelte/tests/parser-legacy/samples/spread/output.json index b1d80bd5d418..3b79aa967028 100644 --- a/packages/svelte/tests/parser-legacy/samples/spread/output.json +++ b/packages/svelte/tests/parser-legacy/samples/spread/output.json @@ -36,4 +36,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/style-inside-head/output.json b/packages/svelte/tests/parser-legacy/samples/style-inside-head/output.json index 25588b950b83..733f9e76fff4 100644 --- a/packages/svelte/tests/parser-legacy/samples/style-inside-head/output.json +++ b/packages/svelte/tests/parser-legacy/samples/style-inside-head/output.json @@ -30,4 +30,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/textarea-children/output.json b/packages/svelte/tests/parser-legacy/samples/textarea-children/output.json index 62a295c1352b..60477807b79c 100644 --- a/packages/svelte/tests/parser-legacy/samples/textarea-children/output.json +++ b/packages/svelte/tests/parser-legacy/samples/textarea-children/output.json @@ -50,4 +50,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/textarea-end-tag/output.json b/packages/svelte/tests/parser-legacy/samples/textarea-end-tag/output.json index 145de96560cf..ed3c85b09a07 100644 --- a/packages/svelte/tests/parser-legacy/samples/textarea-end-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/textarea-end-tag/output.json @@ -50,4 +50,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json index 85f45a93f51b..18860d615b90 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json @@ -33,4 +33,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json index be201143b45a..973cfb7d3374 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json @@ -101,4 +101,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json index b1595a6839a4..9081b7cb926d 100644 --- a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json @@ -77,4 +77,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/whitespace-after-script-tag/output.json b/packages/svelte/tests/parser-legacy/samples/whitespace-after-script-tag/output.json index dee3ba5f2999..69b23824423d 100644 --- a/packages/svelte/tests/parser-legacy/samples/whitespace-after-script-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/whitespace-after-script-tag/output.json @@ -147,4 +147,4 @@ "sourceType": "module" } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/whitespace-after-style-tag/output.json b/packages/svelte/tests/parser-legacy/samples/whitespace-after-style-tag/output.json index acd9798425f2..2cadbc672f9d 100644 --- a/packages/svelte/tests/parser-legacy/samples/whitespace-after-style-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/whitespace-after-style-tag/output.json @@ -82,4 +82,4 @@ "comment": null } } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/whitespace-leading-trailing/output.json b/packages/svelte/tests/parser-legacy/samples/whitespace-leading-trailing/output.json index 67ffc034368e..baffebfed7f6 100644 --- a/packages/svelte/tests/parser-legacy/samples/whitespace-leading-trailing/output.json +++ b/packages/svelte/tests/parser-legacy/samples/whitespace-leading-trailing/output.json @@ -29,4 +29,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-legacy/samples/whitespace-normal/output.json b/packages/svelte/tests/parser-legacy/samples/whitespace-normal/output.json index 27f8e537a157..4fb88b818d83 100644 --- a/packages/svelte/tests/parser-legacy/samples/whitespace-normal/output.json +++ b/packages/svelte/tests/parser-legacy/samples/whitespace-normal/output.json @@ -75,4 +75,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/attachments/output.json b/packages/svelte/tests/parser-modern/samples/attachments/output.json index 71e55bcfd5dc..86429b84f544 100644 --- a/packages/svelte/tests/parser-modern/samples/attachments/output.json +++ b/packages/svelte/tests/parser-modern/samples/attachments/output.json @@ -11,21 +11,17 @@ "type": "RegularElement", "start": 0, "end": 57, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 } }, - "name": "div", "attributes": [ { "type": "AttachTag", @@ -152,4 +148,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json index 4388064d6baf..0be33eb214fe 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json @@ -18,21 +18,17 @@ "type": "RegularElement", "start": 37, "end": 117, - "id": { - "type": "Identifier", - "name": "input", - "loc": { - "start": { - "line": 5, - "column": 1 - }, - "end": { - "line": 5, - "column": 6 - } + "name": "input", + "name_loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 6 } }, - "name": "input", "attributes": [ { "start": 44, @@ -337,4 +333,4 @@ }, "attributes": [] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json index 39bfd4323770..1aca0ce03607 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json @@ -150,4 +150,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json index 07a2967593ee..781dfaf4de6e 100644 --- a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json +++ b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json @@ -1096,21 +1096,17 @@ "type": "RegularElement", "start": 808, "end": 820, - "id": { - "type": "Identifier", - "name": "h1", - "loc": { - "start": { - "line": 46, - "column": 1 - }, - "end": { - "line": 46, - "column": 3 - } + "name": "h1", + "name_loc": { + "start": { + "line": 46, + "column": 1 + }, + "end": { + "line": 46, + "column": 3 } }, - "name": "h1", "attributes": [], "fragment": { "type": "Fragment", @@ -1128,4 +1124,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json b/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json index a2e0195faba5..e410cf2a801b 100644 --- a/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json +++ b/packages/svelte/tests/parser-modern/samples/css-pseudo-classes/output.json @@ -406,4 +406,4 @@ "nodes": [] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json index 37fdf92296ff..7fd5deb3eaed 100644 --- a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json +++ b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern-special-characters/output.json @@ -823,4 +823,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json index 2a52f0ce9571..096fab2f640d 100644 --- a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json +++ b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json @@ -41,21 +41,17 @@ "type": "RegularElement", "start": 41, "end": 86, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -363,21 +359,17 @@ "type": "RegularElement", "start": 155, "end": 200, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 6, - "column": 2 - }, - "end": { - "line": 6, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -776,21 +768,17 @@ "type": "RegularElement", "start": 291, "end": 336, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 10, - "column": 2 - }, - "end": { - "line": 10, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 10, + "column": 2 + }, + "end": { + "line": 10, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -1220,4 +1208,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json index 44d98b7a9160..b66ee7288f2e 100644 --- a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json @@ -296,4 +296,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/if-block-else/output.json b/packages/svelte/tests/parser-modern/samples/if-block-else/output.json index d2e8b1ae9827..e8e6cbaea6d2 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block-else/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block-else/output.json @@ -42,21 +42,17 @@ "type": "RegularElement", "start": 11, "end": 21, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -94,21 +90,17 @@ "type": "RegularElement", "start": 31, "end": 45, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 4, - "column": 2 - }, - "end": { - "line": 4, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -136,4 +128,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json b/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json index 5aec4bdd632d..2c8186a300f7 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json @@ -75,21 +75,17 @@ "type": "RegularElement", "start": 14, "end": 41, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -184,21 +180,17 @@ "type": "RegularElement", "start": 60, "end": 83, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 4, - "column": 2 - }, - "end": { - "line": 4, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -230,4 +222,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/if-block/output.json b/packages/svelte/tests/parser-modern/samples/if-block/output.json index 47ad4145a62e..f363ed8274ad 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block/output.json @@ -45,4 +45,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json index 036b581d0c5d..46aad16b2169 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json @@ -168,4 +168,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json index fcfe19e9ac5e..9763f82bf1a9 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json @@ -11,21 +11,17 @@ "type": "RegularElement", "start": 0, "end": 14, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 } }, - "name": "div", "attributes": [ { "type": "Attribute", @@ -61,21 +57,17 @@ "type": "RegularElement", "start": 15, "end": 33, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 2, - "column": 1 - }, - "end": { - "line": 2, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 2, + "column": 1 + }, + "end": { + "line": 2, + "column": 4 } }, - "name": "div", "attributes": [ { "type": "Attribute", @@ -111,21 +103,17 @@ "type": "RegularElement", "start": 35, "end": 55, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 4, - "column": 1 - }, - "end": { - "line": 4, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 4, + "column": 1 + }, + "end": { + "line": 4, + "column": 4 } }, - "name": "div", "attributes": [ { "type": "Attribute", @@ -161,21 +149,17 @@ "type": "RegularElement", "start": 56, "end": 80, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 5, - "column": 1 - }, - "end": { - "line": 5, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 4 } }, - "name": "div", "attributes": [ { "type": "Attribute", @@ -211,21 +195,17 @@ "type": "Component", "start": 81, "end": 113, - "id": { - "type": "Identifier", - "name": "Component", - "loc": { - "start": { - "line": 6, - "column": 1 - }, - "end": { - "line": 6, - "column": 10 - } + "name": "Component", + "name_loc": { + "start": { + "line": 6, + "column": 1 + }, + "end": { + "line": 6, + "column": 10 } }, - "name": "Component", "attributes": [ { "type": "Attribute", @@ -261,21 +241,17 @@ "type": "RegularElement", "start": 115, "end": 140, - "id": { - "type": "Identifier", - "name": "input", - "loc": { - "start": { - "line": 8, - "column": 1 - }, - "end": { - "line": 8, - "column": 6 - } + "name": "input", + "name_loc": { + "start": { + "line": 8, + "column": 1 + }, + "end": { + "line": 8, + "column": 6 } }, - "name": "input", "attributes": [ { "start": 122, @@ -567,4 +543,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json index c8c2e67f1ac6..32d51efef2e4 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json @@ -11,21 +11,17 @@ "type": "RegularElement", "start": 0, "end": 29, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -41,21 +37,17 @@ "type": "Component", "start": 7, "end": 23, - "id": { - "type": "Identifier", - "name": "Comp", - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 6 - } + "name": "Comp", + "name_loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 } }, - "name": "Comp", "attributes": [ { "type": "Attribute", @@ -104,21 +96,17 @@ "type": "RegularElement", "start": 31, "end": 60, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 5, - "column": 1 - }, - "end": { - "line": 5, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -134,21 +122,17 @@ "type": "RegularElement", "start": 38, "end": 54, - "id": { - "type": "Identifier", - "name": "span", - "loc": { - "start": { - "line": 6, - "column": 2 - }, - "end": { - "line": 6, - "column": 6 - } + "name": "span", + "name_loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 6 } }, - "name": "span", "attributes": [ { "type": "Attribute", @@ -228,21 +212,17 @@ "type": "Component", "start": 73, "end": 89, - "id": { - "type": "Identifier", - "name": "Comp", - "loc": { - "start": { - "line": 10, - "column": 2 - }, - "end": { - "line": 10, - "column": 6 - } + "name": "Comp", + "name_loc": { + "start": { + "line": 10, + "column": 2 + }, + "end": { + "line": 10, + "column": 6 } }, - "name": "Comp", "attributes": [ { "type": "Attribute", @@ -323,21 +303,17 @@ "type": "Component", "start": 107, "end": 124, - "id": { - "type": "Identifier", - "name": "Comp", - "loc": { - "start": { - "line": 14, - "column": 2 - }, - "end": { - "line": 14, - "column": 6 - } + "name": "Comp", + "name_loc": { + "start": { + "line": 14, + "column": 2 + }, + "end": { + "line": 14, + "column": 6 } }, - "name": "Comp", "attributes": [ { "type": "Attribute", @@ -457,21 +433,17 @@ "type": "RegularElement", "start": 156, "end": 170, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 20, - "column": 1 - }, - "end": { - "line": 20, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 20, + "column": 1 + }, + "end": { + "line": 20, + "column": 4 } }, - "name": "div", "attributes": [ { "type": "Attribute", @@ -509,4 +481,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json index 11c098e53a13..f54af737735a 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json @@ -11,21 +11,17 @@ "type": "RegularElement", "start": 0, "end": 20, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -41,21 +37,17 @@ "type": "Component", "start": 7, "end": 14, - "id": { - "type": "Identifier", - "name": "Comp", - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 6 - } + "name": "Comp", + "name_loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 } }, - "name": "Comp", "attributes": [], "fragment": { "type": "Fragment", @@ -84,21 +76,17 @@ "type": "RegularElement", "start": 22, "end": 51, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 5, - "column": 1 - }, - "end": { - "line": 5, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -114,21 +102,17 @@ "type": "Component", "start": 29, "end": 45, - "id": { - "type": "Identifier", - "name": "Comp", - "loc": { - "start": { - "line": 6, - "column": 2 - }, - "end": { - "line": 6, - "column": 6 - } + "name": "Comp", + "name_loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 6 } }, - "name": "Comp", "attributes": [ { "type": "Attribute", @@ -177,21 +161,17 @@ "type": "RegularElement", "start": 53, "end": 72, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 9, - "column": 1 - }, - "end": { - "line": 9, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 9, + "column": 1 + }, + "end": { + "line": 9, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -207,21 +187,17 @@ "type": "RegularElement", "start": 60, "end": 66, - "id": { - "type": "Identifier", - "name": "span", - "loc": { - "start": { - "line": 10, - "column": 2 - }, - "end": { - "line": 10, - "column": 6 - } + "name": "span", + "name_loc": { + "start": { + "line": 10, + "column": 2 + }, + "end": { + "line": 10, + "column": 6 } }, - "name": "span", "attributes": [], "fragment": { "type": "Fragment", @@ -242,21 +218,17 @@ "type": "RegularElement", "start": 74, "end": 94, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 13, - "column": 1 - }, - "end": { - "line": 13, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 13, + "column": 1 + }, + "end": { + "line": 13, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -272,21 +244,17 @@ "type": "Component", "start": 81, "end": 88, - "id": { - "type": "Identifier", - "name": "Comp.", - "loc": { - "start": { - "line": 14, - "column": 2 - }, - "end": { - "line": 14, - "column": 7 - } + "name": "Comp.", + "name_loc": { + "start": { + "line": 14, + "column": 2 + }, + "end": { + "line": 14, + "column": 7 } }, - "name": "Comp.", "attributes": [], "fragment": { "type": "Fragment", @@ -307,21 +275,17 @@ "type": "RegularElement", "start": 96, "end": 116, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 17, - "column": 1 - }, - "end": { - "line": 17, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 17, + "column": 1 + }, + "end": { + "line": 17, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -337,21 +301,17 @@ "type": "Component", "start": 103, "end": 110, - "id": { - "type": "Identifier", - "name": "comp.", - "loc": { - "start": { - "line": 18, - "column": 2 - }, - "end": { - "line": 18, - "column": 7 - } + "name": "comp.", + "name_loc": { + "start": { + "line": 18, + "column": 2 + }, + "end": { + "line": 18, + "column": 7 } }, - "name": "comp.", "attributes": [], "fragment": { "type": "Fragment", @@ -403,21 +363,17 @@ "type": "RegularElement", "start": 129, "end": 135, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 22, - "column": 2 - }, - "end": { - "line": 22, - "column": 5 - } + "name": "div", + "name_loc": { + "start": { + "line": 22, + "column": 2 + }, + "end": { + "line": 22, + "column": 5 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -478,21 +434,17 @@ "type": "Component", "start": 153, "end": 169, - "id": { - "type": "Identifier", - "name": "Comp", - "loc": { - "start": { - "line": 26, - "column": 2 - }, - "end": { - "line": 26, - "column": 6 - } + "name": "Comp", + "name_loc": { + "start": { + "line": 26, + "column": 2 + }, + "end": { + "line": 26, + "column": 6 } }, - "name": "Comp", "attributes": [ { "type": "Attribute", @@ -542,21 +494,17 @@ "type": "RegularElement", "start": 176, "end": 204, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 29, - "column": 1 - }, - "end": { - "line": 29, - "column": 4 - } + "name": "div", + "name_loc": { + "start": { + "line": 29, + "column": 1 + }, + "end": { + "line": 29, + "column": 4 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -572,21 +520,17 @@ "type": "RegularElement", "start": 182, "end": 191, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 30, - "column": 1 - }, - "end": { - "line": 30, - "column": 2 - } + "name": "p", + "name_loc": { + "start": { + "line": 30, + "column": 1 + }, + "end": { + "line": 30, + "column": 2 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -612,21 +556,17 @@ "type": "RegularElement", "start": 193, "end": 204, - "id": { - "type": "Identifier", - "name": "open-ended", - "loc": { - "start": { - "line": 32, - "column": 1 - }, - "end": { - "line": 32, - "column": 11 - } + "name": "open-ended", + "name_loc": { + "start": { + "line": 32, + "column": 1 + }, + "end": { + "line": 32, + "column": 11 } }, - "name": "open-ended", "attributes": [], "fragment": { "type": "Fragment", @@ -639,4 +579,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json index e862c0c72ac7..11d25eeb1498 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json @@ -48,21 +48,17 @@ "type": "RegularElement", "start": 86, "end": 111, - "id": { - "type": "Identifier", - "name": "div", - "loc": { - "start": { - "line": 6, - "column": 2 - }, - "end": { - "line": 6, - "column": 5 - } + "name": "div", + "name_loc": { + "start": { + "line": 6, + "column": 2 + }, + "end": { + "line": 6, + "column": 5 } }, - "name": "div", "attributes": [], "fragment": { "type": "Fragment", @@ -319,4 +315,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/options/output.json b/packages/svelte/tests/parser-modern/samples/options/output.json index 97e535156438..6feee2d4f506 100644 --- a/packages/svelte/tests/parser-modern/samples/options/output.json +++ b/packages/svelte/tests/parser-modern/samples/options/output.json @@ -178,4 +178,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json index 9ad463577adf..c25f70b0cb06 100644 --- a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json +++ b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json @@ -86,21 +86,17 @@ "type": "RegularElement", "start": 0, "end": 35, - "id": { - "type": "Identifier", - "name": "h1", - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 3 - } + "name": "h1", + "name_loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 3 } }, - "name": "h1", "attributes": [], "fragment": { "type": "Fragment", @@ -125,4 +121,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json index e03f3d411d9f..18455b9687e2 100644 --- a/packages/svelte/tests/parser-modern/samples/snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json @@ -86,21 +86,17 @@ "type": "RegularElement", "start": 58, "end": 70, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 4, - "column": 2 - }, - "end": { - "line": 4, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 4, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -244,4 +240,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json index d6ec7baa0aec..cf1d6f4ed14a 100644 --- a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json +++ b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json @@ -11,21 +11,17 @@ "type": "RegularElement", "start": 0, "end": 66, - "id": { - "type": "Identifier", - "name": "template", - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 9 - } + "name": "template", + "name_loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 9 } }, - "name": "template", "attributes": [ { "type": "Attribute", @@ -57,21 +53,17 @@ "type": "RegularElement", "start": 34, "end": 54, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -80,21 +72,17 @@ "type": "RegularElement", "start": 37, "end": 50, - "id": { - "type": "Identifier", - "name": "slot", - "loc": { - "start": { - "line": 2, - "column": 5 - }, - "end": { - "line": 2, - "column": 9 - } + "name": "slot", + "name_loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 9 } }, - "name": "slot", "attributes": [], "fragment": { "type": "Fragment", @@ -125,21 +113,17 @@ "type": "RegularElement", "start": 67, "end": 111, - "id": { - "type": "Identifier", - "name": "template", - "loc": { - "start": { - "line": 4, - "column": 1 - }, - "end": { - "line": 4, - "column": 9 - } + "name": "template", + "name_loc": { + "start": { + "line": 4, + "column": 1 + }, + "end": { + "line": 4, + "column": 9 } }, - "name": "template", "attributes": [], "fragment": { "type": "Fragment", @@ -155,21 +139,17 @@ "type": "RegularElement", "start": 79, "end": 99, - "id": { - "type": "Identifier", - "name": "p", - "loc": { - "start": { - "line": 5, - "column": 2 - }, - "end": { - "line": 5, - "column": 3 - } + "name": "p", + "name_loc": { + "start": { + "line": 5, + "column": 2 + }, + "end": { + "line": 5, + "column": 3 } }, - "name": "p", "attributes": [], "fragment": { "type": "Fragment", @@ -178,21 +158,17 @@ "type": "SlotElement", "start": 82, "end": 95, - "id": { - "type": "Identifier", - "name": "slot", - "loc": { - "start": { - "line": 5, - "column": 5 - }, - "end": { - "line": 5, - "column": 9 - } + "name": "slot", + "name_loc": { + "start": { + "line": 5, + "column": 5 + }, + "end": { + "line": 5, + "column": 9 } }, - "name": "slot", "attributes": [], "fragment": { "type": "Fragment", @@ -223,21 +199,17 @@ "type": "SlotElement", "start": 112, "end": 125, - "id": { - "type": "Identifier", - "name": "slot", - "loc": { - "start": { - "line": 7, - "column": 1 - }, - "end": { - "line": 7, - "column": 5 - } + "name": "slot", + "name_loc": { + "start": { + "line": 7, + "column": 1 + }, + "end": { + "line": 7, + "column": 5 } }, - "name": "slot", "attributes": [], "fragment": { "type": "Fragment", @@ -247,4 +219,4 @@ ] }, "options": null -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json index 20d00c96d2a4..59b94e47eedb 100644 --- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json +++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json @@ -18,21 +18,17 @@ "type": "RegularElement", "start": 54, "end": 173, - "id": { - "type": "Identifier", - "name": "button", - "loc": { - "start": { - "line": 5, - "column": 1 - }, - "end": { - "line": 5, - "column": 7 - } + "name": "button", + "name_loc": { + "start": { + "line": 5, + "column": 1 + }, + "end": { + "line": 5, + "column": 7 } }, - "name": "button", "attributes": [ { "start": 63, @@ -511,4 +507,4 @@ } ] } -} \ No newline at end of file +} diff --git a/packages/svelte/tests/parser-modern/test.ts b/packages/svelte/tests/parser-modern/test.ts index 4bcc7a97c4b6..9c47d36074e2 100644 --- a/packages/svelte/tests/parser-modern/test.ts +++ b/packages/svelte/tests/parser-modern/test.ts @@ -132,18 +132,14 @@ it('Strips BOM from the input', () => { nodes: [], type: 'Fragment' }, - id: { - type: 'Identifier', - name: 'div', - loc: { - end: { - column: 4, - line: 1 - }, - start: { - column: 1, - line: 1 - } + name_loc: { + end: { + column: 4, + line: 1 + }, + start: { + column: 1, + line: 1 } }, name: 'div', From e78ea4c3e13854c741b8288399b30b6f3ccb6766 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 15:18:11 -0500 Subject: [PATCH 09/29] WIP --- packages/svelte/tests/parser-modern/test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/svelte/tests/parser-modern/test.ts b/packages/svelte/tests/parser-modern/test.ts index 9c47d36074e2..f0088532002e 100644 --- a/packages/svelte/tests/parser-modern/test.ts +++ b/packages/svelte/tests/parser-modern/test.ts @@ -66,6 +66,8 @@ function clean(ast: AST.SvelteNode) { // @ts-ignore delete node.loc; // @ts-ignore + delete node.name_loc; + // @ts-ignore delete node.leadingComments; // @ts-ignore delete node.trailingComments; From 2b397a6b1d2f36032482270b18f917d8210c51da Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 15:24:47 -0500 Subject: [PATCH 10/29] WIP --- .../phases/3-transform/client/visitors/Fragment.js | 2 +- .../phases/3-transform/client/visitors/shared/fragment.js | 7 ++++++- packages/svelte/types/index.d.ts | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Fragment.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Fragment.js index ff2436779b92..18017ea557a4 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/Fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/Fragment.js @@ -81,7 +81,7 @@ export function Fragment(node, context) { if (is_single_element) { const element = /** @type {AST.RegularElement} */ (trimmed[0]); - const id = b.id(context.state.scope.generate(element.name)); + const id = b.id(context.state.scope.generate(element.name), element.name_loc); context.visit(element, { ...state, diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js index 32cc3d1cbfdf..ff931842d89c 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/fragment.js @@ -110,7 +110,12 @@ export function process_children(nodes, initial, is_element, context) { ) { node.metadata.is_controlled = true; } else { - const id = flush_node(false, node.type === 'RegularElement' ? node.name : 'node'); + const id = flush_node( + false, + node.type === 'RegularElement' ? node.name : 'node', + node.type === 'RegularElement' ? node.name_loc : null + ); + child_state = { ...context.state, node: id }; } diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 56de9f6ff6a3..81e64081fe43 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -842,7 +842,7 @@ declare module 'svelte/attachments' { declare module 'svelte/compiler' { import type { SourceMap } from 'magic-string'; - import type { ArrayExpression, ArrowFunctionExpression, VariableDeclaration, VariableDeclarator, Expression, Identifier, MemberExpression, Node, ObjectExpression, Pattern, Program, ChainExpression, SimpleCallExpression, SequenceExpression } from 'estree'; + import type { ArrayExpression, ArrowFunctionExpression, VariableDeclaration, VariableDeclarator, Expression, Identifier, MemberExpression, Node, ObjectExpression, Pattern, Program, ChainExpression, SimpleCallExpression, SequenceExpression, SourceLocation } from 'estree'; import type { Location } from 'locate-character'; import type { default as ts } from 'esrap/languages/ts'; /** @@ -1392,8 +1392,8 @@ declare module 'svelte/compiler' { } export interface BaseElement extends BaseNode { - id: Identifier; name: string; + name_loc: SourceLocation; attributes: Array; fragment: Fragment; } From a52185dff55d87fe00e29f077a18ca8092c43970 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Nov 2025 17:08:37 -0500 Subject: [PATCH 11/29] WIP --- .../compiler/phases/1-parse/state/element.js | 26 ++++++- .../src/compiler/phases/2-analyze/index.js | 4 +- .../2-analyze/visitors/RegularElement.js | 1 + .../client/visitors/RegularElement.js | 1 + .../client/visitors/shared/events.js | 8 ++- .../server/visitors/shared/element.js | 4 +- packages/svelte/src/compiler/phases/nodes.js | 6 +- .../svelte/src/compiler/types/template.d.ts | 1 + .../samples/action-duplicate/output.json | 20 ++++++ .../samples/action-with-call/output.json | 10 +++ .../action-with-identifier/output.json | 10 +++ .../samples/action-with-literal/output.json | 10 +++ .../parser-legacy/samples/action/output.json | 10 +++ .../samples/animation/output.json | 10 +++ .../attribute-class-directive/output.json | 10 +++ .../attribute-containing-solidus/output.json | 10 +++ .../attribute-curly-bracket/output.json | 10 +++ .../attribute-dynamic-boolean/output.json | 10 +++ .../samples/attribute-dynamic/output.json | 10 +++ .../samples/attribute-empty/output.json | 40 +++++++++++ .../samples/attribute-escaped/output.json | 10 +++ .../samples/attribute-multiple/output.json | 20 ++++++ .../samples/attribute-shorthand/output.json | 1 + .../attribute-static-boolean/output.json | 10 +++ .../samples/attribute-static/output.json | 10 +++ .../output.json | 10 +++ .../output.json | 10 +++ .../output.json | 70 +++++++++++++++++++ .../attribute-style-directive/output.json | 10 +++ .../samples/attribute-style/output.json | 10 +++ .../samples/attribute-unquoted/output.json | 30 ++++++++ .../attribute-with-whitespace/output.json | 10 +++ .../samples/binding-shorthand/output.json | 10 +++ .../parser-legacy/samples/binding/output.json | 10 +++ .../dynamic-element-string/output.json | 10 +++ .../dynamic-element-variable/output.json | 10 +++ .../output.json | 20 ++++++ .../element-with-attribute/output.json | 20 ++++++ .../samples/elements/output.json | 10 +++ .../samples/event-handler/output.json | 10 +++ .../samples/javascript-comments/output.json | 10 +++ .../loose-invalid-expression/output.json | 51 ++++++++++++++ .../loose-unclosed-open-tag/output.json | 50 +++++++++++++ .../samples/loose-unclosed-tag/output.json | 20 ++++++ .../parser-legacy/samples/refs/output.json | 10 +++ .../samples/self-reference/output.json | 10 +++ .../samples/slotted-element/output.json | 10 +++ .../transition-intro-no-params/output.json | 10 +++ .../samples/transition-intro/output.json | 10 +++ .../output.json | 10 +++ .../samples/comment-before-script/output.json | 1 + .../samples/generic-snippets/output.json | 1 + .../loose-invalid-expression/output.json | 51 ++++++++++++++ .../loose-unclosed-open-tag/output.json | 50 +++++++++++++ .../samples/loose-unclosed-tag/output.json | 20 ++++++ .../samples/loose-valid-each-as/output.json | 1 + .../parser-modern/samples/options/output.json | 24 +++++++ .../samples/snippets/output.json | 1 + .../samples/template-shadowroot/output.json | 10 +++ .../typescript-in-event-handler/output.json | 11 +++ packages/svelte/types/index.d.ts | 1 + 61 files changed, 864 insertions(+), 10 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 3ee98e04a7a6..d8b4f10f3910 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -508,7 +508,7 @@ function read_static_attribute(parser) { e.expected_token(parser.index, '='); } - return create_attribute(name, start, parser.index, value); + return create_attribute(name, null, start, parser.index, value); } /** @@ -518,6 +518,8 @@ function read_static_attribute(parser) { function read_attribute(parser) { const start = parser.index; + const start_location = /** @type {Location} */ (locator(parser.index)); + if (parser.eat('{')) { parser.allow_whitespace(); @@ -599,14 +601,30 @@ function read_attribute(parser) { } }; - return create_attribute(name, start, parser.index, expression); + return create_attribute(name, null, start, parser.index, expression); } } + /** @type {SourceLocation} */ + const name_loc = { + start: { + line: start_location.line, + column: start_location.column + }, + end: { + line: -1, + column: -1 + } + }; + const name = parser.read_until(regex_token_ending_character); if (!name) return null; let end = parser.index; + const end_location = /** @type {Location} */ (locator(end)); + + name_loc.end.line = end_location.line; + name_loc.end.column = end_location.column; parser.allow_whitespace(); @@ -652,6 +670,7 @@ function read_attribute(parser) { end, type, name: directive_name, + name_loc, modifiers: /** @type {Array<'important'>} */ (modifiers), value, metadata: { @@ -682,6 +701,7 @@ function read_attribute(parser) { end, type, name: directive_name, + name_loc, expression, metadata: { expression: new ExpressionMetadata() @@ -713,7 +733,7 @@ function read_attribute(parser) { return directive; } - return create_attribute(name, start, end, value); + return create_attribute(name, name_loc, start, end, value); } /** diff --git a/packages/svelte/src/compiler/phases/2-analyze/index.js b/packages/svelte/src/compiler/phases/2-analyze/index.js index fb026fa78fd2..e44cf23ff5d2 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/index.js +++ b/packages/svelte/src/compiler/phases/2-analyze/index.js @@ -900,7 +900,7 @@ export function analyze_component(root, source, options) { // We need an empty class to generate the set_class() or class="" correctly if (!has_spread && !has_class && (node.metadata.scoped || has_class_directive)) { node.attributes.push( - create_attribute('class', -1, -1, [ + create_attribute('class', null, -1, -1, [ { type: 'Text', data: '', @@ -915,7 +915,7 @@ export function analyze_component(root, source, options) { // We need an empty style to generate the set_style() correctly if (!has_spread && !has_style && has_style_directive) { node.attributes.push( - create_attribute('style', -1, -1, [ + create_attribute('style', null, -1, -1, [ { type: 'Text', data: '', diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index 4f41621db35b..55468f1bbc98 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -48,6 +48,7 @@ export function RegularElement(node, context) { node.attributes.push( create_attribute( 'value', + null, /** @type {AST.Text} */ (node.fragment.nodes.at(0)).start, /** @type {AST.Text} */ (node.fragment.nodes.at(-1)).end, // @ts-ignore diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js index 971f93e1d8f8..50cef67171d7 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js @@ -407,6 +407,7 @@ export function RegularElement(node, context) { const synthetic_node = node.metadata.synthetic_value_node; const synthetic_attribute = create_attribute( 'value', + null, synthetic_node.start, synthetic_node.end, [synthetic_node] diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js index 3ab1506eb39e..36ef721c35eb 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js @@ -32,7 +32,13 @@ export function visit_event_attribute(node, context) { } context.state.init.push( - b.stmt(b.assignment('=', b.member(context.state.node, '__' + event_name), handler)) + b.stmt( + b.assignment( + '=', + b.member(context.state.node, b.id('__' + event_name, node.name_loc)), + handler + ) + ) ); } else { const statement = b.stmt( diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js index 31ffe1913992..979efef6b9c4 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/shared/element.js @@ -142,7 +142,7 @@ export function build_element_attributes(node, context, transform) { ); attributes.push( - create_attribute('checked', -1, -1, [ + create_attribute('checked', null, -1, -1, [ { type: 'ExpressionTag', start: -1, @@ -165,7 +165,7 @@ export function build_element_attributes(node, context, transform) { ); } else { attributes.push( - create_attribute(attribute.name, -1, -1, [ + create_attribute(attribute.name, null, -1, -1, [ { type: 'ExpressionTag', start: -1, diff --git a/packages/svelte/src/compiler/phases/nodes.js b/packages/svelte/src/compiler/phases/nodes.js index e9717eb4048a..c9117c814b65 100644 --- a/packages/svelte/src/compiler/phases/nodes.js +++ b/packages/svelte/src/compiler/phases/nodes.js @@ -1,4 +1,4 @@ -/** @import { Expression, PrivateIdentifier } from 'estree' */ +/** @import { Expression, PrivateIdentifier, SourceLocation } from 'estree' */ /** @import { AST, Binding } from '#compiler' */ import * as b from '#compiler/builders'; @@ -47,17 +47,19 @@ export function is_custom_element_node(node) { /** * @param {string} name + * @param {SourceLocation} name_loc * @param {number} start * @param {number} end * @param {AST.Attribute['value']} value * @returns {AST.Attribute} */ -export function create_attribute(name, start, end, value) { +export function create_attribute(name, name_loc, start, end, value) { return { type: 'Attribute', start, end, name, + name_loc, value, metadata: { delegated: false, diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index 31efb75d479e..e271b9cfd52e 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -533,6 +533,7 @@ export namespace AST { export interface Attribute extends BaseNode { type: 'Attribute'; name: string; + name_loc: SourceLocation; /** * Quoted/string values are represented by an array, even if they contain a single expression like `"{x}"` */ diff --git a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json index c6af77a47b6f..279bb27f426f 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json @@ -15,6 +15,16 @@ "end": 20, "type": "Action", "name": "autofocus", + "name_loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 20 + } + }, "expression": null, "modifiers": [] }, @@ -23,6 +33,16 @@ "end": 34, "type": "Action", "name": "autofocus", + "name_loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 34 + } + }, "expression": null, "modifiers": [] } diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json index a10d4eccf0eb..f1ca0947088a 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json @@ -15,6 +15,16 @@ "end": 39, "type": "Action", "name": "tooltip", + "name_loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 18 + } + }, "expression": { "type": "CallExpression", "start": 21, diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json index e9a3e7e5da6f..8356bb1512c7 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json @@ -15,6 +15,16 @@ "end": 28, "type": "Action", "name": "tooltip", + "name_loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 18 + } + }, "expression": { "type": "Identifier", "start": 20, diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json index 94b60b9e5d13..086201476761 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json @@ -15,6 +15,16 @@ "end": 36, "type": "Action", "name": "tooltip", + "name_loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 18 + } + }, "expression": { "type": "Literal", "start": 21, diff --git a/packages/svelte/tests/parser-legacy/samples/action/output.json b/packages/svelte/tests/parser-legacy/samples/action/output.json index f241c81a933a..261ebafcead4 100644 --- a/packages/svelte/tests/parser-legacy/samples/action/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action/output.json @@ -15,6 +15,16 @@ "end": 20, "type": "Action", "name": "autofocus", + "name_loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 20 + } + }, "expression": null, "modifiers": [] } diff --git a/packages/svelte/tests/parser-legacy/samples/animation/output.json b/packages/svelte/tests/parser-legacy/samples/animation/output.json index bf4b43b87595..835b3acf060e 100644 --- a/packages/svelte/tests/parser-legacy/samples/animation/output.json +++ b/packages/svelte/tests/parser-legacy/samples/animation/output.json @@ -20,6 +20,16 @@ "end": 50, "type": "Animation", "name": "flip", + "name_loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 18 + } + }, "expression": null, "modifiers": [] } diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json index 3cd54b66479b..cccb455e9d49 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json @@ -15,6 +15,16 @@ "end": 22, "type": "Class", "name": "foo", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 14 + } + }, "expression": { "type": "Identifier", "start": 16, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json index 2c63b3a43d13..8592e9dfefba 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json @@ -15,6 +15,16 @@ "start": 3, "end": 30, "name": "href", + "name_loc": { + "start": { + "line": 1, + "column": 3 + }, + "end": { + "line": 1, + "column": 7 + } + }, "value": [ { "start": 8, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json index 2453dc9e0a07..8ea8a9bb1f3d 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json @@ -15,6 +15,16 @@ "start": 7, "end": 15, "name": "foo", + "name_loc": { + "start": { + "line": 1, + "column": 7 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 11, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json index 5793afe896fd..4889cd6c3953 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json @@ -15,6 +15,16 @@ "start": 10, "end": 29, "name": "readonly", + "name_loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 18 + } + }, "value": [ { "type": "MustacheTag", diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json index 9fd98c80ec27..609ce50416c0 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 28, "name": "style", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 12, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json index d2a3dcd93bf6..74b2e9010d2b 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 9, "name": "a", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 6 + } + }, "value": [ { "start": 8, @@ -30,6 +40,16 @@ "start": 10, "end": 16, "name": "b", + "name_loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 11 + } + }, "value": [ { "type": "MustacheTag", @@ -60,6 +80,16 @@ "start": 17, "end": 21, "name": "c", + "name_loc": { + "start": { + "line": 1, + "column": 17 + }, + "end": { + "line": 1, + "column": 18 + } + }, "value": [ { "start": 20, @@ -75,6 +105,16 @@ "start": 22, "end": 30, "name": "d", + "name_loc": { + "start": { + "line": 1, + "column": 22 + }, + "end": { + "line": 1, + "column": 23 + } + }, "value": [ { "type": "MustacheTag", diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json index e2eb99f32774..de7c46862f3c 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 76, "name": "data-foo", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 13 + } + }, "value": [ { "start": 15, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json index 66b780e53661..87143ffe27b9 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 11, "name": "id", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 7 + } + }, "value": [ { "start": 9, @@ -30,6 +40,16 @@ "start": 12, "end": 21, "name": "class", + "name_loc": { + "start": { + "line": 1, + "column": 12 + }, + "end": { + "line": 1, + "column": 17 + } + }, "value": [ { "start": 19, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json index 2ae3acfdc7eb..b12772528658 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json @@ -15,6 +15,7 @@ "start": 5, "end": 9, "name": "id", + "name_loc": null, "value": [ { "type": "AttributeShorthand", diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json index 8cb93b75ec08..c29c854afbe6 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json @@ -15,6 +15,16 @@ "start": 10, "end": 18, "name": "readonly", + "name_loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 18 + } + }, "value": true } ], diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json index 3e19a4727ea3..6d1787b27f16 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 16, "name": "class", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 12, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json index 06bdae28629c..9a9b3511c5d7 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json @@ -15,6 +15,16 @@ "end": 36, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 26 + } + }, "modifiers": [ "important" ], diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json index d7f53cb00ca2..1b35ef73a3b6 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json @@ -15,6 +15,16 @@ "end": 16, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 16 + } + }, "modifiers": [], "value": true } diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json index 5acf7d797eaa..a94ea3235dad 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json @@ -15,6 +15,16 @@ "end": 22, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 16 + } + }, "modifiers": [], "value": [ { @@ -47,6 +57,16 @@ "end": 52, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 16 + } + }, "modifiers": [], "value": [ { @@ -79,6 +99,16 @@ "end": 80, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 3, + "column": 5 + }, + "end": { + "line": 3, + "column": 16 + } + }, "modifiers": [], "value": [ { @@ -111,6 +141,16 @@ "end": 120, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 4, + "column": 5 + }, + "end": { + "line": 4, + "column": 16 + } + }, "modifiers": [], "value": [ { @@ -164,6 +204,16 @@ "end": 160, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 5, + "column": 5 + }, + "end": { + "line": 5, + "column": 16 + } + }, "modifiers": [], "value": [ { @@ -217,6 +267,16 @@ "end": 198, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 6, + "column": 5 + }, + "end": { + "line": 6, + "column": 16 + } + }, "modifiers": [], "value": [ { @@ -270,6 +330,16 @@ "end": 245, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 7, + "column": 5 + }, + "end": { + "line": 7, + "column": 16 + } + }, "modifiers": [], "value": [ { diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json index 2cce9fef952c..b0069753883d 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json @@ -15,6 +15,16 @@ "end": 26, "type": "StyleDirective", "name": "color", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 16 + } + }, "modifiers": [], "value": [ { diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json index 1d9a528d6d3d..9a9ce001fbf0 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 24, "name": "style", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 12, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json index ab2912a2c019..9770c31ea373 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json @@ -15,6 +15,16 @@ "start": 5, "end": 14, "name": "class", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 11, @@ -46,6 +56,16 @@ "start": 25, "end": 31, "name": "href", + "name_loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 7 + } + }, "value": [ { "start": 30, @@ -85,6 +105,16 @@ "start": 44, "end": 53, "name": "href", + "name_loc": { + "start": { + "line": 3, + "column": 3 + }, + "end": { + "line": 3, + "column": 7 + } + }, "value": [ { "start": 49, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json index 2e45184be928..42ffd86e79e7 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json @@ -15,6 +15,16 @@ "end": 23, "type": "EventHandler", "name": "click", + "name_loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 1, + "column": 16 + } + }, "expression": { "type": "Identifier", "start": 19, diff --git a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json index 42892457059c..3acfe5e49638 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json @@ -22,6 +22,16 @@ "end": 46, "type": "Binding", "name": "foo", + "name_loc": { + "start": { + "line": 5, + "column": 8 + }, + "end": { + "line": 5, + "column": 16 + } + }, "expression": { "start": 43, "end": 46, diff --git a/packages/svelte/tests/parser-legacy/samples/binding/output.json b/packages/svelte/tests/parser-legacy/samples/binding/output.json index 5256ede7bb9a..f3198b5d2463 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding/output.json @@ -22,6 +22,16 @@ "end": 55, "type": "Binding", "name": "value", + "name_loc": { + "start": { + "line": 5, + "column": 7 + }, + "end": { + "line": 5, + "column": 17 + } + }, "expression": { "type": "Identifier", "start": 50, diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json index 9ba15d604484..b6866f95c4d1 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json @@ -156,6 +156,16 @@ "start": 263, "end": 274, "name": "class", + "name_loc": { + "start": { + "line": 7, + "column": 29 + }, + "end": { + "line": 7, + "column": 34 + } + }, "value": [ { "start": 270, diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json index 291cdaa73405..b9f480170e40 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json @@ -62,6 +62,16 @@ "start": 72, "end": 83, "name": "class", + "name_loc": { + "start": { + "line": 2, + "column": 27 + }, + "end": { + "line": 2, + "column": 32 + } + }, "value": [ { "start": 79, diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json index 7773256d44ea..460e452f59d1 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json @@ -15,6 +15,16 @@ "start": 6, "end": 13, "name": "attr", + "name_loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 12, @@ -46,6 +56,16 @@ "start": 28, "end": 35, "name": "attr", + "name_loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 10 + } + }, "value": [ { "start": 34, diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json index 9477886bb289..2bd89c8e33d9 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json @@ -15,6 +15,16 @@ "start": 6, "end": 16, "name": "attr", + "name_loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 10 + } + }, "value": [ { "start": 12, @@ -46,6 +56,16 @@ "start": 31, "end": 41, "name": "attr", + "name_loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 10 + } + }, "value": [ { "start": 37, diff --git a/packages/svelte/tests/parser-legacy/samples/elements/output.json b/packages/svelte/tests/parser-legacy/samples/elements/output.json index 6b51383d9339..177ebd4fbf40 100644 --- a/packages/svelte/tests/parser-legacy/samples/elements/output.json +++ b/packages/svelte/tests/parser-legacy/samples/elements/output.json @@ -15,6 +15,16 @@ "start": 10, "end": 14, "name": "html", + "name_loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 14 + } + }, "value": true } ], diff --git a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json index 11ee562297ed..d7acecbf9f32 100644 --- a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json +++ b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json @@ -15,6 +15,16 @@ "end": 45, "type": "EventHandler", "name": "click", + "name_loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 1, + "column": 16 + } + }, "expression": { "type": "ArrowFunctionExpression", "start": 19, diff --git a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json index 42229b741fbd..8e74b15fdab5 100644 --- a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json +++ b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json @@ -22,6 +22,16 @@ "end": 692, "type": "EventHandler", "name": "click", + "name_loc": { + "start": { + "line": 34, + "column": 1 + }, + "end": { + "line": 34, + "column": 9 + } + }, "expression": { "type": "ArrowFunctionExpression", "start": 596, diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json index 0564d6d29517..40465bda2670 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json @@ -15,6 +15,7 @@ "start": 5, "end": 7, "name": "", + "name_loc": null, "value": [ { "type": "AttributeShorthand", @@ -50,6 +51,16 @@ "start": 20, "end": 26, "name": "foo", + "name_loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 8 + } + }, "value": [ { "type": "MustacheTag", @@ -85,6 +96,16 @@ "start": 40, "end": 48, "name": "foo", + "name_loc": { + "start": { + "line": 4, + "column": 5 + }, + "end": { + "line": 4, + "column": 8 + } + }, "value": [ { "type": "MustacheTag", @@ -120,6 +141,16 @@ "start": 61, "end": 73, "name": "foo", + "name_loc": { + "start": { + "line": 5, + "column": 5 + }, + "end": { + "line": 5, + "column": 8 + } + }, "value": [ { "type": "MustacheTag", @@ -155,6 +186,16 @@ "start": 92, "end": 110, "name": "onclick", + "name_loc": { + "start": { + "line": 6, + "column": 11 + }, + "end": { + "line": 6, + "column": 18 + } + }, "value": [ { "type": "MustacheTag", @@ -190,6 +231,16 @@ "end": 137, "type": "Binding", "name": "value", + "name_loc": { + "start": { + "line": 8, + "column": 7 + }, + "end": { + "line": 8, + "column": 17 + } + }, "expression": { "type": "Identifier", "start": 134, diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json index 1792d6b8e638..511deab335b4 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json @@ -29,6 +29,16 @@ "start": 13, "end": 22, "name": "foo", + "name_loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 10 + } + }, "value": [ { "type": "MustacheTag", @@ -90,6 +100,16 @@ "start": 44, "end": 53, "name": "foo", + "name_loc": { + "start": { + "line": 6, + "column": 7 + }, + "end": { + "line": 6, + "column": 10 + } + }, "value": [ { "type": "MustacheTag", @@ -158,6 +178,16 @@ "start": 79, "end": 88, "name": "foo", + "name_loc": { + "start": { + "line": 10, + "column": 7 + }, + "end": { + "line": 10, + "column": 10 + } + }, "value": [ { "type": "MustacheTag", @@ -226,6 +256,16 @@ "start": 113, "end": 122, "name": "foo", + "name_loc": { + "start": { + "line": 14, + "column": 7 + }, + "end": { + "line": 14, + "column": 10 + } + }, "value": [ { "type": "MustacheTag", @@ -317,6 +357,16 @@ "start": 161, "end": 170, "name": "foo", + "name_loc": { + "start": { + "line": 20, + "column": 5 + }, + "end": { + "line": 20, + "column": 8 + } + }, "value": [ { "type": "MustacheTag", diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json index 2205a00e203a..721dd970bbdc 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json @@ -68,6 +68,16 @@ "start": 35, "end": 44, "name": "foo", + "name_loc": { + "start": { + "line": 6, + "column": 7 + }, + "end": { + "line": 6, + "column": 10 + } + }, "value": [ { "type": "MustacheTag", @@ -275,6 +285,16 @@ "start": 159, "end": 168, "name": "foo", + "name_loc": { + "start": { + "line": 26, + "column": 7 + }, + "end": { + "line": 26, + "column": 10 + } + }, "value": [ { "type": "MustacheTag", diff --git a/packages/svelte/tests/parser-legacy/samples/refs/output.json b/packages/svelte/tests/parser-legacy/samples/refs/output.json index 7829a2787fab..da8f21910f5b 100644 --- a/packages/svelte/tests/parser-legacy/samples/refs/output.json +++ b/packages/svelte/tests/parser-legacy/samples/refs/output.json @@ -22,6 +22,16 @@ "end": 53, "type": "Binding", "name": "this", + "name_loc": { + "start": { + "line": 5, + "column": 8 + }, + "end": { + "line": 5, + "column": 17 + } + }, "expression": { "type": "Identifier", "start": 49, diff --git a/packages/svelte/tests/parser-legacy/samples/self-reference/output.json b/packages/svelte/tests/parser-legacy/samples/self-reference/output.json index 34310fcce46c..5e33f9f3487a 100644 --- a/packages/svelte/tests/parser-legacy/samples/self-reference/output.json +++ b/packages/svelte/tests/parser-legacy/samples/self-reference/output.json @@ -69,6 +69,16 @@ "start": 30, "end": 49, "name": "depth", + "name_loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 19 + } + }, "value": [ { "type": "MustacheTag", diff --git a/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json b/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json index 90ded681031c..488051f19c79 100644 --- a/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json +++ b/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json @@ -22,6 +22,16 @@ "start": 16, "end": 26, "name": "slot", + "name_loc": { + "start": { + "line": 1, + "column": 16 + }, + "end": { + "line": 1, + "column": 20 + } + }, "value": [ { "start": 22, diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json index 18860d615b90..6b48a54861e4 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json @@ -15,6 +15,16 @@ "end": 12, "type": "Transition", "name": "fade", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 12 + } + }, "expression": null, "modifiers": [], "intro": true, diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json index 973cfb7d3374..5a1e30b9f1dc 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json @@ -15,6 +15,16 @@ "end": 30, "type": "Transition", "name": "style", + "name_loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 13 + } + }, "expression": { "type": "ObjectExpression", "start": 16, diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json index 0be33eb214fe..36aa9e301175 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json @@ -35,6 +35,16 @@ "end": 114, "type": "BindDirective", "name": "value", + "name_loc": { + "start": { + "line": 5, + "column": 7 + }, + "end": { + "line": 5, + "column": 17 + } + }, "expression": { "type": "SequenceExpression", "start": 68, diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json index 1aca0ce03607..8be694071e9a 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json @@ -138,6 +138,7 @@ "start": 36, "end": 45, "name": "lang", + "name_loc": null, "value": [ { "start": 42, diff --git a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json index b66ee7288f2e..500d915a8bf3 100644 --- a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json @@ -284,6 +284,7 @@ "start": 8, "end": 17, "name": "lang", + "name_loc": null, "value": [ { "start": 14, diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json index 9763f82bf1a9..57bedb1d29aa 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json @@ -28,6 +28,7 @@ "start": 5, "end": 7, "name": "", + "name_loc": null, "value": { "type": "ExpressionTag", "start": 6, @@ -74,6 +75,16 @@ "start": 20, "end": 26, "name": "foo", + "name_loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 8 + } + }, "value": { "type": "ExpressionTag", "start": 24, @@ -120,6 +131,16 @@ "start": 40, "end": 48, "name": "foo", + "name_loc": { + "start": { + "line": 4, + "column": 5 + }, + "end": { + "line": 4, + "column": 8 + } + }, "value": { "type": "ExpressionTag", "start": 44, @@ -166,6 +187,16 @@ "start": 61, "end": 73, "name": "foo", + "name_loc": { + "start": { + "line": 5, + "column": 5 + }, + "end": { + "line": 5, + "column": 8 + } + }, "value": { "type": "ExpressionTag", "start": 65, @@ -212,6 +243,16 @@ "start": 92, "end": 110, "name": "onclick", + "name_loc": { + "start": { + "line": 6, + "column": 11 + }, + "end": { + "line": 6, + "column": 18 + } + }, "value": { "type": "ExpressionTag", "start": 100, @@ -258,6 +299,16 @@ "end": 137, "type": "BindDirective", "name": "value", + "name_loc": { + "start": { + "line": 8, + "column": 7 + }, + "end": { + "line": 8, + "column": 17 + } + }, "expression": { "type": "Identifier", "start": 134, diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json index 32d51efef2e4..166d8221fbcc 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json @@ -54,6 +54,16 @@ "start": 13, "end": 22, "name": "foo", + "name_loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 10 + } + }, "value": { "type": "ExpressionTag", "start": 17, @@ -139,6 +149,16 @@ "start": 44, "end": 53, "name": "foo", + "name_loc": { + "start": { + "line": 6, + "column": 7 + }, + "end": { + "line": 6, + "column": 10 + } + }, "value": { "type": "ExpressionTag", "start": 48, @@ -229,6 +249,16 @@ "start": 79, "end": 88, "name": "foo", + "name_loc": { + "start": { + "line": 10, + "column": 7 + }, + "end": { + "line": 10, + "column": 10 + } + }, "value": { "type": "ExpressionTag", "start": 83, @@ -320,6 +350,16 @@ "start": 113, "end": 122, "name": "foo", + "name_loc": { + "start": { + "line": 14, + "column": 7 + }, + "end": { + "line": 14, + "column": 10 + } + }, "value": { "type": "ExpressionTag", "start": 117, @@ -450,6 +490,16 @@ "start": 161, "end": 170, "name": "foo", + "name_loc": { + "start": { + "line": 20, + "column": 5 + }, + "end": { + "line": 20, + "column": 8 + } + }, "value": { "type": "ExpressionTag", "start": 165, diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json index f54af737735a..e1e5b4699bd5 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json @@ -119,6 +119,16 @@ "start": 35, "end": 44, "name": "foo", + "name_loc": { + "start": { + "line": 6, + "column": 7 + }, + "end": { + "line": 6, + "column": 10 + } + }, "value": { "type": "ExpressionTag", "start": 39, @@ -451,6 +461,16 @@ "start": 159, "end": 168, "name": "foo", + "name_loc": { + "start": { + "line": 26, + "column": 7 + }, + "end": { + "line": 26, + "column": 10 + } + }, "value": { "type": "ExpressionTag", "start": 163, diff --git a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json index 11d25eeb1498..4f73469caf0a 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json @@ -303,6 +303,7 @@ "start": 8, "end": 17, "name": "lang", + "name_loc": null, "value": [ { "start": 14, diff --git a/packages/svelte/tests/parser-modern/samples/options/output.json b/packages/svelte/tests/parser-modern/samples/options/output.json index 6feee2d4f506..97cce390601f 100644 --- a/packages/svelte/tests/parser-modern/samples/options/output.json +++ b/packages/svelte/tests/parser-modern/samples/options/output.json @@ -32,6 +32,16 @@ "start": 16, "end": 49, "name": "customElement", + "name_loc": { + "start": { + "line": 1, + "column": 16 + }, + "end": { + "line": 1, + "column": 29 + } + }, "value": [ { "start": 31, @@ -47,6 +57,16 @@ "start": 50, "end": 62, "name": "runes", + "name_loc": { + "start": { + "line": 1, + "column": 50 + }, + "end": { + "line": 1, + "column": 55 + } + }, "value": { "type": "ExpressionTag", "start": 56, @@ -104,6 +124,7 @@ "start": 75, "end": 81, "name": "module", + "name_loc": null, "value": true }, { @@ -111,6 +132,7 @@ "start": 82, "end": 91, "name": "lang", + "name_loc": null, "value": [ { "start": 88, @@ -151,6 +173,7 @@ "start": 112, "end": 121, "name": "lang", + "name_loc": null, "value": [ { "start": 118, @@ -166,6 +189,7 @@ "start": 122, "end": 158, "name": "generics", + "name_loc": null, "value": [ { "start": 132, diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json index 18455b9687e2..b3629701a65b 100644 --- a/packages/svelte/tests/parser-modern/samples/snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json @@ -228,6 +228,7 @@ "start": 8, "end": 17, "name": "lang", + "name_loc": null, "value": [ { "start": 14, diff --git a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json index cf1d6f4ed14a..0cd406e77165 100644 --- a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json +++ b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json @@ -28,6 +28,16 @@ "start": 10, "end": 31, "name": "shadowrootmode", + "name_loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 24 + } + }, "value": [ { "start": 26, diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json index 59b94e47eedb..d0bf1e64a274 100644 --- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json +++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json @@ -35,6 +35,16 @@ "end": 147, "type": "OnDirective", "name": "click", + "name_loc": { + "start": { + "line": 6, + "column": 1 + }, + "end": { + "line": 6, + "column": 9 + } + }, "expression": { "type": "ArrowFunctionExpression", "start": 73, @@ -495,6 +505,7 @@ "start": 8, "end": 17, "name": "lang", + "name_loc": null, "value": [ { "start": 14, diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 81e64081fe43..3761e7e5d381 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -1521,6 +1521,7 @@ declare module 'svelte/compiler' { export interface Attribute extends BaseNode { type: 'Attribute'; name: string; + name_loc: SourceLocation; /** * Quoted/string values are represented by an array, even if they contain a single expression like `"{x}"` */ From a626f68030a44730db57b5ebe42bd40f24da6bb9 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 11:40:02 -0500 Subject: [PATCH 12/29] WIP --- .../client/visitors/shared/component.js | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index 38939a783796..d6e1b02d893d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -260,15 +260,9 @@ export function build_component(node, component_name, loc, context) { attribute.expression.type === 'Identifier' && context.state.scope.get(attribute.expression.name)?.kind === 'store_sub'; - // Delay prop pushes so bindings come at the end, to avoid spreads overwriting them - if (is_store_sub) { - push_prop( - b.get(attribute.name, [b.stmt(b.call('$.mark_store_binding')), b.return(expression)]), - true - ); - } else { - push_prop(b.get(attribute.name, [b.return(expression)]), true); - } + const get = is_store_sub + ? b.get(attribute.name, [b.stmt(b.call('$.mark_store_binding')), b.return(expression)]) + : b.get(attribute.name, [b.return(expression)]); const assignment = b.assignment( '=', @@ -276,10 +270,16 @@ export function build_component(node, component_name, loc, context) { b.id('$$value') ); - push_prop( - b.set(attribute.name, [b.stmt(/** @type {Expression} */ (context.visit(assignment)))]), - true - ); + const set = b.set(attribute.name, [ + b.stmt(/** @type {Expression} */ (context.visit(assignment))) + ]); + + get.key.loc = attribute.name_loc; + set.key.loc = attribute.name_loc; + + // Delay prop pushes so bindings come at the end, to avoid spreads overwriting them + push_prop(get, true); + push_prop(set, true); } } } else if (attribute.type === 'AttachTag') { From b179ce52d6aa922cca10a99dc466c483dabc4c7a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 12:23:25 -0500 Subject: [PATCH 13/29] WIP --- .../client/visitors/BindDirective.js | 38 +++++++++++++------ .../client/visitors/shared/component.js | 21 +++++----- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/BindDirective.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/BindDirective.js index 12118d9f692c..6838e5006db0 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/BindDirective.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/BindDirective.js @@ -40,22 +40,38 @@ export function BindDirective(node, context) { validate_binding(context.state, node, expression); } - get = b.thunk(expression); + const assignment = /** @type {Expression} */ ( + context.visit(b.assignment('=', /** @type {Pattern} */ (node.expression), b.id('$$value'))) + ); - /** @type {Expression | undefined} */ - set = b.unthunk( - b.arrow( + if (dev) { + // in dev, create named functions, so that `$inspect(...)` delivers + // useful stack traces + get = b.function(b.id('get', node.name_loc), [], b.block([b.return(expression)])); + set = b.function( + b.id('set', node.name_loc), [b.id('$$value')], - /** @type {Expression} */ ( - context.visit( - b.assignment('=', /** @type {Pattern} */ (node.expression), b.id('$$value')) + b.block([b.stmt(assignment)]) + ); + } else { + // in prod, optimise for brevity + get = b.thunk(expression); + + /** @type {Expression | undefined} */ + set = b.unthunk( + b.arrow( + [b.id('$$value')], + /** @type {Expression} */ ( + context.visit( + b.assignment('=', /** @type {Pattern} */ (node.expression), b.id('$$value')) + ) ) ) - ) - ); + ); - if (get === set) { - set = undefined; + if (get === set) { + set = undefined; + } } } diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js index d6e1b02d893d..4651f6f733e9 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/component.js @@ -435,16 +435,17 @@ export function build_component(node, component_name, loc, context) { /** @param {Expression} node_id */ let fn = (node_id) => { - return b.call( - // TODO We can remove this ternary once we remove legacy mode, since in runes mode dynamic components - // will be handled separately through the `$.component` function, and then the component name will - // always be referenced through just the identifier here. - is_component_dynamic - ? intermediate_name - : /** @type {Expression} */ (context.visit(b.member_id(component_name))), - node_id, - props_expression - ); + // TODO We can remove this ternary once we remove legacy mode, since in runes mode dynamic components + // will be handled separately through the `$.component` function, and then the component name will + // always be referenced through just the identifier here. + const callee = is_component_dynamic + ? b.id(intermediate_name) + : /** @type {Expression} */ (context.visit(b.member_id(component_name))); + + // line up the `Foo` in `Foo(...)` and `` for usable stack traces + callee.loc = loc; + + return b.call(callee, node_id, props_expression); }; if (bind_this !== null) { From f609ad81bf0943279532d43380e0f1af132e67aa Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 12:30:14 -0500 Subject: [PATCH 14/29] WIP --- .../svelte/src/compiler/types/template.d.ts | 23 +++++++++++-------- packages/svelte/types/index.d.ts | 23 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index e271b9cfd52e..52243261618e 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -189,7 +189,7 @@ export namespace AST { } /** An `animate:` directive */ - export interface AnimateDirective extends BaseNode { + export interface AnimateDirective extends BaseAttribute { type: 'AnimateDirective'; /** The 'x' in `animate:x` */ name: string; @@ -202,7 +202,7 @@ export namespace AST { } /** A `bind:` directive */ - export interface BindDirective extends BaseNode { + export interface BindDirective extends BaseAttribute { type: 'BindDirective'; /** The 'x' in `bind:x` */ name: string; @@ -218,7 +218,7 @@ export namespace AST { } /** A `class:` directive */ - export interface ClassDirective extends BaseNode { + export interface ClassDirective extends BaseAttribute { type: 'ClassDirective'; /** The 'x' in `class:x` */ name: 'class'; @@ -231,7 +231,7 @@ export namespace AST { } /** A `let:` directive */ - export interface LetDirective extends BaseNode { + export interface LetDirective extends BaseAttribute { type: 'LetDirective'; /** The 'x' in `let:x` */ name: string; @@ -240,7 +240,7 @@ export namespace AST { } /** An `on:` directive */ - export interface OnDirective extends BaseNode { + export interface OnDirective extends BaseAttribute { type: 'OnDirective'; /** The 'x' in `on:x` */ name: string; @@ -264,7 +264,7 @@ export namespace AST { } /** A `style:` directive */ - export interface StyleDirective extends BaseNode { + export interface StyleDirective extends BaseAttribute { type: 'StyleDirective'; /** The 'x' in `style:x` */ name: string; @@ -279,7 +279,7 @@ export namespace AST { // TODO have separate in/out/transition directives /** A `transition:`, `in:` or `out:` directive */ - export interface TransitionDirective extends BaseNode { + export interface TransitionDirective extends BaseAttribute { type: 'TransitionDirective'; /** The 'x' in `transition:x` */ name: string; @@ -297,7 +297,7 @@ export namespace AST { } /** A `use:` directive */ - export interface UseDirective extends BaseNode { + export interface UseDirective extends BaseAttribute { type: 'UseDirective'; /** The 'x' in `use:x` */ name: string; @@ -530,10 +530,13 @@ export namespace AST { }; } - export interface Attribute extends BaseNode { - type: 'Attribute'; + export interface BaseAttribute extends BaseNode { name: string; name_loc: SourceLocation; + } + + export interface Attribute extends BaseAttribute { + type: 'Attribute'; /** * Quoted/string values are represented by an array, even if they contain a single expression like `"{x}"` */ diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 3761e7e5d381..a89f4424fee8 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -1302,7 +1302,7 @@ declare module 'svelte/compiler' { } /** An `animate:` directive */ - export interface AnimateDirective extends BaseNode { + export interface AnimateDirective extends BaseAttribute { type: 'AnimateDirective'; /** The 'x' in `animate:x` */ name: string; @@ -1311,7 +1311,7 @@ declare module 'svelte/compiler' { } /** A `bind:` directive */ - export interface BindDirective extends BaseNode { + export interface BindDirective extends BaseAttribute { type: 'BindDirective'; /** The 'x' in `bind:x` */ name: string; @@ -1320,7 +1320,7 @@ declare module 'svelte/compiler' { } /** A `class:` directive */ - export interface ClassDirective extends BaseNode { + export interface ClassDirective extends BaseAttribute { type: 'ClassDirective'; /** The 'x' in `class:x` */ name: 'class'; @@ -1329,7 +1329,7 @@ declare module 'svelte/compiler' { } /** A `let:` directive */ - export interface LetDirective extends BaseNode { + export interface LetDirective extends BaseAttribute { type: 'LetDirective'; /** The 'x' in `let:x` */ name: string; @@ -1338,7 +1338,7 @@ declare module 'svelte/compiler' { } /** An `on:` directive */ - export interface OnDirective extends BaseNode { + export interface OnDirective extends BaseAttribute { type: 'OnDirective'; /** The 'x' in `on:x` */ name: string; @@ -1358,7 +1358,7 @@ declare module 'svelte/compiler' { } /** A `style:` directive */ - export interface StyleDirective extends BaseNode { + export interface StyleDirective extends BaseAttribute { type: 'StyleDirective'; /** The 'x' in `style:x` */ name: string; @@ -1369,7 +1369,7 @@ declare module 'svelte/compiler' { // TODO have separate in/out/transition directives /** A `transition:`, `in:` or `out:` directive */ - export interface TransitionDirective extends BaseNode { + export interface TransitionDirective extends BaseAttribute { type: 'TransitionDirective'; /** The 'x' in `transition:x` */ name: string; @@ -1383,7 +1383,7 @@ declare module 'svelte/compiler' { } /** A `use:` directive */ - export interface UseDirective extends BaseNode { + export interface UseDirective extends BaseAttribute { type: 'UseDirective'; /** The 'x' in `use:x` */ name: string; @@ -1518,10 +1518,13 @@ declare module 'svelte/compiler' { body: Fragment; } - export interface Attribute extends BaseNode { - type: 'Attribute'; + export interface BaseAttribute extends BaseNode { name: string; name_loc: SourceLocation; + } + + export interface Attribute extends BaseAttribute { + type: 'Attribute'; /** * Quoted/string values are represented by an array, even if they contain a single expression like `"{x}"` */ From 6589661cc0a0b2c203337a425f6828c19803ba29 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 12:43:54 -0500 Subject: [PATCH 15/29] WIP --- .../compiler/phases/1-parse/state/element.js | 57 ++++++++----------- 1 file changed, 23 insertions(+), 34 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index d8b4f10f3910..f53c0eb520dc 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -70,24 +70,9 @@ export default function element(parser) { return; } - const start_location = /** @type {Location} */ (locator(parser.index)); + if (parser.eat('/')) { + const name = parser.read_until(regex_whitespace_or_slash_or_closing_tag); - /** @type {SourceLocation} */ - const name_loc = { - start: { - line: start_location.line, - column: start_location.column - }, - end: { - line: -1, - column: -1 - } - }; - - const is_closing_tag = parser.eat('/'); - const name = parser.read_until(regex_whitespace_or_slash_or_closing_tag); - - if (is_closing_tag) { parser.allow_whitespace(); parser.eat('>', true); @@ -142,9 +127,7 @@ export default function element(parser) { return; } - const end_location = /** @type {Location} */ (locator(parser.index)); - name_loc.end.line = end_location.line; - name_loc.end.column = end_location.column; + const { name, name_loc } = read_name(parser, regex_whitespace_or_slash_or_closing_tag); if (name.startsWith('svelte:') && !meta_tags.has(name)) { const bounds = { start: start + 1, end: start + 1 + name.length }; @@ -518,8 +501,6 @@ function read_static_attribute(parser) { function read_attribute(parser) { const start = parser.index; - const start_location = /** @type {Location} */ (locator(parser.index)); - if (parser.eat('{')) { parser.allow_whitespace(); @@ -605,19 +586,8 @@ function read_attribute(parser) { } } - /** @type {SourceLocation} */ - const name_loc = { - start: { - line: start_location.line, - column: start_location.column - }, - end: { - line: -1, - column: -1 - } - }; + const { name, name_loc } = read_name(parser, regex_token_ending_character); - const name = parser.read_until(regex_token_ending_character); if (!name) return null; let end = parser.index; @@ -894,3 +864,22 @@ function read_sequence(parser, done, location) { e.unexpected_eof(parser.template.length); } } + +/** + * + * @param {Parser} parser + * @param {RegExp} regex + */ +function read_name(parser, regex) { + const a = /** @type {Location} */ (locator(parser.index)); + const name = parser.read_until(regex); + const b = /** @type {Location} */ (locator(parser.index)); + + /** @type {SourceLocation} */ + const name_loc = { + start: { line: a.line, column: a.column }, + end: { line: b.line, column: b.column } + }; + + return { name, name_loc }; +} From 37173ec9ac1c079ea149fb7ab6d04968201c53b5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 12:46:15 -0500 Subject: [PATCH 16/29] WIP --- packages/svelte/src/compiler/phases/1-parse/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 8f7ef76be567..d1fd4e7355e6 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -218,8 +218,7 @@ export class Parser { return result; } - /** @param {any} allow_reserved */ - read_identifier(allow_reserved = false) { + read_identifier() { const start = this.index; let i = this.index; @@ -238,7 +237,7 @@ export class Parser { const identifier = this.template.slice(this.index, (this.index = i)); - if (!allow_reserved && is_reserved(identifier)) { + if (is_reserved(identifier)) { e.unexpected_reserved_word(start, identifier); } From 552a3b737e8dd5dd9c9684d3c90b63b1b473f2b2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:02:08 -0500 Subject: [PATCH 17/29] WIP --- .../src/compiler/phases/1-parse/index.js | 42 +++++++++++++++++ .../compiler/phases/1-parse/read/context.js | 15 ++----- .../compiler/phases/1-parse/state/element.js | 19 +++----- .../samples/animation/output.json | 4 +- .../samples/attribute-shorthand/output.json | 29 ++++++++++-- .../samples/await-catch/output.json | 4 +- .../samples/await-then-catch/output.json | 8 ++-- .../samples/each-block-else/output.json | 4 +- .../samples/each-block-indexed/output.json | 4 +- .../samples/each-block-keyed/output.json | 4 +- .../samples/each-block/output.json | 4 +- .../loose-invalid-expression/output.json | 45 ++++++++++++++----- .../samples/loose-unclosed-block/output.json | 4 +- .../no-error-if-before-closing/output.json | 8 ++-- .../samples/unusual-identifier/output.json | 4 +- .../loose-invalid-expression/output.json | 45 ++++++++++++++----- 16 files changed, 169 insertions(+), 74 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index d1fd4e7355e6..a5d67c9a77ec 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -1,4 +1,5 @@ /** @import { AST } from '#compiler' */ +/** @import * as ESTree from 'estree' */ // @ts-expect-error acorn type definitions are borked in the release we use import { isIdentifierStart, isIdentifierChar } from 'acorn'; import fragment from './state/fragment.js'; @@ -218,6 +219,47 @@ export class Parser { return result; } + /** + * @returns {ESTree.Identifier & { start: number, end: number }} + */ + read_id() { + const start = this.index; + let end = start; + let name = ''; + + const code = /** @type {number} */ (this.template.codePointAt(this.index)); + + if (isIdentifierStart(code, true)) { + let i = this.index; + end += code <= 0xffff ? 1 : 2; + + while (end < this.template.length) { + const code = /** @type {number} */ (this.template.codePointAt(end)); + + if (!isIdentifierChar(code, true)) break; + end += code <= 0xffff ? 1 : 2; + } + + name = this.template.slice(start, end); + this.index = end; + + if (is_reserved(name)) { + e.unexpected_reserved_word(start, name); + } + } + + return { + type: 'Identifier', + name, + start, + end, + loc: { + start: state.locator(start), + end: state.locator(end) + } + }; + } + read_identifier() { const start = this.index; 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 282288e2a22f..6195106e5cb6 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -1,11 +1,9 @@ -/** @import { Location } from 'locate-character' */ /** @import { Pattern } from 'estree' */ /** @import { Parser } from '../index.js' */ import { match_bracket } from '../utils/bracket.js'; import { parse_expression_at } from '../acorn.js'; import { regex_not_newline_characters } from '../../patterns.js'; import * as e from '../../../errors.js'; -import { locator } from '../../../state.js'; /** * @param {Parser} parser @@ -15,20 +13,13 @@ export default function read_pattern(parser) { const start = parser.index; let i = parser.index; - const name = parser.read_identifier(); + const id = parser.read_id(); - if (name !== null) { + if (id.name !== '') { const annotation = read_type_annotation(parser); return { - type: 'Identifier', - name, - start, - loc: { - start: /** @type {Location} */ (locator(start)), - end: /** @type {Location} */ (locator(parser.index)) - }, - end: parser.index, + ...id, typeAnnotation: annotation }; } diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index f53c0eb520dc..c31c5e80fb4e 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -544,10 +544,9 @@ function read_attribute(parser) { return spread; } else { - const value_start = parser.index; - let name = parser.read_identifier(); + const id = parser.read_id(); - if (name === null) { + if (id.name === '') { if ( parser.loose && (parser.match('#') || parser.match('/') || parser.match('@') || parser.match(':')) @@ -557,7 +556,6 @@ function read_attribute(parser) { return null; } else if (parser.loose && parser.match('}')) { // Likely in the middle of typing, just created the shorthand - name = ''; } else { e.attribute_empty_shorthand(start); } @@ -569,20 +567,15 @@ function read_attribute(parser) { /** @type {AST.ExpressionTag} */ const expression = { type: 'ExpressionTag', - start: value_start, - end: value_start + name.length, - expression: { - start: value_start, - end: value_start + name.length, - type: 'Identifier', - name - }, + start: id.start, + end: id.end, + expression: id, metadata: { expression: new ExpressionMetadata() } }; - return create_attribute(name, null, start, parser.index, expression); + return create_attribute(id.name, id.loc, start, parser.index, expression); } } diff --git a/packages/svelte/tests/parser-legacy/samples/animation/output.json b/packages/svelte/tests/parser-legacy/samples/animation/output.json index 835b3acf060e..07ec6cb7dd7a 100644 --- a/packages/svelte/tests/parser-legacy/samples/animation/output.json +++ b/packages/svelte/tests/parser-legacy/samples/animation/output.json @@ -49,6 +49,7 @@ "type": "Identifier", "name": "thing", "start": 17, + "end": 22, "loc": { "start": { "line": 1, @@ -60,8 +61,7 @@ "column": 22, "character": 22 } - }, - "end": 22 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json index b12772528658..61121e436e3d 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json @@ -15,17 +15,40 @@ "start": 5, "end": 9, "name": "id", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "end": { + "line": 1, + "column": 8, + "character": 8 + } + }, "value": [ { "type": "AttributeShorthand", "start": 6, "end": 8, "expression": { + "type": "Identifier", + "name": "id", "start": 6, "end": 8, - "type": "Identifier", - "name": "id" + "loc": { + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "end": { + "line": 1, + "column": 8, + "character": 8 + } + } } } ] diff --git a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json index 5572d573f89e..1ac7f1773d48 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json @@ -29,6 +29,7 @@ "type": "Identifier", "name": "theError", "start": 47, + "end": 55, "loc": { "start": { "line": 3, @@ -40,8 +41,7 @@ "column": 16, "character": 55 } - }, - "end": 55 + } }, "pending": { "type": "PendingBlock", diff --git a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json index b71365f39deb..df76eab8d3e9 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json @@ -28,6 +28,7 @@ "type": "Identifier", "name": "theValue", "start": 46, + "end": 54, "loc": { "start": { "line": 3, @@ -39,13 +40,13 @@ "column": 15, "character": 54 } - }, - "end": 54 + } }, "error": { "type": "Identifier", "name": "theError", "start": 96, + "end": 104, "loc": { "start": { "line": 5, @@ -57,8 +58,7 @@ "column": 16, "character": 104 } - }, - "end": 104 + } }, "pending": { "type": "PendingBlock", diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json index a6db309edb08..c8458f96f0a5 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json @@ -44,6 +44,7 @@ "type": "Identifier", "name": "animal", "start": 18, + "end": 24, "loc": { "start": { "line": 1, @@ -55,8 +56,7 @@ "column": 24, "character": 24 } - }, - "end": 24 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json index bce7fd81a211..2ba41d56b890 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json @@ -72,6 +72,7 @@ "type": "Identifier", "name": "animal", "start": 18, + "end": 24, "loc": { "start": { "line": 1, @@ -83,8 +84,7 @@ "column": 24, "character": 24 } - }, - "end": 24 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json index 2f6206a6cbeb..569681506b89 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json @@ -44,6 +44,7 @@ "type": "Identifier", "name": "todo", "start": 16, + "end": 20, "loc": { "start": { "line": 1, @@ -55,8 +56,7 @@ "column": 20, "character": 20 } - }, - "end": 20 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-legacy/samples/each-block/output.json b/packages/svelte/tests/parser-legacy/samples/each-block/output.json index f26f557958db..c763dc6b8576 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block/output.json @@ -44,6 +44,7 @@ "type": "Identifier", "name": "animal", "start": 18, + "end": 24, "loc": { "start": { "line": 1, @@ -55,8 +56,7 @@ "column": 24, "character": 24 } - }, - "end": 24 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json index 40465bda2670..093eab8828d4 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json @@ -15,17 +15,40 @@ "start": 5, "end": 7, "name": "", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "end": { + "line": 1, + "column": 6, + "character": 6 + } + }, "value": [ { "type": "AttributeShorthand", "start": 6, "end": 6, "expression": { + "type": "Identifier", + "name": "", "start": 6, "end": 6, - "type": "Identifier", - "name": "" + "loc": { + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "end": { + "line": 1, + "column": 6, + "character": 6 + } + } } } ] @@ -323,6 +346,7 @@ "type": "Identifier", "name": "item", "start": 197, + "end": 201, "loc": { "start": { "line": 15, @@ -334,8 +358,7 @@ "column": 20, "character": 201 } - }, - "end": 201 + } }, "expression": { "type": "Identifier", @@ -376,6 +399,7 @@ "type": "Identifier", "name": "item", "start": 234, + "end": 238, "loc": { "start": { "line": 17, @@ -387,8 +411,7 @@ "column": 19, "character": 238 } - }, - "end": 238 + } }, "expression": { "type": "Identifier", @@ -459,6 +482,7 @@ "type": "Identifier", "name": "y", "start": 285, + "end": 286, "loc": { "start": { "line": 21, @@ -470,8 +494,7 @@ "column": 17, "character": 286 } - }, - "end": 286 + } }, "error": null, "pending": { @@ -518,6 +541,7 @@ "type": "Identifier", "name": "y", "start": 314, + "end": 315, "loc": { "start": { "line": 23, @@ -529,8 +553,7 @@ "column": 18, "character": 315 } - }, - "end": 315 + } }, "pending": { "type": "PendingBlock", diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json index e6e909f0d5e1..37a46a48da4f 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json @@ -240,6 +240,7 @@ "type": "Identifier", "name": "y", "start": 138, + "end": 139, "loc": { "start": { "line": 19, @@ -251,8 +252,7 @@ "column": 13, "character": 139 } - }, - "end": 139 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json index c60efd4fbaf0..de12cffd86ae 100644 --- a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json +++ b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json @@ -119,6 +119,7 @@ "type": "Identifier", "name": "f", "start": 97, + "end": 98, "loc": { "start": { "line": 13, @@ -130,8 +131,7 @@ "column": 8, "character": 98 } - }, - "end": 98 + } }, "error": null, "pending": { @@ -219,6 +219,7 @@ "type": "Identifier", "name": "f", "start": 137, + "end": 138, "loc": { "start": { "line": 18, @@ -230,8 +231,7 @@ "column": 8, "character": 138 } - }, - "end": 138 + } }, "error": null, "pending": { diff --git a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json index 9081b7cb926d..da5555a7776d 100644 --- a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json @@ -44,6 +44,7 @@ "type": "Identifier", "name": "𐊧", "start": 17, + "end": 19, "loc": { "start": { "line": 1, @@ -55,8 +56,7 @@ "column": 19, "character": 19 } - }, - "end": 19 + } }, "expression": { "type": "Identifier", diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json index 57bedb1d29aa..64dbc7a908b2 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json @@ -28,16 +28,39 @@ "start": 5, "end": 7, "name": "", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "end": { + "line": 1, + "column": 6, + "character": 6 + } + }, "value": { "type": "ExpressionTag", "start": 6, "end": 6, "expression": { + "type": "Identifier", + "name": "", "start": 6, "end": 6, - "type": "Identifier", - "name": "" + "loc": { + "start": { + "line": 1, + "column": 6, + "character": 6 + }, + "end": { + "line": 1, + "column": 6, + "character": 6 + } + } } } } @@ -418,6 +441,7 @@ "type": "Identifier", "name": "item", "start": 197, + "end": 201, "loc": { "start": { "line": 15, @@ -429,8 +453,7 @@ "column": 20, "character": 201 } - }, - "end": 201 + } }, "key": { "type": "Identifier", @@ -464,6 +487,7 @@ "type": "Identifier", "name": "item", "start": 234, + "end": 238, "loc": { "start": { "line": 17, @@ -475,8 +499,7 @@ "column": 19, "character": 238 } - }, - "end": 238 + } } }, { @@ -526,6 +549,7 @@ "type": "Identifier", "name": "y", "start": 285, + "end": 286, "loc": { "start": { "line": 21, @@ -537,8 +561,7 @@ "column": 17, "character": 286 } - }, - "end": 286 + } }, "error": null, "pending": null, @@ -570,6 +593,7 @@ "type": "Identifier", "name": "y", "start": 314, + "end": 315, "loc": { "start": { "line": 23, @@ -581,8 +605,7 @@ "column": 18, "character": 315 } - }, - "end": 315 + } }, "pending": null, "then": null, From 35e92bb52ffaa5d11598860cb69f525abc253613 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:04:16 -0500 Subject: [PATCH 18/29] WIP --- .../compiler/phases/1-parse/state/element.js | 4 +- .../samples/comment-before-script/output.json | 11 ++++- .../samples/generic-snippets/output.json | 11 ++++- .../samples/loose-valid-each-as/output.json | 11 ++++- .../parser-modern/samples/options/output.json | 44 +++++++++++++++++-- .../samples/snippets/output.json | 11 ++++- .../typescript-in-event-handler/output.json | 11 ++++- 7 files changed, 92 insertions(+), 11 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index c31c5e80fb4e..2e4be7b1e2c8 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -456,7 +456,7 @@ function parent_is_shadowroot_template(stack) { function read_static_attribute(parser) { const start = parser.index; - const name = parser.read_until(regex_token_ending_character); + const { name, name_loc } = read_name(parser, regex_token_ending_character); if (!name) return null; /** @type {true | Array} */ @@ -491,7 +491,7 @@ function read_static_attribute(parser) { e.expected_token(parser.index, '='); } - return create_attribute(name, null, start, parser.index, value); + return create_attribute(name, name_loc, start, parser.index, value); } /** diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json index 8be694071e9a..3cd6fe4c3355 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json @@ -138,7 +138,16 @@ "start": 36, "end": 45, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 2, + "column": 8 + }, + "end": { + "line": 2, + "column": 12 + } + }, "value": [ { "start": 42, diff --git a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json index 500d915a8bf3..d8d48faa1f6c 100644 --- a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json @@ -284,7 +284,16 @@ "start": 8, "end": 17, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 1, + "column": 12 + } + }, "value": [ { "start": 14, diff --git a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json index 4f73469caf0a..1145911a4461 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json @@ -303,7 +303,16 @@ "start": 8, "end": 17, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 1, + "column": 12 + } + }, "value": [ { "start": 14, diff --git a/packages/svelte/tests/parser-modern/samples/options/output.json b/packages/svelte/tests/parser-modern/samples/options/output.json index 97cce390601f..a33f3b3f61d4 100644 --- a/packages/svelte/tests/parser-modern/samples/options/output.json +++ b/packages/svelte/tests/parser-modern/samples/options/output.json @@ -124,7 +124,16 @@ "start": 75, "end": 81, "name": "module", - "name_loc": null, + "name_loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 3, + "column": 14 + } + }, "value": true }, { @@ -132,7 +141,16 @@ "start": 82, "end": 91, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 3, + "column": 15 + }, + "end": { + "line": 3, + "column": 19 + } + }, "value": [ { "start": 88, @@ -173,7 +191,16 @@ "start": 112, "end": 121, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 6, + "column": 8 + }, + "end": { + "line": 6, + "column": 12 + } + }, "value": [ { "start": 118, @@ -189,7 +216,16 @@ "start": 122, "end": 158, "name": "generics", - "name_loc": null, + "name_loc": { + "start": { + "line": 6, + "column": 18 + }, + "end": { + "line": 6, + "column": 26 + } + }, "value": [ { "start": 132, diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json index b3629701a65b..cfbc1f4fee1d 100644 --- a/packages/svelte/tests/parser-modern/samples/snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json @@ -228,7 +228,16 @@ "start": 8, "end": 17, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 1, + "column": 12 + } + }, "value": [ { "start": 14, diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json index d0bf1e64a274..36b3e8a3ee6c 100644 --- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json +++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json @@ -505,7 +505,16 @@ "start": 8, "end": 17, "name": "lang", - "name_loc": null, + "name_loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 1, + "column": 12 + } + }, "value": [ { "start": 14, From 294927b70bd6499baaf20edf9672526acbd1ce79 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:11:41 -0500 Subject: [PATCH 19/29] WIP --- .../compiler/phases/2-analyze/visitors/RegularElement.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index 55468f1bbc98..ffd3fe69b784 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -49,8 +49,10 @@ export function RegularElement(node, context) { create_attribute( 'value', null, - /** @type {AST.Text} */ (node.fragment.nodes.at(0)).start, - /** @type {AST.Text} */ (node.fragment.nodes.at(-1)).end, + -1, + -1, + // /** @type {AST.Text} */ (node.fragment.nodes.at(0)).start, + // /** @type {AST.Text} */ (node.fragment.nodes.at(-1)).end, // @ts-ignore node.fragment.nodes ) From 99beb8017b4bb7beeeffe7c3b22f3f9bc365b7d3 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:32:30 -0500 Subject: [PATCH 20/29] WIP --- .../compiler/phases/1-parse/state/element.js | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 2e4be7b1e2c8..0625dff322aa 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -1,4 +1,4 @@ -/** @import { Expression, SourceLocation } from 'estree' */ +/** @import { Expression, Identifier, SourceLocation } from 'estree' */ /** @import { Location } from 'locate-character' */ /** @import { AST } from '#compiler' */ /** @import { Parser } from '../index.js' */ @@ -456,8 +456,8 @@ function parent_is_shadowroot_template(stack) { function read_static_attribute(parser) { const start = parser.index; - const { name, name_loc } = read_name(parser, regex_token_ending_character); - if (!name) return null; + const tag = read_tag(parser, regex_token_ending_character); + if (!tag.name) return null; /** @type {true | Array} */ let value = true; @@ -491,7 +491,7 @@ function read_static_attribute(parser) { e.expected_token(parser.index, '='); } - return create_attribute(name, name_loc, start, parser.index, value); + return create_attribute(tag.name, tag.loc, start, parser.index, value); } /** @@ -858,6 +858,28 @@ function read_sequence(parser, done, location) { } } +/** + * @param {Parser} parser + * @param {RegExp} regex + * @returns {Identifier & { start: number, end: number }} + */ +function read_tag(parser, regex) { + const start = parser.index; + const name = parser.read_until(regex); + const end = parser.index; + + return { + type: 'Identifier', + name, + start, + end, + loc: { + start: locator(start), + end: locator(end) + } + }; +} + /** * * @param {Parser} parser From 3a402085331eadd970088a29761d90c0083ad1d8 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:45:11 -0500 Subject: [PATCH 21/29] WIP --- .../client/transform-template/index.js | 3 +- .../client/visitors/shared/events.js | 2 +- .../client/visitors/shared/utils.js | 4 +-- .../server/visitors/RegularElement.js | 2 +- .../server/visitors/SvelteElement.js | 2 +- packages/svelte/src/compiler/state.js | 21 ++++++++--- .../src/compiler/utils/compile_diagnostic.js | 4 +-- .../samples/animation/output.json | 6 ++-- .../samples/attribute-shorthand/output.json | 12 +++---- .../samples/await-catch/output.json | 6 ++-- .../samples/await-then-catch/output.json | 12 +++---- .../samples/each-block-else/output.json | 6 ++-- .../samples/each-block-indexed/output.json | 6 ++-- .../samples/each-block-keyed/output.json | 6 ++-- .../samples/each-block/output.json | 6 ++-- .../loose-invalid-expression/output.json | 36 +++++++------------ .../samples/loose-unclosed-block/output.json | 6 ++-- .../no-error-if-before-closing/output.json | 12 +++---- .../samples/unusual-identifier/output.json | 6 ++-- .../loose-invalid-expression/output.json | 36 +++++++------------ 20 files changed, 76 insertions(+), 118 deletions(-) diff --git a/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js b/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js index d0327e702ad5..40c0907e3857 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/transform-template/index.js @@ -1,4 +1,3 @@ -/** @import { Location } from 'locate-character' */ /** @import { Namespace } from '#compiler' */ /** @import { ComponentClientTransformState } from '../types.js' */ /** @import { Node } from './types.js' */ @@ -15,7 +14,7 @@ function build_locations(nodes) { for (const node of nodes) { if (node.type !== 'element') continue; - const { line, column } = /** @type {Location} */ (locator(node.start)); + const { line, column } = locator(node.start); const expression = b.array([b.literal(line), b.literal(column)]); const children = build_locations(node.children); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js index 36ef721c35eb..29edc316ca8d 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/events.js @@ -146,7 +146,7 @@ export function build_event_handler(node, metadata, context) { b.this, b.id('$$args'), b.id(context.state.analysis.name), - loc && b.array([b.literal(loc.line), b.literal(loc.column)]), + b.array([b.literal(loc.line), b.literal(loc.column)]), has_side_effects(node) && b.true, remove_parens && b.true ); diff --git a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js index e7a4f6059b33..6145f66d8769 100644 --- a/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js +++ b/packages/svelte/src/compiler/phases/3-transform/client/visitors/shared/utils.js @@ -366,8 +366,8 @@ export function validate_binding(state, binding, expression) { : b.literal(/** @type {Identifier} */ (expression.property).name) ) ), - loc && b.literal(loc.line), - loc && b.literal(loc.column) + b.literal(loc.line), + b.literal(loc.column) ) ) ); diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js index 2ca16c4a2465..f74b1185a069 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/RegularElement.js @@ -99,7 +99,7 @@ export function RegularElement(node, context) { } if (dev) { - const location = /** @type {Location} */ (locator(node.start)); + const location = locator(node.start); state.template.push( b.stmt( b.call( diff --git a/packages/svelte/src/compiler/phases/3-transform/server/visitors/SvelteElement.js b/packages/svelte/src/compiler/phases/3-transform/server/visitors/SvelteElement.js index 145167a690f2..6fc1ca5dfc3a 100644 --- a/packages/svelte/src/compiler/phases/3-transform/server/visitors/SvelteElement.js +++ b/packages/svelte/src/compiler/phases/3-transform/server/visitors/SvelteElement.js @@ -50,7 +50,7 @@ export function SvelteElement(node, context) { build_element_attributes(node, { ...context, state }, optimiser.transform); if (dev) { - const location = /** @type {Location} */ (locator(node.start)); + const location = locator(node.start); statements.push( b.stmt( b.call( diff --git a/packages/svelte/src/compiler/state.js b/packages/svelte/src/compiler/state.js index 6d9873eb301e..5b18911ede07 100644 --- a/packages/svelte/src/compiler/state.js +++ b/packages/svelte/src/compiler/state.js @@ -1,4 +1,4 @@ -/** @import { Location } from 'locate-character' */ +/** @import { Position } from 'estree' */ /** @import { CompileOptions } from './types' */ /** @import { AST, Warning } from '#compiler' */ import { getLocator } from 'locate-character'; @@ -40,19 +40,31 @@ export let dev; export let runes = false; -export let locator = getLocator('', { offsetLine: 1 }); +/** @type {(index: number) => Position} */ +export let locator; /** @param {string} value */ export function set_source(value) { source = value; - locator = getLocator(source, { offsetLine: 1 }); + + const l = getLocator(source, { offsetLine: 1 }); + + locator = (i) => { + const loc = l(i); + if (!loc) throw new Error('An impossible situation occurred'); + + return { + line: loc.line, + column: loc.column + }; + }; } /** * @param {AST.SvelteNode & { start?: number | undefined }} node */ export function locate_node(node) { - const loc = /** @type {Location} */ (locator(/** @type {number} */ (node.start))); + const loc = locator(/** @type {number} */ (node.start)); return `${sanitize_location(filename)}:${loc?.line}:${loc.column}`; } @@ -103,7 +115,6 @@ export function reset(state) { runes = false; component_name = UNKNOWN_FILENAME; source = ''; - locator = () => undefined; filename = (state.filename ?? UNKNOWN_FILENAME).replace(/\\/g, '/'); warning_filter = state.warning ?? (() => true); warnings = []; diff --git a/packages/svelte/src/compiler/utils/compile_diagnostic.js b/packages/svelte/src/compiler/utils/compile_diagnostic.js index c5df49e01cee..fe22b9e8f23e 100644 --- a/packages/svelte/src/compiler/utils/compile_diagnostic.js +++ b/packages/svelte/src/compiler/utils/compile_diagnostic.js @@ -67,8 +67,8 @@ export class CompileDiagnostic { if (position) { this.position = position; - this.start = state.locator(position[0]); - this.end = state.locator(position[1]); + this.start = { character: position[0], ...state.locator(position[0]) }; + this.end = { character: position[1], ...state.locator(position[1]) }; if (this.start && this.end) { this.frame = get_code_frame(state.source, this.start.line - 1, this.end.column); } diff --git a/packages/svelte/tests/parser-legacy/samples/animation/output.json b/packages/svelte/tests/parser-legacy/samples/animation/output.json index 07ec6cb7dd7a..04d592998c55 100644 --- a/packages/svelte/tests/parser-legacy/samples/animation/output.json +++ b/packages/svelte/tests/parser-legacy/samples/animation/output.json @@ -53,13 +53,11 @@ "loc": { "start": { "line": 1, - "column": 17, - "character": 17 + "column": 17 }, "end": { "line": 1, - "column": 22, - "character": 22 + "column": 22 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json index 61121e436e3d..aac7abf0e217 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json @@ -18,13 +18,11 @@ "name_loc": { "start": { "line": 1, - "column": 6, - "character": 6 + "column": 6 }, "end": { "line": 1, - "column": 8, - "character": 8 + "column": 8 } }, "value": [ @@ -40,13 +38,11 @@ "loc": { "start": { "line": 1, - "column": 6, - "character": 6 + "column": 6 }, "end": { "line": 1, - "column": 8, - "character": 8 + "column": 8 } } } diff --git a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json index 1ac7f1773d48..be11da5e98dc 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json @@ -33,13 +33,11 @@ "loc": { "start": { "line": 3, - "column": 8, - "character": 47 + "column": 8 }, "end": { "line": 3, - "column": 16, - "character": 55 + "column": 16 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json index df76eab8d3e9..233a8dd5b299 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json @@ -32,13 +32,11 @@ "loc": { "start": { "line": 3, - "column": 7, - "character": 46 + "column": 7 }, "end": { "line": 3, - "column": 15, - "character": 54 + "column": 15 } } }, @@ -50,13 +48,11 @@ "loc": { "start": { "line": 5, - "column": 8, - "character": 96 + "column": 8 }, "end": { "line": 5, - "column": 16, - "character": 104 + "column": 16 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json index c8458f96f0a5..2edcf3a8baa3 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json @@ -48,13 +48,11 @@ "loc": { "start": { "line": 1, - "column": 18, - "character": 18 + "column": 18 }, "end": { "line": 1, - "column": 24, - "character": 24 + "column": 24 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json index 2ba41d56b890..63a7973ede87 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json @@ -76,13 +76,11 @@ "loc": { "start": { "line": 1, - "column": 18, - "character": 18 + "column": 18 }, "end": { "line": 1, - "column": 24, - "character": 24 + "column": 24 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json index 569681506b89..a154aabd0b17 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json @@ -48,13 +48,11 @@ "loc": { "start": { "line": 1, - "column": 16, - "character": 16 + "column": 16 }, "end": { "line": 1, - "column": 20, - "character": 20 + "column": 20 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block/output.json b/packages/svelte/tests/parser-legacy/samples/each-block/output.json index c763dc6b8576..556c0de4daa9 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block/output.json @@ -48,13 +48,11 @@ "loc": { "start": { "line": 1, - "column": 18, - "character": 18 + "column": 18 }, "end": { "line": 1, - "column": 24, - "character": 24 + "column": 24 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json index 093eab8828d4..2afeb7a3cab4 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json @@ -18,13 +18,11 @@ "name_loc": { "start": { "line": 1, - "column": 6, - "character": 6 + "column": 6 }, "end": { "line": 1, - "column": 6, - "character": 6 + "column": 6 } }, "value": [ @@ -40,13 +38,11 @@ "loc": { "start": { "line": 1, - "column": 6, - "character": 6 + "column": 6 }, "end": { "line": 1, - "column": 6, - "character": 6 + "column": 6 } } } @@ -350,13 +346,11 @@ "loc": { "start": { "line": 15, - "column": 16, - "character": 197 + "column": 16 }, "end": { "line": 15, - "column": 20, - "character": 201 + "column": 20 } } }, @@ -403,13 +397,11 @@ "loc": { "start": { "line": 17, - "column": 15, - "character": 234 + "column": 15 }, "end": { "line": 17, - "column": 19, - "character": 238 + "column": 19 } } }, @@ -486,13 +478,11 @@ "loc": { "start": { "line": 21, - "column": 16, - "character": 285 + "column": 16 }, "end": { "line": 21, - "column": 17, - "character": 286 + "column": 17 } } }, @@ -545,13 +535,11 @@ "loc": { "start": { "line": 23, - "column": 17, - "character": 314 + "column": 17 }, "end": { "line": 23, - "column": 18, - "character": 315 + "column": 18 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json index 37a46a48da4f..9f8325819044 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json @@ -244,13 +244,11 @@ "loc": { "start": { "line": 19, - "column": 12, - "character": 138 + "column": 12 }, "end": { "line": 19, - "column": 13, - "character": 139 + "column": 13 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json index de12cffd86ae..ca62e4819759 100644 --- a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json +++ b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json @@ -123,13 +123,11 @@ "loc": { "start": { "line": 13, - "column": 7, - "character": 97 + "column": 7 }, "end": { "line": 13, - "column": 8, - "character": 98 + "column": 8 } } }, @@ -223,13 +221,11 @@ "loc": { "start": { "line": 18, - "column": 7, - "character": 137 + "column": 7 }, "end": { "line": 18, - "column": 8, - "character": 138 + "column": 8 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json index da5555a7776d..f97c30bcc071 100644 --- a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json @@ -48,13 +48,11 @@ "loc": { "start": { "line": 1, - "column": 17, - "character": 17 + "column": 17 }, "end": { "line": 1, - "column": 19, - "character": 19 + "column": 19 } } }, diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json index 64dbc7a908b2..61edc503d3ba 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json @@ -31,13 +31,11 @@ "name_loc": { "start": { "line": 1, - "column": 6, - "character": 6 + "column": 6 }, "end": { "line": 1, - "column": 6, - "character": 6 + "column": 6 } }, "value": { @@ -52,13 +50,11 @@ "loc": { "start": { "line": 1, - "column": 6, - "character": 6 + "column": 6 }, "end": { "line": 1, - "column": 6, - "character": 6 + "column": 6 } } } @@ -445,13 +441,11 @@ "loc": { "start": { "line": 15, - "column": 16, - "character": 197 + "column": 16 }, "end": { "line": 15, - "column": 20, - "character": 201 + "column": 20 } } }, @@ -491,13 +485,11 @@ "loc": { "start": { "line": 17, - "column": 15, - "character": 234 + "column": 15 }, "end": { "line": 17, - "column": 19, - "character": 238 + "column": 19 } } } @@ -553,13 +545,11 @@ "loc": { "start": { "line": 21, - "column": 16, - "character": 285 + "column": 16 }, "end": { "line": 21, - "column": 17, - "character": 286 + "column": 17 } } }, @@ -597,13 +587,11 @@ "loc": { "start": { "line": 23, - "column": 17, - "character": 314 + "column": 17 }, "end": { "line": 23, - "column": 18, - "character": 315 + "column": 18 } } }, From 9486a2576aac841ba261de138ee7c4d7b379babe Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:51:09 -0500 Subject: [PATCH 22/29] WIP --- .../compiler/phases/1-parse/state/element.js | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 0625dff322aa..643e45ca8c44 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -127,41 +127,41 @@ export default function element(parser) { return; } - const { name, name_loc } = read_name(parser, regex_whitespace_or_slash_or_closing_tag); + const tag = read_tag(parser, regex_whitespace_or_slash_or_closing_tag); - if (name.startsWith('svelte:') && !meta_tags.has(name)) { - const bounds = { start: start + 1, end: start + 1 + name.length }; + if (tag.name.startsWith('svelte:') && !meta_tags.has(tag.name)) { + const bounds = { start: start + 1, end: start + 1 + tag.name.length }; e.svelte_meta_invalid_tag(bounds, list(Array.from(meta_tags.keys()))); } - if (!regex_valid_element_name.test(name) && !regex_valid_component_name.test(name)) { + if (!regex_valid_element_name.test(tag.name) && !regex_valid_component_name.test(tag.name)) { // in the middle of typing -> allow in loose mode - if (!parser.loose || !name.endsWith('.')) { - const bounds = { start: start + 1, end: start + 1 + name.length }; + if (!parser.loose || !tag.name.endsWith('.')) { + const bounds = { start: start + 1, end: start + 1 + tag.name.length }; e.tag_invalid_name(bounds); } } - if (root_only_meta_tags.has(name)) { - if (name in parser.meta_tags) { - e.svelte_meta_duplicate(start, name); + if (root_only_meta_tags.has(tag.name)) { + if (tag.name in parser.meta_tags) { + e.svelte_meta_duplicate(start, tag.name); } if (parent.type !== 'Root') { - e.svelte_meta_invalid_placement(start, name); + e.svelte_meta_invalid_placement(start, tag.name); } - parser.meta_tags[name] = true; + parser.meta_tags[tag.name] = true; } - const type = meta_tags.has(name) - ? meta_tags.get(name) - : regex_valid_component_name.test(name) || (parser.loose && name.endsWith('.')) + const type = meta_tags.has(tag.name) + ? meta_tags.get(tag.name) + : regex_valid_component_name.test(tag.name) || (parser.loose && tag.name.endsWith('.')) ? 'Component' - : name === 'title' && parent_is_head(parser.stack) + : tag.name === 'title' && parent_is_head(parser.stack) ? 'TitleElement' : // TODO Svelte 6/7: once slots are removed in favor of snippets, always keep slot as a regular element - name === 'slot' && !parent_is_shadowroot_template(parser.stack) + tag.name === 'slot' && !parent_is_shadowroot_template(parser.stack) ? 'SlotElement' : 'RegularElement'; @@ -172,8 +172,8 @@ export default function element(parser) { type, start, end: -1, - name, - name_loc, + name: tag.name, + name_loc: tag.loc, attributes: [], fragment: create_fragment(true), metadata: { @@ -189,8 +189,8 @@ export default function element(parser) { type, start, end: -1, - name, - name_loc, + name: tag.name, + name_loc: tag.loc, attributes: [], fragment: create_fragment(true), metadata: { @@ -200,14 +200,14 @@ export default function element(parser) { parser.allow_whitespace(); - if (parent.type === 'RegularElement' && closing_tag_omitted(parent.name, name)) { + if (parent.type === 'RegularElement' && closing_tag_omitted(parent.name, tag.name)) { const end = parent.fragment.nodes[0]?.start ?? start; - w.element_implicitly_closed({ start: parent.start, end }, `<${name}>`, ``); + w.element_implicitly_closed({ start: parent.start, end }, `<${tag.name}>`, ``); parent.end = start; parser.pop(); parser.last_auto_closed_tag = { tag: parent.name, - reason: name, + reason: tag.name, depth: parser.stack.length }; } @@ -217,7 +217,7 @@ export default function element(parser) { const current = parser.current(); const is_top_level_script_or_style = - (name === 'script' || name === 'style') && current.type === 'Root'; + (tag.name === 'script' || tag.name === 'style') && current.type === 'Root'; const read = is_top_level_script_or_style ? read_static_attribute : read_attribute; @@ -330,7 +330,7 @@ export default function element(parser) { } } - if (name === 'script') { + if (tag.name === 'script') { const content = read_script(parser, start, element.attributes); if (prev_comment) { // We take advantage of the fact that the root will never have leadingComments set, @@ -358,7 +358,7 @@ export default function element(parser) { parser.append(element); - const self_closing = parser.eat('/') || is_void(name); + const self_closing = parser.eat('/') || is_void(tag.name); const closed = parser.eat('>', true, false); // Loose parsing mode @@ -388,7 +388,7 @@ export default function element(parser) { if (self_closing || !closed) { // don't push self-closing elements onto the stack element.end = parser.index; - } else if (name === 'textarea') { + } else if (tag.name === 'textarea') { // special case element.fragment.nodes = read_sequence( parser, @@ -397,10 +397,10 @@ export default function element(parser) { ); parser.read(regex_closing_textarea_tag); element.end = parser.index; - } else if (name === 'script' || name === 'style') { + } else if (tag.name === 'script' || tag.name === 'style') { // special case const start = parser.index; - const data = parser.read_until(new RegExp(``)); + const data = parser.read_until(new RegExp(``)); const end = parser.index; /** @type {AST.Text} */ @@ -413,7 +413,7 @@ export default function element(parser) { }; element.fragment.nodes.push(node); - parser.eat(``, true); + parser.eat(``, true); element.end = parser.index; } else { parser.stack.push(element); @@ -861,7 +861,7 @@ function read_sequence(parser, done, location) { /** * @param {Parser} parser * @param {RegExp} regex - * @returns {Identifier & { start: number, end: number }} + * @returns {Identifier & { start: number, end: number, loc: SourceLocation }} */ function read_tag(parser, regex) { const start = parser.index; From cbb838a482f37f2bc71123d5b26155b4fd4cfbb2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 13:57:58 -0500 Subject: [PATCH 23/29] WIP --- .../compiler/phases/1-parse/state/element.js | 43 +++++-------------- 1 file changed, 10 insertions(+), 33 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 643e45ca8c44..7536757c9f28 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -579,20 +579,16 @@ function read_attribute(parser) { } } - const { name, name_loc } = read_name(parser, regex_token_ending_character); + const tag = read_tag(parser, regex_token_ending_character); - if (!name) return null; + if (!tag.name) return null; let end = parser.index; - const end_location = /** @type {Location} */ (locator(end)); - - name_loc.end.line = end_location.line; - name_loc.end.column = end_location.column; parser.allow_whitespace(); - const colon_index = name.indexOf(':'); - const type = colon_index !== -1 && get_directive_type(name.slice(0, colon_index)); + const colon_index = tag.name.indexOf(':'); + const type = colon_index !== -1 && get_directive_type(tag.name.slice(0, colon_index)); /** @type {true | AST.ExpressionTag | Array} */ let value = true; @@ -621,10 +617,10 @@ function read_attribute(parser) { } if (type) { - const [directive_name, ...modifiers] = name.slice(colon_index + 1).split('|'); + const [directive_name, ...modifiers] = tag.name.slice(colon_index + 1).split('|'); if (directive_name === '') { - e.directive_missing_name({ start, end: start + colon_index + 1 }, name); + e.directive_missing_name({ start, end: start + colon_index + 1 }, tag.name); } if (type === 'StyleDirective') { @@ -633,7 +629,7 @@ function read_attribute(parser) { end, type, name: directive_name, - name_loc, + name_loc: tag.loc, modifiers: /** @type {Array<'important'>} */ (modifiers), value, metadata: { @@ -664,7 +660,7 @@ function read_attribute(parser) { end, type, name: directive_name, - name_loc, + name_loc: tag.loc, expression, metadata: { expression: new ExpressionMetadata() @@ -675,7 +671,7 @@ function read_attribute(parser) { directive.modifiers = modifiers; if (directive.type === 'TransitionDirective') { - const direction = name.slice(0, colon_index); + const direction = tag.name.slice(0, colon_index); directive.intro = direction === 'in' || direction === 'transition'; directive.outro = direction === 'out' || direction === 'transition'; } @@ -696,7 +692,7 @@ function read_attribute(parser) { return directive; } - return create_attribute(name, name_loc, start, end, value); + return create_attribute(tag.name, tag.loc, start, end, value); } /** @@ -879,22 +875,3 @@ function read_tag(parser, regex) { } }; } - -/** - * - * @param {Parser} parser - * @param {RegExp} regex - */ -function read_name(parser, regex) { - const a = /** @type {Location} */ (locator(parser.index)); - const name = parser.read_until(regex); - const b = /** @type {Location} */ (locator(parser.index)); - - /** @type {SourceLocation} */ - const name_loc = { - start: { line: a.line, column: a.column }, - end: { line: b.line, column: b.column } - }; - - return { name, name_loc }; -} From 3d3e776c773b36531e3d79894a96daef0ca3120e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 14:38:05 -0500 Subject: [PATCH 24/29] WIP --- .../src/compiler/phases/1-parse/index.js | 3 +- packages/svelte/src/compiler/phases/nodes.js | 2 +- packages/svelte/src/compiler/state.js | 9 +- .../svelte/src/compiler/types/template.d.ts | 2 +- .../src/compiler/utils/compile_diagnostic.js | 4 +- .../samples/action-duplicate/output.json | 12 ++- .../samples/action-with-call/output.json | 6 +- .../action-with-identifier/output.json | 6 +- .../samples/action-with-literal/output.json | 6 +- .../parser-legacy/samples/action/output.json | 6 +- .../samples/animation/output.json | 12 ++- .../attribute-class-directive/output.json | 6 +- .../attribute-containing-solidus/output.json | 6 +- .../attribute-curly-bracket/output.json | 6 +- .../attribute-dynamic-boolean/output.json | 6 +- .../samples/attribute-dynamic/output.json | 6 +- .../samples/attribute-empty/output.json | 24 +++-- .../samples/attribute-escaped/output.json | 6 +- .../samples/attribute-multiple/output.json | 12 ++- .../samples/attribute-shorthand/output.json | 12 ++- .../attribute-static-boolean/output.json | 6 +- .../samples/attribute-static/output.json | 6 +- .../output.json | 6 +- .../output.json | 6 +- .../output.json | 42 +++++--- .../attribute-style-directive/output.json | 6 +- .../samples/attribute-style/output.json | 6 +- .../samples/attribute-unquoted/output.json | 18 ++-- .../attribute-with-whitespace/output.json | 6 +- .../samples/await-catch/output.json | 6 +- .../samples/await-then-catch/output.json | 12 ++- .../samples/binding-shorthand/output.json | 6 +- .../parser-legacy/samples/binding/output.json | 6 +- .../dynamic-element-string/output.json | 6 +- .../dynamic-element-variable/output.json | 6 +- .../samples/each-block-else/output.json | 6 +- .../samples/each-block-indexed/output.json | 6 +- .../samples/each-block-keyed/output.json | 6 +- .../samples/each-block/output.json | 6 +- .../output.json | 12 ++- .../element-with-attribute/output.json | 12 ++- .../samples/elements/output.json | 6 +- .../samples/event-handler/output.json | 6 +- .../samples/javascript-comments/output.json | 6 +- .../loose-invalid-expression/output.json | 66 ++++++++---- .../samples/loose-unclosed-block/output.json | 6 +- .../loose-unclosed-open-tag/output.json | 30 ++++-- .../samples/loose-unclosed-tag/output.json | 12 ++- .../no-error-if-before-closing/output.json | 12 ++- .../parser-legacy/samples/refs/output.json | 6 +- .../samples/self-reference/output.json | 6 +- .../samples/slotted-element/output.json | 6 +- .../transition-intro-no-params/output.json | 6 +- .../samples/transition-intro/output.json | 6 +- .../samples/unusual-identifier/output.json | 6 +- .../samples/attachments/output.json | 6 +- .../output.json | 12 ++- .../samples/comment-before-script/output.json | 6 +- .../samples/css-nth-syntax/output.json | 6 +- .../each-block-object-pattern/output.json | 18 ++-- .../samples/generic-snippets/output.json | 6 +- .../samples/if-block-else/output.json | 12 ++- .../samples/if-block-elseif/output.json | 12 ++- .../loose-invalid-expression/output.json | 102 ++++++++++++------ .../loose-unclosed-open-tag/output.json | 72 ++++++++----- .../samples/loose-unclosed-tag/output.json | 102 ++++++++++++------ .../samples/loose-valid-each-as/output.json | 12 ++- .../parser-modern/samples/options/output.json | 36 ++++--- .../semicolon-inside-quotes/output.json | 6 +- .../samples/snippets/output.json | 12 ++- .../samples/template-shadowroot/output.json | 48 ++++++--- .../typescript-in-event-handler/output.json | 18 ++-- packages/svelte/tests/parser-modern/test.ts | 2 + 73 files changed, 671 insertions(+), 341 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index a5d67c9a77ec..7b20507392be 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -1,4 +1,5 @@ /** @import { AST } from '#compiler' */ +/** @import { Location } from 'locate-character' */ /** @import * as ESTree from 'estree' */ // @ts-expect-error acorn type definitions are borked in the release we use import { isIdentifierStart, isIdentifierChar } from 'acorn'; @@ -220,7 +221,7 @@ export class Parser { } /** - * @returns {ESTree.Identifier & { start: number, end: number }} + * @returns {ESTree.Identifier & { start: number, end: number, loc: { start: Location, end: Location } }} */ read_id() { const start = this.index; diff --git a/packages/svelte/src/compiler/phases/nodes.js b/packages/svelte/src/compiler/phases/nodes.js index c9117c814b65..313880cf5b65 100644 --- a/packages/svelte/src/compiler/phases/nodes.js +++ b/packages/svelte/src/compiler/phases/nodes.js @@ -47,7 +47,7 @@ export function is_custom_element_node(node) { /** * @param {string} name - * @param {SourceLocation} name_loc + * @param {SourceLocation | null} name_loc * @param {number} start * @param {number} end * @param {AST.Attribute['value']} value diff --git a/packages/svelte/src/compiler/state.js b/packages/svelte/src/compiler/state.js index 5b18911ede07..37aeafe5952e 100644 --- a/packages/svelte/src/compiler/state.js +++ b/packages/svelte/src/compiler/state.js @@ -1,4 +1,4 @@ -/** @import { Position } from 'estree' */ +/** @import { Location } from 'locate-character' */ /** @import { CompileOptions } from './types' */ /** @import { AST, Warning } from '#compiler' */ import { getLocator } from 'locate-character'; @@ -40,7 +40,7 @@ export let dev; export let runes = false; -/** @type {(index: number) => Position} */ +/** @type {(index: number) => Location} */ export let locator; /** @param {string} value */ @@ -53,10 +53,7 @@ export function set_source(value) { const loc = l(i); if (!loc) throw new Error('An impossible situation occurred'); - return { - line: loc.line, - column: loc.column - }; + return loc; }; } diff --git a/packages/svelte/src/compiler/types/template.d.ts b/packages/svelte/src/compiler/types/template.d.ts index 52243261618e..b529a2dda9f6 100644 --- a/packages/svelte/src/compiler/types/template.d.ts +++ b/packages/svelte/src/compiler/types/template.d.ts @@ -532,7 +532,7 @@ export namespace AST { export interface BaseAttribute extends BaseNode { name: string; - name_loc: SourceLocation; + name_loc: SourceLocation | null; } export interface Attribute extends BaseAttribute { diff --git a/packages/svelte/src/compiler/utils/compile_diagnostic.js b/packages/svelte/src/compiler/utils/compile_diagnostic.js index fe22b9e8f23e..c5df49e01cee 100644 --- a/packages/svelte/src/compiler/utils/compile_diagnostic.js +++ b/packages/svelte/src/compiler/utils/compile_diagnostic.js @@ -67,8 +67,8 @@ export class CompileDiagnostic { if (position) { this.position = position; - this.start = { character: position[0], ...state.locator(position[0]) }; - this.end = { character: position[1], ...state.locator(position[1]) }; + this.start = state.locator(position[0]); + this.end = state.locator(position[1]); if (this.start && this.end) { this.frame = get_code_frame(state.source, this.start.line - 1, this.end.column); } diff --git a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json index 279bb27f426f..9a171547fe7d 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-duplicate/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 7 + "column": 7, + "character": 7 }, "end": { "line": 1, - "column": 20 + "column": 20, + "character": 20 } }, "expression": null, @@ -36,11 +38,13 @@ "name_loc": { "start": { "line": 1, - "column": 21 + "column": 21, + "character": 21 }, "end": { "line": 1, - "column": 34 + "column": 34, + "character": 34 } }, "expression": null, diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json index f1ca0947088a..f3242eba5eb4 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-call/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 7 + "column": 7, + "character": 7 }, "end": { "line": 1, - "column": 18 + "column": 18, + "character": 18 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json index 8356bb1512c7..8f76afc829cb 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-identifier/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 7 + "column": 7, + "character": 7 }, "end": { "line": 1, - "column": 18 + "column": 18, + "character": 18 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json index 086201476761..b6c4f2690d4f 100644 --- a/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action-with-literal/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 7 + "column": 7, + "character": 7 }, "end": { "line": 1, - "column": 18 + "column": 18, + "character": 18 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/action/output.json b/packages/svelte/tests/parser-legacy/samples/action/output.json index 261ebafcead4..a27177898586 100644 --- a/packages/svelte/tests/parser-legacy/samples/action/output.json +++ b/packages/svelte/tests/parser-legacy/samples/action/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 7 + "column": 7, + "character": 7 }, "end": { "line": 1, - "column": 20 + "column": 20, + "character": 20 } }, "expression": null, diff --git a/packages/svelte/tests/parser-legacy/samples/animation/output.json b/packages/svelte/tests/parser-legacy/samples/animation/output.json index 04d592998c55..262bb17d9a37 100644 --- a/packages/svelte/tests/parser-legacy/samples/animation/output.json +++ b/packages/svelte/tests/parser-legacy/samples/animation/output.json @@ -23,11 +23,13 @@ "name_loc": { "start": { "line": 2, - "column": 6 + "column": 6, + "character": 38 }, "end": { "line": 2, - "column": 18 + "column": 18, + "character": 50 } }, "expression": null, @@ -53,11 +55,13 @@ "loc": { "start": { "line": 1, - "column": 17 + "column": 17, + "character": 17 }, "end": { "line": 1, - "column": 22 + "column": 22, + "character": 22 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json index cccb455e9d49..bbf9c12ceba1 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-class-directive/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 14 + "column": 14, + "character": 14 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json index 8592e9dfefba..c1bcbbaf5eb8 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-containing-solidus/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 3 + "column": 3, + "character": 3 }, "end": { "line": 1, - "column": 7 + "column": 7, + "character": 7 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json index 8ea8a9bb1f3d..d84b63745cbb 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-curly-bracket/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 7 + "column": 7, + "character": 7 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json index 4889cd6c3953..13488a20d3db 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic-boolean/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 10 + "column": 10, + "character": 10 }, "end": { "line": 1, - "column": 18 + "column": 18, + "character": 18 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json index 609ce50416c0..088a9d01ab1d 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-dynamic/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json index 74b2e9010d2b..028b11077dc8 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-empty/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 6 + "column": 6, + "character": 6 } }, "value": [ @@ -43,11 +45,13 @@ "name_loc": { "start": { "line": 1, - "column": 10 + "column": 10, + "character": 10 }, "end": { "line": 1, - "column": 11 + "column": 11, + "character": 11 } }, "value": [ @@ -83,11 +87,13 @@ "name_loc": { "start": { "line": 1, - "column": 17 + "column": 17, + "character": 17 }, "end": { "line": 1, - "column": 18 + "column": 18, + "character": 18 } }, "value": [ @@ -108,11 +114,13 @@ "name_loc": { "start": { "line": 1, - "column": 22 + "column": 22, + "character": 22 }, "end": { "line": 1, - "column": 23 + "column": 23, + "character": 23 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json index de7c46862f3c..a23fcd55cd1a 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-escaped/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 13 + "column": 13, + "character": 13 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json index 87143ffe27b9..4e2bddf54ee9 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-multiple/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 7 + "column": 7, + "character": 7 } }, "value": [ @@ -43,11 +45,13 @@ "name_loc": { "start": { "line": 1, - "column": 12 + "column": 12, + "character": 12 }, "end": { "line": 1, - "column": 17 + "column": 17, + "character": 17 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json index aac7abf0e217..61121e436e3d 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-shorthand/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 8 + "column": 8, + "character": 8 } }, "value": [ @@ -38,11 +40,13 @@ "loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 8 + "column": 8, + "character": 8 } } } diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json index c29c854afbe6..1442a445d0ca 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-static-boolean/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 10 + "column": 10, + "character": 10 }, "end": { "line": 1, - "column": 18 + "column": 18, + "character": 18 } }, "value": true diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json index 6d1787b27f16..dbc2a4b79f97 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-static/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json index 9a9b3511c5d7..da8a11e48e43 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-modifiers/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 26 + "column": 26, + "character": 26 } }, "modifiers": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json index 1b35ef73a3b6..b54a6e91d70c 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-shorthand/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 16 + "column": 16, + "character": 16 } }, "modifiers": [], diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json index a94ea3235dad..f349e61ef73b 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive-string/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 16 + "column": 16, + "character": 16 } }, "modifiers": [], @@ -60,11 +62,13 @@ "name_loc": { "start": { "line": 2, - "column": 5 + "column": 5, + "character": 35 }, "end": { "line": 2, - "column": 16 + "column": 16, + "character": 46 } }, "modifiers": [], @@ -102,11 +106,13 @@ "name_loc": { "start": { "line": 3, - "column": 5 + "column": 5, + "character": 65 }, "end": { "line": 3, - "column": 16 + "column": 16, + "character": 76 } }, "modifiers": [], @@ -144,11 +150,13 @@ "name_loc": { "start": { "line": 4, - "column": 5 + "column": 5, + "character": 93 }, "end": { "line": 4, - "column": 16 + "column": 16, + "character": 104 } }, "modifiers": [], @@ -207,11 +215,13 @@ "name_loc": { "start": { "line": 5, - "column": 5 + "column": 5, + "character": 133 }, "end": { "line": 5, - "column": 16 + "column": 16, + "character": 144 } }, "modifiers": [], @@ -270,11 +280,13 @@ "name_loc": { "start": { "line": 6, - "column": 5 + "column": 5, + "character": 173 }, "end": { "line": 6, - "column": 16 + "column": 16, + "character": 184 } }, "modifiers": [], @@ -333,11 +345,13 @@ "name_loc": { "start": { "line": 7, - "column": 5 + "column": 5, + "character": 211 }, "end": { "line": 7, - "column": 16 + "column": 16, + "character": 222 } }, "modifiers": [], diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json index b0069753883d..34e899428ce2 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style-directive/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 16 + "column": 16, + "character": 16 } }, "modifiers": [], diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json index 9a9ce001fbf0..272c48d6ed32 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-style/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json index 9770c31ea373..fecbd9f2903b 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-unquoted/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ @@ -59,11 +61,13 @@ "name_loc": { "start": { "line": 2, - "column": 3 + "column": 3, + "character": 25 }, "end": { "line": 2, - "column": 7 + "column": 7, + "character": 29 } }, "value": [ @@ -108,11 +112,13 @@ "name_loc": { "start": { "line": 3, - "column": 3 + "column": 3, + "character": 44 }, "end": { "line": 3, - "column": 7 + "column": 7, + "character": 48 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json index 42ffd86e79e7..16cfcec195b9 100644 --- a/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json +++ b/packages/svelte/tests/parser-legacy/samples/attribute-with-whitespace/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 8 + "column": 8, + "character": 8 }, "end": { "line": 1, - "column": 16 + "column": 16, + "character": 16 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json index be11da5e98dc..1ac7f1773d48 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-catch/output.json @@ -33,11 +33,13 @@ "loc": { "start": { "line": 3, - "column": 8 + "column": 8, + "character": 47 }, "end": { "line": 3, - "column": 16 + "column": 16, + "character": 55 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json index 233a8dd5b299..df76eab8d3e9 100644 --- a/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json +++ b/packages/svelte/tests/parser-legacy/samples/await-then-catch/output.json @@ -32,11 +32,13 @@ "loc": { "start": { "line": 3, - "column": 7 + "column": 7, + "character": 46 }, "end": { "line": 3, - "column": 15 + "column": 15, + "character": 54 } } }, @@ -48,11 +50,13 @@ "loc": { "start": { "line": 5, - "column": 8 + "column": 8, + "character": 96 }, "end": { "line": 5, - "column": 16 + "column": 16, + "character": 104 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json index 3acfe5e49638..9c48025ff9b6 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding-shorthand/output.json @@ -25,11 +25,13 @@ "name_loc": { "start": { "line": 5, - "column": 8 + "column": 8, + "character": 38 }, "end": { "line": 5, - "column": 16 + "column": 16, + "character": 46 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/binding/output.json b/packages/svelte/tests/parser-legacy/samples/binding/output.json index f3198b5d2463..17a78f051c1f 100644 --- a/packages/svelte/tests/parser-legacy/samples/binding/output.json +++ b/packages/svelte/tests/parser-legacy/samples/binding/output.json @@ -25,11 +25,13 @@ "name_loc": { "start": { "line": 5, - "column": 7 + "column": 7, + "character": 38 }, "end": { "line": 5, - "column": 17 + "column": 17, + "character": 48 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json index b6866f95c4d1..4768501c46dd 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-element-string/output.json @@ -159,11 +159,13 @@ "name_loc": { "start": { "line": 7, - "column": 29 + "column": 29, + "character": 263 }, "end": { "line": 7, - "column": 34 + "column": 34, + "character": 268 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json b/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json index b9f480170e40..6d9a5c78ee28 100644 --- a/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json +++ b/packages/svelte/tests/parser-legacy/samples/dynamic-element-variable/output.json @@ -65,11 +65,13 @@ "name_loc": { "start": { "line": 2, - "column": 27 + "column": 27, + "character": 72 }, "end": { "line": 2, - "column": 32 + "column": 32, + "character": 77 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json index 2edcf3a8baa3..c8458f96f0a5 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-else/output.json @@ -48,11 +48,13 @@ "loc": { "start": { "line": 1, - "column": 18 + "column": 18, + "character": 18 }, "end": { "line": 1, - "column": 24 + "column": 24, + "character": 24 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json index 63a7973ede87..2ba41d56b890 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-indexed/output.json @@ -76,11 +76,13 @@ "loc": { "start": { "line": 1, - "column": 18 + "column": 18, + "character": 18 }, "end": { "line": 1, - "column": 24 + "column": 24, + "character": 24 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json index a154aabd0b17..569681506b89 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block-keyed/output.json @@ -48,11 +48,13 @@ "loc": { "start": { "line": 1, - "column": 16 + "column": 16, + "character": 16 }, "end": { "line": 1, - "column": 20 + "column": 20, + "character": 20 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/each-block/output.json b/packages/svelte/tests/parser-legacy/samples/each-block/output.json index 556c0de4daa9..c763dc6b8576 100644 --- a/packages/svelte/tests/parser-legacy/samples/each-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/each-block/output.json @@ -48,11 +48,13 @@ "loc": { "start": { "line": 1, - "column": 18 + "column": 18, + "character": 18 }, "end": { "line": 1, - "column": 24 + "column": 24, + "character": 24 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json index 460e452f59d1..2d6a4b752c90 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-attribute-empty-string/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ @@ -59,11 +61,13 @@ "name_loc": { "start": { "line": 2, - "column": 6 + "column": 6, + "character": 28 }, "end": { "line": 2, - "column": 10 + "column": 10, + "character": 32 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json b/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json index 2bd89c8e33d9..9fdb601b67fc 100644 --- a/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json +++ b/packages/svelte/tests/parser-legacy/samples/element-with-attribute/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 10 + "column": 10, + "character": 10 } }, "value": [ @@ -59,11 +61,13 @@ "name_loc": { "start": { "line": 2, - "column": 6 + "column": 6, + "character": 31 }, "end": { "line": 2, - "column": 10 + "column": 10, + "character": 35 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/elements/output.json b/packages/svelte/tests/parser-legacy/samples/elements/output.json index 177ebd4fbf40..afc49c56c332 100644 --- a/packages/svelte/tests/parser-legacy/samples/elements/output.json +++ b/packages/svelte/tests/parser-legacy/samples/elements/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 10 + "column": 10, + "character": 10 }, "end": { "line": 1, - "column": 14 + "column": 14, + "character": 14 } }, "value": true diff --git a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json index d7acecbf9f32..8b054a4289f8 100644 --- a/packages/svelte/tests/parser-legacy/samples/event-handler/output.json +++ b/packages/svelte/tests/parser-legacy/samples/event-handler/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 8 + "column": 8, + "character": 8 }, "end": { "line": 1, - "column": 16 + "column": 16, + "character": 16 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json index 8e74b15fdab5..4723564f174d 100644 --- a/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json +++ b/packages/svelte/tests/parser-legacy/samples/javascript-comments/output.json @@ -25,11 +25,13 @@ "name_loc": { "start": { "line": 34, - "column": 1 + "column": 1, + "character": 574 }, "end": { "line": 34, - "column": 9 + "column": 9, + "character": 582 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json index 2afeb7a3cab4..136c45fc6e52 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-expression/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 6 + "column": 6, + "character": 6 } }, "value": [ @@ -38,11 +40,13 @@ "loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 6 + "column": 6, + "character": 6 } } } @@ -73,11 +77,13 @@ "name_loc": { "start": { "line": 2, - "column": 5 + "column": 5, + "character": 20 }, "end": { "line": 2, - "column": 8 + "column": 8, + "character": 23 } }, "value": [ @@ -118,11 +124,13 @@ "name_loc": { "start": { "line": 4, - "column": 5 + "column": 5, + "character": 40 }, "end": { "line": 4, - "column": 8 + "column": 8, + "character": 43 } }, "value": [ @@ -163,11 +171,13 @@ "name_loc": { "start": { "line": 5, - "column": 5 + "column": 5, + "character": 61 }, "end": { "line": 5, - "column": 8 + "column": 8, + "character": 64 } }, "value": [ @@ -208,11 +218,13 @@ "name_loc": { "start": { "line": 6, - "column": 11 + "column": 11, + "character": 92 }, "end": { "line": 6, - "column": 18 + "column": 18, + "character": 99 } }, "value": [ @@ -253,11 +265,13 @@ "name_loc": { "start": { "line": 8, - "column": 7 + "column": 7, + "character": 122 }, "end": { "line": 8, - "column": 17 + "column": 17, + "character": 132 } }, "expression": { @@ -346,11 +360,13 @@ "loc": { "start": { "line": 15, - "column": 16 + "column": 16, + "character": 197 }, "end": { "line": 15, - "column": 20 + "column": 20, + "character": 201 } } }, @@ -397,11 +413,13 @@ "loc": { "start": { "line": 17, - "column": 15 + "column": 15, + "character": 234 }, "end": { "line": 17, - "column": 19 + "column": 19, + "character": 238 } } }, @@ -478,11 +496,13 @@ "loc": { "start": { "line": 21, - "column": 16 + "column": 16, + "character": 285 }, "end": { "line": 21, - "column": 17 + "column": 17, + "character": 286 } } }, @@ -535,11 +555,13 @@ "loc": { "start": { "line": 23, - "column": 17 + "column": 17, + "character": 314 }, "end": { "line": 23, - "column": 18 + "column": 18, + "character": 315 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json index 9f8325819044..37a46a48da4f 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-block/output.json @@ -244,11 +244,13 @@ "loc": { "start": { "line": 19, - "column": 12 + "column": 12, + "character": 138 }, "end": { "line": 19, - "column": 13 + "column": 13, + "character": 139 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json index 511deab335b4..9d5d0e7658d3 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-open-tag/output.json @@ -32,11 +32,13 @@ "name_loc": { "start": { "line": 2, - "column": 7 + "column": 7, + "character": 13 }, "end": { "line": 2, - "column": 10 + "column": 10, + "character": 16 } }, "value": [ @@ -103,11 +105,13 @@ "name_loc": { "start": { "line": 6, - "column": 7 + "column": 7, + "character": 44 }, "end": { "line": 6, - "column": 10 + "column": 10, + "character": 47 } }, "value": [ @@ -181,11 +185,13 @@ "name_loc": { "start": { "line": 10, - "column": 7 + "column": 7, + "character": 79 }, "end": { "line": 10, - "column": 10 + "column": 10, + "character": 82 } }, "value": [ @@ -259,11 +265,13 @@ "name_loc": { "start": { "line": 14, - "column": 7 + "column": 7, + "character": 113 }, "end": { "line": 14, - "column": 10 + "column": 10, + "character": 116 } }, "value": [ @@ -360,11 +368,13 @@ "name_loc": { "start": { "line": 20, - "column": 5 + "column": 5, + "character": 161 }, "end": { "line": 20, - "column": 8 + "column": 8, + "character": 164 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json index 721dd970bbdc..1ff3342de08d 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-unclosed-tag/output.json @@ -71,11 +71,13 @@ "name_loc": { "start": { "line": 6, - "column": 7 + "column": 7, + "character": 35 }, "end": { "line": 6, - "column": 10 + "column": 10, + "character": 38 } }, "value": [ @@ -288,11 +290,13 @@ "name_loc": { "start": { "line": 26, - "column": 7 + "column": 7, + "character": 159 }, "end": { "line": 26, - "column": 10 + "column": 10, + "character": 162 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json index ca62e4819759..de12cffd86ae 100644 --- a/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json +++ b/packages/svelte/tests/parser-legacy/samples/no-error-if-before-closing/output.json @@ -123,11 +123,13 @@ "loc": { "start": { "line": 13, - "column": 7 + "column": 7, + "character": 97 }, "end": { "line": 13, - "column": 8 + "column": 8, + "character": 98 } } }, @@ -221,11 +223,13 @@ "loc": { "start": { "line": 18, - "column": 7 + "column": 7, + "character": 137 }, "end": { "line": 18, - "column": 8 + "column": 8, + "character": 138 } } }, diff --git a/packages/svelte/tests/parser-legacy/samples/refs/output.json b/packages/svelte/tests/parser-legacy/samples/refs/output.json index da8f21910f5b..7f30946fc58b 100644 --- a/packages/svelte/tests/parser-legacy/samples/refs/output.json +++ b/packages/svelte/tests/parser-legacy/samples/refs/output.json @@ -25,11 +25,13 @@ "name_loc": { "start": { "line": 5, - "column": 8 + "column": 8, + "character": 38 }, "end": { "line": 5, - "column": 17 + "column": 17, + "character": 47 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/self-reference/output.json b/packages/svelte/tests/parser-legacy/samples/self-reference/output.json index 5e33f9f3487a..1ca684931b6e 100644 --- a/packages/svelte/tests/parser-legacy/samples/self-reference/output.json +++ b/packages/svelte/tests/parser-legacy/samples/self-reference/output.json @@ -72,11 +72,13 @@ "name_loc": { "start": { "line": 2, - "column": 14 + "column": 14, + "character": 30 }, "end": { "line": 2, - "column": 19 + "column": 19, + "character": 35 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json b/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json index 488051f19c79..caa0b86c4546 100644 --- a/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json +++ b/packages/svelte/tests/parser-legacy/samples/slotted-element/output.json @@ -25,11 +25,13 @@ "name_loc": { "start": { "line": 1, - "column": 16 + "column": 16, + "character": 16 }, "end": { "line": 1, - "column": 20 + "column": 20, + "character": 20 } }, "value": [ diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json index 6b48a54861e4..9f0d007cc85f 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro-no-params/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 12 + "column": 12, + "character": 12 } }, "expression": null, diff --git a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json index 5a1e30b9f1dc..61b4afbc133f 100644 --- a/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json +++ b/packages/svelte/tests/parser-legacy/samples/transition-intro/output.json @@ -18,11 +18,13 @@ "name_loc": { "start": { "line": 1, - "column": 5 + "column": 5, + "character": 5 }, "end": { "line": 1, - "column": 13 + "column": 13, + "character": 13 } }, "expression": { diff --git a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json index f97c30bcc071..da5555a7776d 100644 --- a/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json +++ b/packages/svelte/tests/parser-legacy/samples/unusual-identifier/output.json @@ -48,11 +48,13 @@ "loc": { "start": { "line": 1, - "column": 17 + "column": 17, + "character": 17 }, "end": { "line": 1, - "column": 19 + "column": 19, + "character": 19 } } }, diff --git a/packages/svelte/tests/parser-modern/samples/attachments/output.json b/packages/svelte/tests/parser-modern/samples/attachments/output.json index 86429b84f544..d37fec7beb75 100644 --- a/packages/svelte/tests/parser-modern/samples/attachments/output.json +++ b/packages/svelte/tests/parser-modern/samples/attachments/output.json @@ -15,11 +15,13 @@ "name_loc": { "start": { "line": 1, - "column": 1 + "column": 1, + "character": 1 }, "end": { "line": 1, - "column": 4 + "column": 4, + "character": 4 } }, "attributes": [ diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json index 36aa9e301175..b26ee2866fcc 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-function-binding/output.json @@ -22,11 +22,13 @@ "name_loc": { "start": { "line": 5, - "column": 1 + "column": 1, + "character": 38 }, "end": { "line": 5, - "column": 6 + "column": 6, + "character": 43 } }, "attributes": [ @@ -38,11 +40,13 @@ "name_loc": { "start": { "line": 5, - "column": 7 + "column": 7, + "character": 44 }, "end": { "line": 5, - "column": 17 + "column": 17, + "character": 54 } }, "expression": { diff --git a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json index 3cd6fe4c3355..827ad85d92f8 100644 --- a/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json +++ b/packages/svelte/tests/parser-modern/samples/comment-before-script/output.json @@ -141,11 +141,13 @@ "name_loc": { "start": { "line": 2, - "column": 8 + "column": 8, + "character": 36 }, "end": { "line": 2, - "column": 12 + "column": 12, + "character": 40 } }, "value": [ diff --git a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json index 781dfaf4de6e..26b4998587da 100644 --- a/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json +++ b/packages/svelte/tests/parser-modern/samples/css-nth-syntax/output.json @@ -1100,11 +1100,13 @@ "name_loc": { "start": { "line": 46, - "column": 1 + "column": 1, + "character": 809 }, "end": { "line": 46, - "column": 3 + "column": 3, + "character": 811 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json index 096fab2f640d..7e2fe09ea2cd 100644 --- a/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json +++ b/packages/svelte/tests/parser-modern/samples/each-block-object-pattern/output.json @@ -45,11 +45,13 @@ "name_loc": { "start": { "line": 2, - "column": 2 + "column": 2, + "character": 42 }, "end": { "line": 2, - "column": 3 + "column": 3, + "character": 43 } }, "attributes": [], @@ -363,11 +365,13 @@ "name_loc": { "start": { "line": 6, - "column": 2 + "column": 2, + "character": 156 }, "end": { "line": 6, - "column": 3 + "column": 3, + "character": 157 } }, "attributes": [], @@ -772,11 +776,13 @@ "name_loc": { "start": { "line": 10, - "column": 2 + "column": 2, + "character": 292 }, "end": { "line": 10, - "column": 3 + "column": 3, + "character": 293 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json index d8d48faa1f6c..521bf10b28c6 100644 --- a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json @@ -287,11 +287,13 @@ "name_loc": { "start": { "line": 1, - "column": 8 + "column": 8, + "character": 8 }, "end": { "line": 1, - "column": 12 + "column": 12, + "character": 12 } }, "value": [ diff --git a/packages/svelte/tests/parser-modern/samples/if-block-else/output.json b/packages/svelte/tests/parser-modern/samples/if-block-else/output.json index e8e6cbaea6d2..13b56db9de0e 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block-else/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block-else/output.json @@ -46,11 +46,13 @@ "name_loc": { "start": { "line": 2, - "column": 2 + "column": 2, + "character": 12 }, "end": { "line": 2, - "column": 3 + "column": 3, + "character": 13 } }, "attributes": [], @@ -94,11 +96,13 @@ "name_loc": { "start": { "line": 4, - "column": 2 + "column": 2, + "character": 32 }, "end": { "line": 4, - "column": 3 + "column": 3, + "character": 33 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json b/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json index 2c8186a300f7..fb00488f3137 100644 --- a/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json +++ b/packages/svelte/tests/parser-modern/samples/if-block-elseif/output.json @@ -79,11 +79,13 @@ "name_loc": { "start": { "line": 2, - "column": 2 + "column": 2, + "character": 15 }, "end": { "line": 2, - "column": 3 + "column": 3, + "character": 16 } }, "attributes": [], @@ -184,11 +186,13 @@ "name_loc": { "start": { "line": 4, - "column": 2 + "column": 2, + "character": 61 }, "end": { "line": 4, - "column": 3 + "column": 3, + "character": 62 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json index 61edc503d3ba..593aebe2791e 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-expression/output.json @@ -15,11 +15,13 @@ "name_loc": { "start": { "line": 1, - "column": 1 + "column": 1, + "character": 1 }, "end": { "line": 1, - "column": 4 + "column": 4, + "character": 4 } }, "attributes": [ @@ -31,11 +33,13 @@ "name_loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 6 + "column": 6, + "character": 6 } }, "value": { @@ -50,11 +54,13 @@ "loc": { "start": { "line": 1, - "column": 6 + "column": 6, + "character": 6 }, "end": { "line": 1, - "column": 6 + "column": 6, + "character": 6 } } } @@ -81,11 +87,13 @@ "name_loc": { "start": { "line": 2, - "column": 1 + "column": 1, + "character": 16 }, "end": { "line": 2, - "column": 4 + "column": 4, + "character": 19 } }, "attributes": [ @@ -97,11 +105,13 @@ "name_loc": { "start": { "line": 2, - "column": 5 + "column": 5, + "character": 20 }, "end": { "line": 2, - "column": 8 + "column": 8, + "character": 23 } }, "value": { @@ -137,11 +147,13 @@ "name_loc": { "start": { "line": 4, - "column": 1 + "column": 1, + "character": 36 }, "end": { "line": 4, - "column": 4 + "column": 4, + "character": 39 } }, "attributes": [ @@ -153,11 +165,13 @@ "name_loc": { "start": { "line": 4, - "column": 5 + "column": 5, + "character": 40 }, "end": { "line": 4, - "column": 8 + "column": 8, + "character": 43 } }, "value": { @@ -193,11 +207,13 @@ "name_loc": { "start": { "line": 5, - "column": 1 + "column": 1, + "character": 57 }, "end": { "line": 5, - "column": 4 + "column": 4, + "character": 60 } }, "attributes": [ @@ -209,11 +225,13 @@ "name_loc": { "start": { "line": 5, - "column": 5 + "column": 5, + "character": 61 }, "end": { "line": 5, - "column": 8 + "column": 8, + "character": 64 } }, "value": { @@ -249,11 +267,13 @@ "name_loc": { "start": { "line": 6, - "column": 1 + "column": 1, + "character": 82 }, "end": { "line": 6, - "column": 10 + "column": 10, + "character": 91 } }, "attributes": [ @@ -265,11 +285,13 @@ "name_loc": { "start": { "line": 6, - "column": 11 + "column": 11, + "character": 92 }, "end": { "line": 6, - "column": 18 + "column": 18, + "character": 99 } }, "value": { @@ -305,11 +327,13 @@ "name_loc": { "start": { "line": 8, - "column": 1 + "column": 1, + "character": 116 }, "end": { "line": 8, - "column": 6 + "column": 6, + "character": 121 } }, "attributes": [ @@ -321,11 +345,13 @@ "name_loc": { "start": { "line": 8, - "column": 7 + "column": 7, + "character": 122 }, "end": { "line": 8, - "column": 17 + "column": 17, + "character": 132 } }, "expression": { @@ -441,11 +467,13 @@ "loc": { "start": { "line": 15, - "column": 16 + "column": 16, + "character": 197 }, "end": { "line": 15, - "column": 20 + "column": 20, + "character": 201 } } }, @@ -485,11 +513,13 @@ "loc": { "start": { "line": 17, - "column": 15 + "column": 15, + "character": 234 }, "end": { "line": 17, - "column": 19 + "column": 19, + "character": 238 } } } @@ -545,11 +575,13 @@ "loc": { "start": { "line": 21, - "column": 16 + "column": 16, + "character": 285 }, "end": { "line": 21, - "column": 17 + "column": 17, + "character": 286 } } }, @@ -587,11 +619,13 @@ "loc": { "start": { "line": 23, - "column": 17 + "column": 17, + "character": 314 }, "end": { "line": 23, - "column": 18 + "column": 18, + "character": 315 } } }, diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json index 166d8221fbcc..b614e0391dc9 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-open-tag/output.json @@ -15,11 +15,13 @@ "name_loc": { "start": { "line": 1, - "column": 1 + "column": 1, + "character": 1 }, "end": { "line": 1, - "column": 4 + "column": 4, + "character": 4 } }, "attributes": [], @@ -41,11 +43,13 @@ "name_loc": { "start": { "line": 2, - "column": 2 + "column": 2, + "character": 8 }, "end": { "line": 2, - "column": 6 + "column": 6, + "character": 12 } }, "attributes": [ @@ -57,11 +61,13 @@ "name_loc": { "start": { "line": 2, - "column": 7 + "column": 7, + "character": 13 }, "end": { "line": 2, - "column": 10 + "column": 10, + "character": 16 } }, "value": { @@ -110,11 +116,13 @@ "name_loc": { "start": { "line": 5, - "column": 1 + "column": 1, + "character": 32 }, "end": { "line": 5, - "column": 4 + "column": 4, + "character": 35 } }, "attributes": [], @@ -136,11 +144,13 @@ "name_loc": { "start": { "line": 6, - "column": 2 + "column": 2, + "character": 39 }, "end": { "line": 6, - "column": 6 + "column": 6, + "character": 43 } }, "attributes": [ @@ -152,11 +162,13 @@ "name_loc": { "start": { "line": 6, - "column": 7 + "column": 7, + "character": 44 }, "end": { "line": 6, - "column": 10 + "column": 10, + "character": 47 } }, "value": { @@ -236,11 +248,13 @@ "name_loc": { "start": { "line": 10, - "column": 2 + "column": 2, + "character": 74 }, "end": { "line": 10, - "column": 6 + "column": 6, + "character": 78 } }, "attributes": [ @@ -252,11 +266,13 @@ "name_loc": { "start": { "line": 10, - "column": 7 + "column": 7, + "character": 79 }, "end": { "line": 10, - "column": 10 + "column": 10, + "character": 82 } }, "value": { @@ -337,11 +353,13 @@ "name_loc": { "start": { "line": 14, - "column": 2 + "column": 2, + "character": 108 }, "end": { "line": 14, - "column": 6 + "column": 6, + "character": 112 } }, "attributes": [ @@ -353,11 +371,13 @@ "name_loc": { "start": { "line": 14, - "column": 7 + "column": 7, + "character": 113 }, "end": { "line": 14, - "column": 10 + "column": 10, + "character": 116 } }, "value": { @@ -477,11 +497,13 @@ "name_loc": { "start": { "line": 20, - "column": 1 + "column": 1, + "character": 157 }, "end": { "line": 20, - "column": 4 + "column": 4, + "character": 160 } }, "attributes": [ @@ -493,11 +515,13 @@ "name_loc": { "start": { "line": 20, - "column": 5 + "column": 5, + "character": 161 }, "end": { "line": 20, - "column": 8 + "column": 8, + "character": 164 } }, "value": { diff --git a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json index e1e5b4699bd5..59bff2ff80e0 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-unclosed-tag/output.json @@ -15,11 +15,13 @@ "name_loc": { "start": { "line": 1, - "column": 1 + "column": 1, + "character": 1 }, "end": { "line": 1, - "column": 4 + "column": 4, + "character": 4 } }, "attributes": [], @@ -41,11 +43,13 @@ "name_loc": { "start": { "line": 2, - "column": 2 + "column": 2, + "character": 8 }, "end": { "line": 2, - "column": 6 + "column": 6, + "character": 12 } }, "attributes": [], @@ -80,11 +84,13 @@ "name_loc": { "start": { "line": 5, - "column": 1 + "column": 1, + "character": 23 }, "end": { "line": 5, - "column": 4 + "column": 4, + "character": 26 } }, "attributes": [], @@ -106,11 +112,13 @@ "name_loc": { "start": { "line": 6, - "column": 2 + "column": 2, + "character": 30 }, "end": { "line": 6, - "column": 6 + "column": 6, + "character": 34 } }, "attributes": [ @@ -122,11 +130,13 @@ "name_loc": { "start": { "line": 6, - "column": 7 + "column": 7, + "character": 35 }, "end": { "line": 6, - "column": 10 + "column": 10, + "character": 38 } }, "value": { @@ -175,11 +185,13 @@ "name_loc": { "start": { "line": 9, - "column": 1 + "column": 1, + "character": 54 }, "end": { "line": 9, - "column": 4 + "column": 4, + "character": 57 } }, "attributes": [], @@ -201,11 +213,13 @@ "name_loc": { "start": { "line": 10, - "column": 2 + "column": 2, + "character": 61 }, "end": { "line": 10, - "column": 6 + "column": 6, + "character": 65 } }, "attributes": [], @@ -232,11 +246,13 @@ "name_loc": { "start": { "line": 13, - "column": 1 + "column": 1, + "character": 75 }, "end": { "line": 13, - "column": 4 + "column": 4, + "character": 78 } }, "attributes": [], @@ -258,11 +274,13 @@ "name_loc": { "start": { "line": 14, - "column": 2 + "column": 2, + "character": 82 }, "end": { "line": 14, - "column": 7 + "column": 7, + "character": 87 } }, "attributes": [], @@ -289,11 +307,13 @@ "name_loc": { "start": { "line": 17, - "column": 1 + "column": 1, + "character": 97 }, "end": { "line": 17, - "column": 4 + "column": 4, + "character": 100 } }, "attributes": [], @@ -315,11 +335,13 @@ "name_loc": { "start": { "line": 18, - "column": 2 + "column": 2, + "character": 104 }, "end": { "line": 18, - "column": 7 + "column": 7, + "character": 109 } }, "attributes": [], @@ -377,11 +399,13 @@ "name_loc": { "start": { "line": 22, - "column": 2 + "column": 2, + "character": 130 }, "end": { "line": 22, - "column": 5 + "column": 5, + "character": 133 } }, "attributes": [], @@ -448,11 +472,13 @@ "name_loc": { "start": { "line": 26, - "column": 2 + "column": 2, + "character": 154 }, "end": { "line": 26, - "column": 6 + "column": 6, + "character": 158 } }, "attributes": [ @@ -464,11 +490,13 @@ "name_loc": { "start": { "line": 26, - "column": 7 + "column": 7, + "character": 159 }, "end": { "line": 26, - "column": 10 + "column": 10, + "character": 162 } }, "value": { @@ -518,11 +546,13 @@ "name_loc": { "start": { "line": 29, - "column": 1 + "column": 1, + "character": 177 }, "end": { "line": 29, - "column": 4 + "column": 4, + "character": 180 } }, "attributes": [], @@ -544,11 +574,13 @@ "name_loc": { "start": { "line": 30, - "column": 1 + "column": 1, + "character": 183 }, "end": { "line": 30, - "column": 2 + "column": 2, + "character": 184 } }, "attributes": [], @@ -580,11 +612,13 @@ "name_loc": { "start": { "line": 32, - "column": 1 + "column": 1, + "character": 194 }, "end": { "line": 32, - "column": 11 + "column": 11, + "character": 204 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json index 1145911a4461..6096907d5d9d 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-valid-each-as/output.json @@ -52,11 +52,13 @@ "name_loc": { "start": { "line": 6, - "column": 2 + "column": 2, + "character": 87 }, "end": { "line": 6, - "column": 5 + "column": 5, + "character": 90 } }, "attributes": [], @@ -306,11 +308,13 @@ "name_loc": { "start": { "line": 1, - "column": 8 + "column": 8, + "character": 8 }, "end": { "line": 1, - "column": 12 + "column": 12, + "character": 12 } }, "value": [ diff --git a/packages/svelte/tests/parser-modern/samples/options/output.json b/packages/svelte/tests/parser-modern/samples/options/output.json index a33f3b3f61d4..62c9fc1b9d52 100644 --- a/packages/svelte/tests/parser-modern/samples/options/output.json +++ b/packages/svelte/tests/parser-modern/samples/options/output.json @@ -35,11 +35,13 @@ "name_loc": { "start": { "line": 1, - "column": 16 + "column": 16, + "character": 16 }, "end": { "line": 1, - "column": 29 + "column": 29, + "character": 29 } }, "value": [ @@ -60,11 +62,13 @@ "name_loc": { "start": { "line": 1, - "column": 50 + "column": 50, + "character": 50 }, "end": { "line": 1, - "column": 55 + "column": 55, + "character": 55 } }, "value": { @@ -127,11 +131,13 @@ "name_loc": { "start": { "line": 3, - "column": 8 + "column": 8, + "character": 75 }, "end": { "line": 3, - "column": 14 + "column": 14, + "character": 81 } }, "value": true @@ -144,11 +150,13 @@ "name_loc": { "start": { "line": 3, - "column": 15 + "column": 15, + "character": 82 }, "end": { "line": 3, - "column": 19 + "column": 19, + "character": 86 } }, "value": [ @@ -194,11 +202,13 @@ "name_loc": { "start": { "line": 6, - "column": 8 + "column": 8, + "character": 112 }, "end": { "line": 6, - "column": 12 + "column": 12, + "character": 116 } }, "value": [ @@ -219,11 +229,13 @@ "name_loc": { "start": { "line": 6, - "column": 18 + "column": 18, + "character": 122 }, "end": { "line": 6, - "column": 26 + "column": 26, + "character": 130 } }, "value": [ diff --git a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json index c25f70b0cb06..e95ccb409495 100644 --- a/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json +++ b/packages/svelte/tests/parser-modern/samples/semicolon-inside-quotes/output.json @@ -90,11 +90,13 @@ "name_loc": { "start": { "line": 1, - "column": 1 + "column": 1, + "character": 1 }, "end": { "line": 1, - "column": 3 + "column": 3, + "character": 3 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json index cfbc1f4fee1d..52f43b66c4df 100644 --- a/packages/svelte/tests/parser-modern/samples/snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json @@ -90,11 +90,13 @@ "name_loc": { "start": { "line": 4, - "column": 2 + "column": 2, + "character": 59 }, "end": { "line": 4, - "column": 3 + "column": 3, + "character": 60 } }, "attributes": [], @@ -231,11 +233,13 @@ "name_loc": { "start": { "line": 1, - "column": 8 + "column": 8, + "character": 8 }, "end": { "line": 1, - "column": 12 + "column": 12, + "character": 12 } }, "value": [ diff --git a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json index 0cd406e77165..2cc1dc498896 100644 --- a/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json +++ b/packages/svelte/tests/parser-modern/samples/template-shadowroot/output.json @@ -15,11 +15,13 @@ "name_loc": { "start": { "line": 1, - "column": 1 + "column": 1, + "character": 1 }, "end": { "line": 1, - "column": 9 + "column": 9, + "character": 9 } }, "attributes": [ @@ -31,11 +33,13 @@ "name_loc": { "start": { "line": 1, - "column": 10 + "column": 10, + "character": 10 }, "end": { "line": 1, - "column": 24 + "column": 24, + "character": 24 } }, "value": [ @@ -67,11 +71,13 @@ "name_loc": { "start": { "line": 2, - "column": 2 + "column": 2, + "character": 35 }, "end": { "line": 2, - "column": 3 + "column": 3, + "character": 36 } }, "attributes": [], @@ -86,11 +92,13 @@ "name_loc": { "start": { "line": 2, - "column": 5 + "column": 5, + "character": 38 }, "end": { "line": 2, - "column": 9 + "column": 9, + "character": 42 } }, "attributes": [], @@ -127,11 +135,13 @@ "name_loc": { "start": { "line": 4, - "column": 1 + "column": 1, + "character": 68 }, "end": { "line": 4, - "column": 9 + "column": 9, + "character": 76 } }, "attributes": [], @@ -153,11 +163,13 @@ "name_loc": { "start": { "line": 5, - "column": 2 + "column": 2, + "character": 80 }, "end": { "line": 5, - "column": 3 + "column": 3, + "character": 81 } }, "attributes": [], @@ -172,11 +184,13 @@ "name_loc": { "start": { "line": 5, - "column": 5 + "column": 5, + "character": 83 }, "end": { "line": 5, - "column": 9 + "column": 9, + "character": 87 } }, "attributes": [], @@ -213,11 +227,13 @@ "name_loc": { "start": { "line": 7, - "column": 1 + "column": 1, + "character": 113 }, "end": { "line": 7, - "column": 5 + "column": 5, + "character": 117 } }, "attributes": [], diff --git a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json index 36b3e8a3ee6c..4281d6fa4615 100644 --- a/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json +++ b/packages/svelte/tests/parser-modern/samples/typescript-in-event-handler/output.json @@ -22,11 +22,13 @@ "name_loc": { "start": { "line": 5, - "column": 1 + "column": 1, + "character": 55 }, "end": { "line": 5, - "column": 7 + "column": 7, + "character": 61 } }, "attributes": [ @@ -38,11 +40,13 @@ "name_loc": { "start": { "line": 6, - "column": 1 + "column": 1, + "character": 63 }, "end": { "line": 6, - "column": 9 + "column": 9, + "character": 71 } }, "expression": { @@ -508,11 +512,13 @@ "name_loc": { "start": { "line": 1, - "column": 8 + "column": 8, + "character": 8 }, "end": { "line": 1, - "column": 12 + "column": 12, + "character": 12 } }, "value": [ diff --git a/packages/svelte/tests/parser-modern/test.ts b/packages/svelte/tests/parser-modern/test.ts index f0088532002e..fb762e89e19e 100644 --- a/packages/svelte/tests/parser-modern/test.ts +++ b/packages/svelte/tests/parser-modern/test.ts @@ -136,10 +136,12 @@ it('Strips BOM from the input', () => { }, name_loc: { end: { + character: 4, column: 4, line: 1 }, start: { + character: 1, column: 1, line: 1 } From 5567e1efd13f4da5285948969e7735594aba1e29 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 15:03:07 -0500 Subject: [PATCH 25/29] WIP --- .../src/compiler/phases/1-parse/index.js | 26 ----------------- .../src/compiler/phases/1-parse/state/tag.js | 21 ++++---------- .../samples/generic-snippets/output.json | 28 +++++++++++++++++-- .../samples/loose-invalid-block/output.json | 28 +++++++++++++++++-- .../samples/generic-snippets/output.json | 28 +++++++++++++++++-- .../samples/loose-invalid-block/output.json | 28 +++++++++++++++++-- .../samples/snippets/output.json | 14 +++++++++- 7 files changed, 122 insertions(+), 51 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 7b20507392be..27ff848ad321 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -261,32 +261,6 @@ export class Parser { }; } - read_identifier() { - const start = this.index; - - let i = this.index; - - const code = /** @type {number} */ (this.template.codePointAt(i)); - if (!isIdentifierStart(code, true)) return null; - - i += code <= 0xffff ? 1 : 2; - - while (i < this.template.length) { - const code = /** @type {number} */ (this.template.codePointAt(i)); - - if (!isIdentifierChar(code, true)) break; - i += code <= 0xffff ? 1 : 2; - } - - const identifier = this.template.slice(this.index, (this.index = i)); - - if (is_reserved(identifier)) { - e.unexpected_reserved_word(start, identifier); - } - - return identifier; - } - /** @param {RegExp} pattern */ read_until(pattern) { if (this.index >= this.template.length) { 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 e6e083c09dc7..53b538c15523 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -177,7 +177,7 @@ function open(parser) { if (parser.eat(',')) { parser.allow_whitespace(); - index = parser.read_identifier(); + index = parser.read_id().name; if (!index) { e.expected_identifier(parser.index); } @@ -347,16 +347,10 @@ function open(parser) { if (parser.eat('snippet')) { parser.require_whitespace(); - const name_start = parser.index; - let name = parser.read_identifier(); - const name_end = parser.index; + const id = parser.read_id(); - if (name === null) { - if (parser.loose) { - name = ''; - } else { - e.expected_identifier(parser.index); - } + if (id.name === '' && !parser.loose) { + e.expected_identifier(parser.index); } parser.allow_whitespace(); @@ -415,12 +409,7 @@ function open(parser) { type: 'SnippetBlock', start, end: -1, - expression: { - type: 'Identifier', - start: name_start, - end: name_end, - name - }, + expression: id, typeParams: type_params, parameters: function_expression.params, body: create_fragment(), diff --git a/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json b/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json index 37fb499e7b0f..9cb5d765e875 100644 --- a/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-legacy/samples/generic-snippets/output.json @@ -17,9 +17,21 @@ "end": 92, "expression": { "type": "Identifier", + "name": "generic", "start": 40, "end": 47, - "name": "generic" + "loc": { + "start": { + "line": 4, + "column": 10, + "character": 40 + }, + "end": { + "line": 4, + "column": 17, + "character": 47 + } + } }, "parameters": [ { @@ -123,9 +135,21 @@ "end": 192, "expression": { "type": "Identifier", + "name": "complex_generic", "start": 104, "end": 119, - "name": "complex_generic" + "loc": { + "start": { + "line": 8, + "column": 10, + "character": 104 + }, + "end": { + "line": 8, + "column": 25, + "character": 119 + } + } }, "parameters": [ { diff --git a/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json b/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json index 480fcf2edcf7..c4d0dd4aa470 100644 --- a/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json +++ b/packages/svelte/tests/parser-legacy/samples/loose-invalid-block/output.json @@ -75,9 +75,21 @@ "end": 75, "expression": { "type": "Identifier", + "name": "", "start": 63, "end": 63, - "name": "" + "loc": { + "start": { + "line": 9, + "column": 10, + "character": 63 + }, + "end": { + "line": 9, + "column": 10, + "character": 63 + } + } }, "parameters": [], "children": [] @@ -95,9 +107,21 @@ "end": 102, "expression": { "type": "Identifier", + "name": "foo", "start": 87, "end": 90, - "name": "foo" + "loc": { + "start": { + "line": 12, + "column": 10, + "character": 87 + }, + "end": { + "line": 12, + "column": 13, + "character": 90 + } + } }, "parameters": [], "children": [] diff --git a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json index 521bf10b28c6..5a0e64894ddf 100644 --- a/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/generic-snippets/output.json @@ -20,9 +20,21 @@ "end": 92, "expression": { "type": "Identifier", + "name": "generic", "start": 40, "end": 47, - "name": "generic" + "loc": { + "start": { + "line": 4, + "column": 10, + "character": 40 + }, + "end": { + "line": 4, + "column": 17, + "character": 47 + } + } }, "typeParams": "T extends string", "parameters": [ @@ -143,9 +155,21 @@ "end": 192, "expression": { "type": "Identifier", + "name": "complex_generic", "start": 104, "end": 119, - "name": "complex_generic" + "loc": { + "start": { + "line": 8, + "column": 10, + "character": 104 + }, + "end": { + "line": 8, + "column": 25, + "character": 119 + } + } }, "typeParams": "T extends { bracket: \"<\" } | \"<\" | Set<\"<>\">", "parameters": [ diff --git a/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json b/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json index 46aad16b2169..69fc7a0c81f2 100644 --- a/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json +++ b/packages/svelte/tests/parser-modern/samples/loose-invalid-block/output.json @@ -116,9 +116,21 @@ "end": 75, "expression": { "type": "Identifier", + "name": "", "start": 63, "end": 63, - "name": "" + "loc": { + "start": { + "line": 9, + "column": 10, + "character": 63 + }, + "end": { + "line": 9, + "column": 10, + "character": 63 + } + } }, "parameters": [], "body": { @@ -147,9 +159,21 @@ "end": 102, "expression": { "type": "Identifier", + "name": "foo", "start": 87, "end": 90, - "name": "foo" + "loc": { + "start": { + "line": 12, + "column": 10, + "character": 87 + }, + "end": { + "line": 12, + "column": 13, + "character": 90 + } + } }, "parameters": [], "body": { diff --git a/packages/svelte/tests/parser-modern/samples/snippets/output.json b/packages/svelte/tests/parser-modern/samples/snippets/output.json index 52f43b66c4df..d760fe2e2dcf 100644 --- a/packages/svelte/tests/parser-modern/samples/snippets/output.json +++ b/packages/svelte/tests/parser-modern/samples/snippets/output.json @@ -20,9 +20,21 @@ "end": 81, "expression": { "type": "Identifier", + "name": "foo", "start": 39, "end": 42, - "name": "foo" + "loc": { + "start": { + "line": 3, + "column": 10, + "character": 39 + }, + "end": { + "line": 3, + "column": 13, + "character": 42 + } + } }, "parameters": [ { From dd17775f93ae8c41ee18aca17af05bbfc4e2476b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 15:03:39 -0500 Subject: [PATCH 26/29] tweak --- packages/svelte/src/compiler/phases/1-parse/index.js | 2 +- packages/svelte/src/compiler/phases/1-parse/read/context.js | 2 +- packages/svelte/src/compiler/phases/1-parse/state/element.js | 2 +- packages/svelte/src/compiler/phases/1-parse/state/tag.js | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index 27ff848ad321..7017d013da32 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -223,7 +223,7 @@ export class Parser { /** * @returns {ESTree.Identifier & { start: number, end: number, loc: { start: Location, end: Location } }} */ - read_id() { + read_identifier() { const start = this.index; let end = start; let name = ''; 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 6195106e5cb6..f90d59fa0bce 100644 --- a/packages/svelte/src/compiler/phases/1-parse/read/context.js +++ b/packages/svelte/src/compiler/phases/1-parse/read/context.js @@ -13,7 +13,7 @@ export default function read_pattern(parser) { const start = parser.index; let i = parser.index; - const id = parser.read_id(); + const id = parser.read_identifier(); if (id.name !== '') { const annotation = read_type_annotation(parser); diff --git a/packages/svelte/src/compiler/phases/1-parse/state/element.js b/packages/svelte/src/compiler/phases/1-parse/state/element.js index 7536757c9f28..d9fe33bbacf8 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/element.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/element.js @@ -544,7 +544,7 @@ function read_attribute(parser) { return spread; } else { - const id = parser.read_id(); + const id = parser.read_identifier(); if (id.name === '') { if ( 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 53b538c15523..138eda8033d7 100644 --- a/packages/svelte/src/compiler/phases/1-parse/state/tag.js +++ b/packages/svelte/src/compiler/phases/1-parse/state/tag.js @@ -177,7 +177,7 @@ function open(parser) { if (parser.eat(',')) { parser.allow_whitespace(); - index = parser.read_id().name; + index = parser.read_identifier().name; if (!index) { e.expected_identifier(parser.index); } @@ -347,7 +347,7 @@ function open(parser) { if (parser.eat('snippet')) { parser.require_whitespace(); - const id = parser.read_id(); + const id = parser.read_identifier(); if (id.name === '' && !parser.loose) { e.expected_identifier(parser.index); From f06d232be7cfd1b908bcd4bbb999b170e26dd217 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 15:05:03 -0500 Subject: [PATCH 27/29] tidy up --- .../src/compiler/phases/2-analyze/visitors/RegularElement.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js index ffd3fe69b784..5fce138089a9 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js +++ b/packages/svelte/src/compiler/phases/2-analyze/visitors/RegularElement.js @@ -51,8 +51,6 @@ export function RegularElement(node, context) { null, -1, -1, - // /** @type {AST.Text} */ (node.fragment.nodes.at(0)).start, - // /** @type {AST.Text} */ (node.fragment.nodes.at(-1)).end, // @ts-ignore node.fragment.nodes ) From 3eb08b1c699317509e85f0720dc9669bef226242 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 15:06:33 -0500 Subject: [PATCH 28/29] changeset --- .changeset/gentle-views-matter.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/gentle-views-matter.md diff --git a/.changeset/gentle-views-matter.md b/.changeset/gentle-views-matter.md new file mode 100644 index 000000000000..2b0b361317ac --- /dev/null +++ b/.changeset/gentle-views-matter.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: preserve node locations for better sourcemaps From 6bd062ebe7b9d97412e078f0615452b87b32313f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 30 Nov 2025 15:32:47 -0500 Subject: [PATCH 29/29] oops --- packages/svelte/types/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index a89f4424fee8..0e6b019b62e6 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -1520,7 +1520,7 @@ declare module 'svelte/compiler' { export interface BaseAttribute extends BaseNode { name: string; - name_loc: SourceLocation; + name_loc: SourceLocation | null; } export interface Attribute extends BaseAttribute {