Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

commonmark reader registers its input twice and stamps nodes with the content-less FileId(0)

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

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

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
rust
Área
backend

Línea de trabajo

Lee crates/pampa/src/readers/commonmark.rs y compara cómo configura el contexto con crates/pampa/src/readers/qmd.rs. Actualiza crates/pampa/tests/integration/test_diagnostic_path_normalization.rs, especialmente commonmark_reader_source_context_uses_forward_slashes, para comprobar que la ruta normalizada y el contenido de entrada pertenecen a FileId(0) y que solo se registra un archivo. La tarea estará terminada cuando los nodos de commonmark usen ese archivo con contenido y pase la prueba específica.

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

Descripción

bug

Summary

pampa::readers::commonmark::read registers its input in the SourceContext twice and then points every node's SourceInfo at the wrong entry: the one without content. Line/column mapping for commonmark-read nodes only works today because the sole caller (the pampa CLI's --from commonmark) passes a real path that the first registration reads back from disk. For an in-memory input (anything named like <pandoc.read>), no position in the resulting AST can be turned into a line and column.

Where

crates/pampa/src/readers/commonmark.rs, read:

let mut context = ASTContext::with_filename(filename.to_string());   // (1) add_file(filename, None) -> FileId(0)
let normalized_filename = context.filenames[0].clone();
context
    .source_context
    .add_file(normalized_filename, Some(input.to_string()));          // (2) same path, with content -> FileId(1)
let file_id = FileId(0);                                               // (3) ...but nodes are stamped with FileId(0)

let source_ctx = SourceLocationContext::new(input, file_id);
let pandoc = convert_document_with_source(root, Some(&source_ctx));

SourceContext::add_file (quarto-source-map 0.3.0, context.rs) always pushes a new SourceFile; it does not dedupe by path. So after (2) the context holds two files with the same path: FileId(0) with content: None and a file_info only if std::fs::read_to_string(path) succeeded, and FileId(1) with the actual content. Every SourceInfo::Original the conversion produces names FileId(0).

The qmd reader (readers/qmd.rs, same spot) avoids this by replacing the context before adding the file:

let mut context = ASTContext::with_filename(filename.to_string());
context.source_context = quarto_source_map::SourceContext::new();
context.source_context.add_file(normalized_filename, Some(input_str));

so its FileId(0) is the entry that has the content.

Evidence that it is pinned rather than caught

crates/pampa/tests/integration/test_diagnostic_path_normalization.rs, commonmark_reader_source_context_uses_forward_slashes, asserts on FileId(1) and explains why:

FileId(0) is the entry ASTContext::with_filename creates internally … The fix this test protects is commonmark::read's own second add_file call, which lands at FileId(1)

That test will need to move to FileId(0) with the fix (and could additionally assert the context holds exactly one file).

Consequences

  • With a real on-disk path: works by accident. FileId(0) got a FileInformation from re-reading the file, so map_offset succeeds; FileId(1) is dead weight.
  • With an in-memory input and a synthetic name: FileId(0) has neither content nor file_info. A diagnostic or any map_offset against a commonmark node has an offset into a file the context cannot map. This is the path a Lua pandoc.read(text, "commonmark") would take (separate issue), and the reason to fix this first.
  • Snapshot or provenance tooling that looks at root_file_id() of commonmark nodes gets the content-less entry.

Fix

Mirror the qmd reader: build the context, replace source_context with a fresh one (or skip the with_filename registration), add_file(normalized, Some(input)) once, and use the FileId that call returns instead of a hard-coded FileId(0). Update the test above to assert a single file at FileId(0) with the normalized path and the content.

Environment

Repo at ad283a2cb (2026-10-16); quarto-source-map 0.3.0.

Lenguaje dominante
Rust
Estrellas
278
Forks
19
Merge medio
21 h 56 min
PR fusionados (30 d)
156

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 quarto-dev/q2

Todos los issues de quarto-dev/q2

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.