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 1b0287f8..dccd0d26 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); +}