From 9525c3813178fe851e9895e645c520ffdac7866f Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Tue, 2 Sep 2025 08:52:19 -0600 Subject: [PATCH 1/2] test: Duplicate annotations --- tests/formatter.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/formatter.rs b/tests/formatter.rs index 1b0287f8..cfabf560 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -4235,3 +4235,49 @@ error: showing how tabs are rendered let renderer = renderer.decor_style(DecorStyle::Unicode); assert_data_eq!(renderer.render(input), expected_unicode); } + +#[test] +fn duplicate_annotations() { + let source = r#"foobar + + foobar πŸš€ +"#; + let report = &[ + Group::with_title(Level::WARNING.primary_title("whatever")).element( + Snippet::source(source) + .path("whatever") + .annotation(AnnotationKind::Primary.span(0..source.len()).label("blah")) + .annotation(AnnotationKind::Primary.span(0..source.len()).label("blah")), + ), + ]; + + let expected_ascii = str![[r#" +warning: whatever + --> whatever:1:1 + | +1 | / foobar +2 | | +3 | | foobar πŸš€ + | | ^ + | |______________________| + | |______________________blah + | blah +"#]]; + let renderer = Renderer::plain(); + assert_data_eq!(renderer.render(report), expected_ascii); + + let expected_unicode = str![[r#" +warning: whatever + β•­β–Έ whatever:1:1 + β”‚ +1 β”‚ ┏ foobar +2 β”‚ ┃ +3 β”‚ ┃ foobar πŸš€ + β”‚ ┃ β•Ώ + β”‚ ┃━━━━━━━━━━━━━━━━━━━━━━│ + β”‚ ┗━━━━━━━━━━━━━━━━━━━━━━blah + β•°β•΄ blah +"#]]; + let renderer = renderer.decor_style(DecorStyle::Unicode); + assert_data_eq!(renderer.render(report), expected_unicode); +} From 533d4264cf8cb5e7387297fdcddeedd7641bd4b5 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Tue, 2 Sep 2025 08:52:19 -0600 Subject: [PATCH 2/2] fix: Allow merging of multiline duplicate annotations --- src/renderer/source_map.rs | 6 +++--- tests/formatter.rs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/renderer/source_map.rs b/src/renderer/source_map.rs index db192169..9af41780 100644 --- a/src/renderer/source_map.rs +++ b/src/renderer/source_map.rs @@ -213,18 +213,18 @@ impl<'a> SourceMap<'a> { // Find overlapping multiline annotations, put them at different depths multiline_annotations.sort_by_key(|ml| (ml.start.line, usize::MAX - ml.end.line)); - for ann in multiline_annotations.clone() { + for (outer_i, ann) in multiline_annotations.clone().into_iter().enumerate() { if ann.kind.is_primary() { primary_spans.push((ann.start, ann.end)); } - for a in &mut multiline_annotations { + for (inner_i, a) in &mut multiline_annotations.iter_mut().enumerate() { // Move all other multiline annotations overlapping with this one // one level to the right. if !ann.same_span(a) && num_overlap(ann.start.line, ann.end.line, a.start.line, a.end.line, true) { a.increase_depth(); - } else if ann.same_span(a) && &ann != a { + } else if ann.same_span(a) && outer_i != inner_i { a.overlaps_exactly = true; } else { if primary_spans diff --git a/tests/formatter.rs b/tests/formatter.rs index cfabf560..dccd0d26 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -4259,7 +4259,7 @@ warning: whatever 2 | | 3 | | foobar πŸš€ | | ^ - | |______________________| + | | | | |______________________blah | blah "#]]; @@ -4274,7 +4274,7 @@ warning: whatever 2 β”‚ ┃ 3 β”‚ ┃ foobar πŸš€ β”‚ ┃ β•Ώ - β”‚ ┃━━━━━━━━━━━━━━━━━━━━━━│ + β”‚ ┃ β”‚ β”‚ ┗━━━━━━━━━━━━━━━━━━━━━━blah β•°β•΄ blah "#]];