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

Abierto Apto para principiantes
#542 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 5 días

@sebxt ya está trabajando en esto.

Desde el 18/10/2026.

  • #543 de @sebxt — abierto
  • #551 de @user-Param — abierto
  • #562 de @user-Param — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
javascript
Área
devtools

Línea de trabajo

Lee IndexedSourceMapConsumer e inspecciona las comparaciones de generatedPositionFor, allGeneratedPositionsFor y eachMapping con la línea generada de la siguiente sección. Reproduce el problema con el mapa de tres secciones proporcionado y ejecuta las pruebas pertinentes de source map. El trabajo estará completo cuando las tres API limiten la última columna de la sección al límite de la siguiente sección si la sección comienza después de la línea 1.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
JavaScript
Estrellas
3.7k
Forks
392
Merge medio
4 d 18 h
PR fusionados (30 d)
1

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de mozilla/source-map

Todos los issues de mozilla/source-map

Issues similares

Más issues de JavaScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.