Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Formatting bug with overlapping lines #21

Open
yoshuawuyts opened this issue Dec 9, 2019 · 0 comments
Open

Formatting bug with overlapping lines #21

yoshuawuyts opened this issue Dec 9, 2019 · 0 comments
Labels
C-enhancement Category: enhancement E-help-wanted Call for participation: Help is requested to fix this issue

Comments

@yoshuawuyts
Copy link
Member

I was messing around with the basic example, and found some interesting behavior (that doesn't seem to be quite right. Below is the source code + output for a few cases.

update: as I was going through this it seems that there is a clear bug for this. If we start the annotation at either 0 or 1 it offsets. At range 2 it's before the line. But at range 3 it actually pops back to the right location (I think, I'm unsure because of /, but that might just be the right behavior)! Check out cases 4 and 5 for what's going on.

Either way, I hope this report is helpful. Excited this crate exists!

Case 1

Output

error: expected type, found `22`
  --> examples/example.txt:27:11
   |
26 |
   |   __-
   |   __-
27 |    This is an example content of the slice which will be annotated with the list of annotations below.
   |  |            ^^^^^ Example error annotation
   | ||___________________________________________________________- and here's a warning
   |  |_______________________________________- and here's a warning
28 |
   |

Code

use annotate_snippets::display_list::DisplayList;
use annotate_snippets::formatter::DisplayListFormatter;
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};

fn main() {
    let snippet = Snippet {
        title: Some(Annotation {
            label: Some("expected type, found `22`".to_string()),
            id: None,
            annotation_type: AnnotationType::Error,
        }),
        footer: vec![],
        slices: vec![Slice {
            source: r#"
This is an example content of the slice which will be annotated with the list of annotations below.
                "#
            .to_string(),
            line_start: 26,
            origin: Some("examples/example.txt".to_string()),
            fold: false,
            annotations: vec![
                SourceAnnotation {
                    label: "Example error annotation".to_string(),
                    annotation_type: AnnotationType::Error,
                    range: (13, 18),
                },
                SourceAnnotation {
                    label: "and here's a warning".to_string(),
                    annotation_type: AnnotationType::Warning,
                    range: (1, 60),
                },
                SourceAnnotation {
                    label: "and here's a warning".to_string(),
                    annotation_type: AnnotationType::Warning,
                    range: (1, 40),
                },
            ],
        }],
    };

    let dl = DisplayList::from(snippet);
    let dlf = DisplayListFormatter::new(true, false);
    println!("{}", dlf.format(&dl));
}

Case 2

Output

error: expected type, found `22`
  --> examples/example.txt:27:11
   |
26 |
   |  __-
27 |   This is an example content of the slice which will be annotated with the list of annotations below.
   | |            ^^^^^ Example error annotation
   | |___________________________________________________________- and here's a warning
28 |
   |

Code

use annotate_snippets::display_list::DisplayList;
use annotate_snippets::formatter::DisplayListFormatter;
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};

fn main() {
    let snippet = Snippet {
        title: Some(Annotation {
            label: Some("expected type, found `22`".to_string()),
            id: None,
            annotation_type: AnnotationType::Error,
        }),
        footer: vec![],
        slices: vec![Slice {
            source: r#"
This is an example content of the slice which will be annotated with the list of annotations below.
                "#
            .to_string(),
            line_start: 26,
            origin: Some("examples/example.txt".to_string()),
            fold: false,
            annotations: vec![
                SourceAnnotation {
                    label: "Example error annotation".to_string(),
                    annotation_type: AnnotationType::Error,
                    range: (13, 18),
                },
                SourceAnnotation {
                    label: "and here's a warning".to_string(),
                    annotation_type: AnnotationType::Warning,
                    range: (1, 60),
                },
            ],
        }],
    };

    let dl = DisplayList::from(snippet);
    let dlf = DisplayListFormatter::new(true, false);
    println!("{}", dlf.format(&dl));
}

Case 3

Output

error: expected type, found `22`
  --> examples/example.txt:26:1
   |
