Indexed column spans ignore section line offsets when clipping at the next section

Ouverte Adaptée aux débutants
#539 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

@NUAAwqy y travaille déjà.

Depuis le 13/10/2026.

  • #540 par @NUAAwqy — ouverte
  • #552 par @user-Param — ouverte
  • #562 par @user-Param — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
javascript
Domaine
tooling

Piste de recherche

Commencez par le script de reproduction, qui utilise SourceMapConsumer avec deux sections indexées dont les offsets se situent à la ligne 4. Appelez computeColumnSpans() et vérifiez generatedPositionFor, allGeneratedPositionsFor et eachMapping. Le bogue vient de ce que la vérification de la frontière de section compare une ligne générée locale à la section avec la ligne absolue de la section suivante, avant l'application de l'offset. Le travail est terminé lorsque le premier mapping se termine à la colonne 9 et que les tests de régression des trois API passent, y compris un cas avec une frontière sur une ligne locale ultérieure.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Indexed maps whose first section has a nonzero line offset return a column span that extends into the next section on the same generated line.

Minimal reproduction on master (8c668f3):

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

(async () => {
  const consumer = await new SourceMapConsumer({
    version: 3,
    sections: [
      {
        offset: { line: 4, column: 3 },
        map: { version: 3, sources: ["first.js"], names: [], mappings: "AAAA" },
      },
      {
        offset: { line: 4, column: 10 },
        map: { version: 3, sources: ["second.js"], names: [], mappings: "AAAA" },
      },
    ],
  });
  try {
    consumer.computeColumnSpans();
    console.log(consumer.generatedPositionFor({
      source: "first.js", line: 1, column: 0,
    }));
    console.log(consumer.allGeneratedPositionsFor({
      source: "first.js", line: 1, column: 0,
    }));
    consumer.eachMapping(console.log);
  } finally {
    consumer.destroy();
  }
})();

Expected: the first mapping is at generated line 5, column 3, with an inclusive last column of 9 because the second section starts at column 10.

Actual: both position queries return lastColumn: Infinity, and eachMapping returns lastGeneratedColumn: Infinity for that mapping.

The section-boundary check compares a section-local generated line to the next section's absolute generated line before applying the line offset. The same ordering occurs in all three APIs. A boundary on a later local line is affected too; a zero line offset hides the problem.

I have a focused fix and regression tests ready. All 202 tests and lint pass with the fix; the three affected API tests fail on the original code.

Langage dominant
JavaScript
Étoiles
3.7k
Forks
388
Merge moyen
4 j 18 h
PR mergées (30 j)
1

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de mozilla/source-map

Toutes les issues de mozilla/source-map

Issues similaires

Plus d'issues JavaScript

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.