From 3a46662e04e2efb1f2f9428c0ec9b559a177a048 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Wed, 2 Jul 2025 22:37:08 -0600 Subject: [PATCH 1/2] test: Add a test for max_line_num with no fold --- tests/formatter.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/formatter.rs b/tests/formatter.rs index b8405b8..dc661e7 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -2574,3 +2574,41 @@ LL + break; let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode); assert_data_eq!(renderer_unicode.render(input), expected_unicode); } + +#[test] +fn max_line_num_no_fold() { + let source = r#"cargo +fuzzy +pizza +jumps +crazy +quack +zappy +"#; + + let input_new = &[Group::with_title( + Level::ERROR + .title("the size for values of type `T` cannot be known at compilation time") + .id("E0277"), + ) + .element( + Snippet::source(source) + .line_start(8) + .fold(false) + .annotation(AnnotationKind::Primary.span(6..11)), + )]; + let expected = str![[r#" +error[E0277]: the size for values of type `T` cannot be known at compilation time + | +8 | cargo +9 | fuzzy + | ^^^^^ +10| pizza +11| jumps +12| crazy +13| quack +14| zappy +"#]]; + let renderer = Renderer::plain(); + assert_data_eq!(renderer.render(input_new), expected); +} From 9a2155aad4e28a6f7e86a4aaa1f911d3c64d0629 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Wed, 2 Jul 2025 22:38:15 -0600 Subject: [PATCH 2/2] fix: If fold is false max_line_num is last source line --- src/renderer/mod.rs | 44 ++++++++++++++++++++++++++------------------ tests/formatter.rs | 18 +++++++++--------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 759fbfb..83e1a7d 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -2919,26 +2919,34 @@ fn max_line_number(groups: &[Group<'_>]) -> usize { | Element::Origin(_) | Element::Padding(_) => 0, Element::Cause(cause) => { - let end = cause - .markers - .iter() - .map(|a| a.span.end) - .max() - .unwrap_or(cause.source.len()) - .min(cause.source.len()); - - cause.line_start + newline_count(&cause.source[..end]) + if cause.fold { + let end = cause + .markers + .iter() + .map(|a| a.span.end) + .max() + .unwrap_or(cause.source.len()) + .min(cause.source.len()); + + cause.line_start + newline_count(&cause.source[..end]) + } else { + cause.line_start + newline_count(&cause.source) + } } Element::Suggestion(suggestion) => { - let end = suggestion - .markers - .iter() - .map(|a| a.span.end) - .max() - .unwrap_or(suggestion.source.len()) - .min(suggestion.source.len()); - - suggestion.line_start + newline_count(&suggestion.source[..end]) + if suggestion.fold { + let end = suggestion + .markers + .iter() + .map(|a| a.span.end) + .max() + .unwrap_or(suggestion.source.len()) + .min(suggestion.source.len()); + + suggestion.line_start + newline_count(&suggestion.source[..end]) + } else { + suggestion.line_start + newline_count(&suggestion.source) + } } }) .max() diff --git a/tests/formatter.rs b/tests/formatter.rs index dc661e7..8745e56 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -2599,15 +2599,15 @@ zappy )]; let expected = str![[r#" error[E0277]: the size for values of type `T` cannot be known at compilation time - | -8 | cargo -9 | fuzzy - | ^^^^^ -10| pizza -11| jumps -12| crazy -13| quack -14| zappy + | + 8 | cargo + 9 | fuzzy + | ^^^^^ +10 | pizza +11 | jumps +12 | crazy +13 | quack +14 | zappy "#]]; let renderer = Renderer::plain(); assert_data_eq!(renderer.render(input_new), expected);