Indexed source maps: lastColumn is not clamped to the next section when the section does not start on line 1

Aperta Adatta ai principianti
#542 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 5 giorni

@sebxt ci sta già lavorando.

Dal 18/10/2026.

  • #543 di @sebxt — aperta
  • #551 di @user-Param — aperta
  • #562 di @user-Param — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
javascript
Ambito
devtools

Direzione di ricerca

Leggi IndexedSourceMapConsumer e verifica i confronti di generatedPositionFor, allGeneratedPositionsFor e eachMapping con la riga generata della sezione successiva. Riproduci il problema con la mappa a tre sezioni fornita, poi esegui i test pertinenti di source map. Il lavoro è completato quando tutte e tre le API limitano l’ultima colonna della sezione al confine della sezione successiva se la sezione inizia dopo la riga 1.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

After computeColumnSpans(), IndexedSourceMapConsumer is supposed to clamp a mapping's lastColumn (or lastGeneratedColumn) so it ends where the next section begins on the same generated line. This only works for the first section, or more precisely for sections whose offset line is 0. For any later section the clamp is skipped, and in some layouts it is applied to the wrong line.

Repro:

const { SourceMapConsumer } = require("source-map");

const section = source => ({ version: 3, sources: [source], names: [], mappings: "AAAA" });

const map = await new SourceMapConsumer({
  version: 3,
  sections: [
    { offset: { line: 0, column: 0 }, map: section("a.js") },
    { offset: { line: 2, column: 0 }, map: section("b.js") },
    { offset: { line: 2, column: 10 }, map: section("c.js") },
  ],
});
map.computeColumnSpans();

map.generatedPositionFor({ source: "b.js", line: 1, column: 0 });
// actual:   { line: 3, column: 0, lastColumn: Infinity }
// expected: { line: 3, column: 0, lastColumn: 9 }

allGeneratedPositionsFor and eachMapping (lastGeneratedColumn) return the same wrong value.

Root cause: in generatedPositionFor, allGeneratedPositionsFor and eachMapping of IndexedSourceMapConsumer, the comparison line === nextSection.generatedOffset.generatedLine runs before lineShift is added, so a section relative line is compared with an absolute line from the next section's offset. It only lines up when lineShift is 0. Adding the shift before the comparison fixes it.

Lingua principale
JavaScript
Stelle
3.7k
Fork
392
Merge medio
4g 18h
PR unite (30g)
1

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di mozilla/source-map

Tutte le issue di mozilla/source-map

Issue simili

Altre issue su JavaScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.