From beb71e81de517acba7849cf90e10d29d7d4cefa7 Mon Sep 17 00:00:00 2001 From: adiguba Date: Thu, 27 Aug 2026 06:59:03 +0200 Subject: [PATCH] preserve original location --- packages/svelte/src/compiler/index.js | 2 +- .../src/compiler/phases/1-parse/index.js | 5 ++-- .../client/transform-template/index.js | 2 +- packages/svelte/src/compiler/state.js | 24 +++++++++++++++---- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/svelte/src/compiler/index.js b/packages/svelte/src/compiler/index.js index 599206ac6a..9e833b59d6 100644 --- a/packages/svelte/src/compiler/index.js +++ b/packages/svelte/src/compiler/index.js @@ -26,7 +26,7 @@ export function compile(source, options) { const validated = validate_component_options(options, ''); - let parsed = _parse(source); + let parsed = _parse(source, false, options.sourcemap); const { customElement: customElementOptions, ...parsed_options } = parsed.options || {}; diff --git a/packages/svelte/src/compiler/phases/1-parse/index.js b/packages/svelte/src/compiler/phases/1-parse/index.js index fa7b292640..61db00263f 100644 --- a/packages/svelte/src/compiler/phases/1-parse/index.js +++ b/packages/svelte/src/compiler/phases/1-parse/index.js @@ -327,10 +327,11 @@ export class Parser { /** * @param {string} template * @param {boolean} [loose] + * @param {object | string} [sourcemap] * @returns {AST.Root} */ -export function parse(template, loose = false) { - state.set_source(template); +export function parse(template, loose = false, sourcemap) { + state.set_source(template, sourcemap); const parser = new Parser(template, loose); return parser.root; 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 5fdc88844b..5c818b185f 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 @@ -15,7 +15,7 @@ function build_locations(nodes) { for (const node of nodes) { if (node.type !== 'element') continue; - const { line, column } = locator(node.start); + const { line, column } = locator(node.start, true); const expression = b.array([b.literal(line), b.literal(column)]); const children = build_locations(node.children); diff --git a/packages/svelte/src/compiler/state.js b/packages/svelte/src/compiler/state.js index 5ae001ec50..02f2853404 100644 --- a/packages/svelte/src/compiler/state.js +++ b/packages/svelte/src/compiler/state.js @@ -1,6 +1,7 @@ /** @import { Location } from 'locate-character' */ /** @import { CompileOptions } from './types' */ /** @import { AST, Warning } from '#compiler' */ +import { TraceMap, originalPositionFor } from '@jridgewell/trace-mapping'; import { getLocator } from 'locate-character'; import { sanitize_location } from '../utils.js'; @@ -46,20 +47,33 @@ export let dev; export let runes = false; -/** @type {(index: number) => Location} */ +/** @type {(index: number, use_sourcemap?: boolean) => Location} */ export let locator; -/** @param {string} value */ -export function set_source(value) { +/** + * @param {string} value + * @param {object | string} [sourcemap] + */ +export function set_source(value, sourcemap) { source = value; source_lines = source.split('\n'); + const map = (sourcemap && typeof sourcemap === 'object') + ? new TraceMap( /** @type {any} */ (sourcemap)) + : null; + const l = getLocator(source, { offsetLine: 1 }); - locator = (i) => { + locator = (i, use_sourcemap=false) => { const loc = l(i); if (!loc) throw new Error('An impossible situation occurred'); - + if (use_sourcemap && map) { + const original = originalPositionFor(map, loc); + if (original.line != null && original.column != null) { + loc.line = original.line; + loc.column = original.column; + } + } return loc; }; }