rust-lang/annotate-snippets-rs

Unaligned display when one line source given

tisonkun opened this issue · 5 comments

Result:

 |
0 | SELECT bar
 |        ^^^ unexpected token
 | ^^^^^^^^^^ while parsing statement
 |

As you can see the | is not aligned.

Code:

pub(crate) fn display_annotated_error(source: &str, labels: Vec<(Range, String)>) -> String {
    let annotations = labels
        .iter()
        .map(|label| SourceAnnotation {
            range: (label.0.start, label.0.end),
            label: label.1.as_str(),
            annotation_type: AnnotationType::Error,
        })
        .collect::<Vec<_>>();

    let snippet = Snippet {
        title: None,
        footer: vec![],
        slices: vec![Slice {
            source,
            line_start: 0,
            origin: None,
            annotations,
            fold: false,
        }],
        opt: FormatOptions {
            color: true,
            ..Default::default()
        },
    };

    format!("{}", DisplayList::from(snippet))
}

display_annotated_error("SELECT bar", labels)
// where labels = [((7, 10), unexpected token), ((0, 10), while parsing statement)],

... while change source to SELECT \nbar gives a proper formatted:

  |
0 | / SELECT 
1 |   bar
  | | ^^^ unexpected token
  | |___^ while parsing statement
  |

Change line_start to 1 also fix the issue. Perhaps it's a bug for line_start == 0.

I wrote down what I found, even if my solution isn't accepted.

What I Found

I changed line_start(13) to 0 and 1 in examples/footer.rs to reproduce the issue.

line_start(1):

Screenshot 2024-08-21 at 2 20 47 PM

line_start(0):

Screenshot 2024-08-21 at 2 20 20 PM

I do not know the term we use to describe "space", so I use "col".

Upon closer comparison, you can see that the message for line_start(0) starts at col 1 and the message for line_start(1) starts at col 2.

According to my research, the number of spaces to insert at the beginning of each line is based on the line number width.

My Idea

No matter what the line number width is, we always start message from col 2 "at a minimum", which is what is #142 for.

cc @epage