26 |
   |  __-
27 | | This is an example content of the slice which will be annotated with the list of annotations below.
   | |___________________________________________________________- and here's a warning
28 |
   |

Code

use annotate_snippets::display_list::DisplayList;
use annotate_snippets::formatter::DisplayListFormatter;
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};

fn main() {
    let snippet = Snippet {
        title: Some(Annotation {
            label: Some("expected type, found `22`".to_string()),
            id: None,
            annotation_type: AnnotationType::Error,
        }),
        footer: vec![],
        slices: vec![Slice {
            source: r#"
This is an example content of the slice which will be annotated with the list of annotations below.
                "#
            .to_string(),
            line_start: 26,
            origin: Some("examples/example.txt".to_string()),
            fold: false,
            annotations: vec![SourceAnnotation {
                label: "and here's a warning".to_string(),
                annotation_type: AnnotationType::Warning,
                range: (1, 60),
            }],
        }],
    };

    let dl = DisplayList::from(snippet);
    let dlf = DisplayListFormatter::new(true, false);
    println!("{}", dlf.format(&dl));
}

Case 4

The range now starts at index 2.

Output

error: expected type, found `22`
  --> examples/example.txt:27:0
   |
26 |
27 | / This is an example content of the slice which will be
28 | | annotated with the list of annotations below.
   | |____- and here's a warning
29 |
   |

Code

use annotate_snippets::display_list::DisplayList;
use annotate_snippets::formatter::DisplayListFormatter;
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};

fn main() {
    let snippet = Snippet {
        title: Some(Annotation {
            label: Some("expected type, found `22`".to_string()),
            id: None,
            annotation_type: AnnotationType::Error,
        }),
        footer: vec![],
        slices: vec![Slice {
            source: r#"
This is an example content of the slice which will be
annotated with the list of annotations below.
                "#
            .to_string(),
            line_start: 26,
            origin: Some("examples/example.txt".to_string()),
            fold: false,
            annotations: vec![SourceAnnotation {
                label: "and here's a warning".to_string(),
                annotation_type: AnnotationType::Warning,
                range: (2, 60),
            }],
        }],
    };

    let dl = DisplayList::from(snippet);
    let dlf = DisplayListFormatter::new(true, false);
    println!("{}", dlf.format(&dl));
}

Case 5

The range now starts at index 3.

Output

error: expected type, found `22`
  --> examples/example.txt:27:1
   |
26 |
27 |   This is an example content of the slice which will be
   |  __-
28 | | annotated with the list of annotations below.
   | |____- and here's a warning
29 |
   |

Code

use annotate_snippets::display_list::DisplayList;
use annotate_snippets::formatter::DisplayListFormatter;
use annotate_snippets::snippet::{Annotation, AnnotationType, Slice, Snippet, SourceAnnotation};

fn main() {
    let snippet = Snippet {
        title: Some(Annotation {
            label: Some("expected type, found `22`".to_string()),
            id: None,
            annotation_type: AnnotationType::Error,
        }),
        footer: vec![],
        slices: vec![Slice {
            source: r#"
This is an example content of the slice which will be
annotated with the list of annotations below.
                "#
            .to_string(),
            line_start: 26,
            origin: Some("examples/example.txt".to_string()),
            fold: false,
            annotations: vec![SourceAnnotation {
                label: "and here's a warning".to_string(),
                annotation_type: AnnotationType::Warning,
                range: (3, 60),
            }],
        }],
    };

    let dl = DisplayList::from(snippet);
    let dlf = DisplayListFormatter::new(true, false);
    println!("{}", dlf.format(&dl));
}
@zbraniecki zbraniecki added C-enhancement Category: enhancement E-help-wanted Call for participation: Help is requested to fix this issue labels Mar 27, 2020
epage added a commit to epage/annotate-snippets-rs that referenced this issue Sep 27, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
C-enhancement Category: enhancement E-help-wanted Call for participation: Help is requested to fix this issue
Projects
None yet
Development

No branches or pull requests

2 participants