From a2595e2b381271ebfbb75f48787d150e9410e50b Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Thu, 12 Jun 2025 10:21:23 -0600 Subject: [PATCH 1/3] test: Secondary title alignment --- tests/formatter.rs | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/tests/formatter.rs b/tests/formatter.rs index 42886762..edae0a62 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -2494,3 +2494,96 @@ LL │ �|�␂!5�cc␕␂�Ӻi��WWj�ȥ�'�}�␒�J�ȉ��W let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode); assert_data_eq!(renderer_unicode.render(input), expected_unicode); } + +#[test] +fn secondary_title_no_level_text() { + let source = r#"fn main() { + let b: &[u8] = include_str!("file.txt"); //~ ERROR mismatched types + let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types +}"#; + + let input = Level::ERROR.header("mismatched types").id("E0308").group( + Group::new() + .element( + Snippet::source(source) + .path("$DIR/mismatched-types.rs") + .fold(true) + .annotation( + AnnotationKind::Primary + .span(105..131) + .label("expected `&str`, found `&[u8; 0]`"), + ) + .annotation( + AnnotationKind::Context + .span(98..102) + .label("expected due to this"), + ), + ) + .element( + Level::NOTE + .text(None) + .title("expected reference `&str`\nfound reference `&'static [u8; 0]`"), + ), + ); + + let expected = str![[r#" +error[E0308]: mismatched types + --> $DIR/mismatched-types.rs:3:19 + | +LL | let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types + | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&str`, found `&[u8; 0]` + | | + | expected due to this + expected reference `&str` + found reference `&'static [u8; 0]` +"#]]; + let renderer = Renderer::plain().anonymized_line_numbers(true); + assert_data_eq!(renderer.render(input), expected); +} + +#[test] +fn secondary_title_custom_level_text() { + let source = r#"fn main() { + let b: &[u8] = include_str!("file.txt"); //~ ERROR mismatched types + let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types +}"#; + + let input = Level::ERROR.header("mismatched types").id("E0308").group( + Group::new() + .element( + Snippet::source(source) + .path("$DIR/mismatched-types.rs") + .fold(true) + .annotation( + AnnotationKind::Primary + .span(105..131) + .label("expected `&str`, found `&[u8; 0]`"), + ) + .annotation( + AnnotationKind::Context + .span(98..102) + .label("expected due to this"), + ), + ) + .element( + Level::NOTE + .text(Some("custom")) + .title("expected reference `&str`\nfound reference `&'static [u8; 0]`"), + ), + ); + + let expected = str![[r#" +error[E0308]: mismatched types + --> $DIR/mismatched-types.rs:3:19 + | +LL | let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types + | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&str`, found `&[u8; 0]` + | | + | expected due to this + | + = custom: expected reference `&str` + found reference `&'static [u8; 0]` +"#]]; + let renderer = Renderer::plain().anonymized_line_numbers(true); + assert_data_eq!(renderer.render(input), expected); +} From 2af175c609a42d914aaa084ed279f32883547d79 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Thu, 12 Jun 2025 10:27:56 -0600 Subject: [PATCH 2/3] fix: Add '=' before all secondary titles --- src/renderer/mod.rs | 13 +++++++------ tests/formatter.rs | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 93996075..732e5a86 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -555,13 +555,14 @@ impl Renderer { buffer.prepend(buffer_msg_line_offset, " ", ElementStyle::NoStyle); } + self.draw_note_separator( + buffer, + buffer_msg_line_offset, + max_line_num_len + 1, + is_cont, + ); + if title.level.name != Some(None) { - self.draw_note_separator( - buffer, - buffer_msg_line_offset, - max_line_num_len + 1, - is_cont, - ); buffer.append( buffer_msg_line_offset, title.level.as_str(), diff --git a/tests/formatter.rs b/tests/formatter.rs index edae0a62..f763f663 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -2534,7 +2534,7 @@ LL | let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types | ---- ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&str`, found `&[u8; 0]` | | | expected due to this - expected reference `&str` + = expected reference `&str` found reference `&'static [u8; 0]` "#]]; let renderer = Renderer::plain().anonymized_line_numbers(true); From e7c3b6bc0b09170a50307190f4c3049c28dc5179 Mon Sep 17 00:00:00 2001 From: Scott Schafer Date: Thu, 12 Jun 2025 10:27:56 -0600 Subject: [PATCH 3/3] fix: Align multi-line secondary titles by level text --- src/renderer/mod.rs | 47 ++++++++++++++++++++++++--------------------- tests/formatter.rs | 4 ++-- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 732e5a86..39c805b7 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -562,17 +562,37 @@ impl Renderer { is_cont, ); - if title.level.name != Some(None) { + let label_width = if title.level.name != Some(None) { buffer.append( buffer_msg_line_offset, title.level.as_str(), ElementStyle::MainHeaderMsg, ); buffer.append(buffer_msg_line_offset, ": ", ElementStyle::NoStyle); - } + title.level.as_str().len() + 2 + } else { + 0 + }; + // The extra 3 ` ` is padding that's always needed to align to the + // label i.e. `note: `: + // + // error: message + // --> file.rs:13:20 + // | + // 13 | + // | ^^^^ + // | + // = note: multiline + // message + // ++^^^------ + // | | | + // | | | + // | | width of label + // | magic `3` + // `max_line_num_len` + let padding = max_line_num_len + 3 + label_width; - let printed_lines = - self.msgs_to_buffer(buffer, title.title, max_line_num_len, "note", None); + let printed_lines = self.msgs_to_buffer(buffer, title.title, padding, None); if is_cont && matches!(self.theme, OutputTheme::Unicode) { // There's another note after this one, associated to the subwindow above. // We write additional vertical lines to join them: @@ -660,26 +680,9 @@ impl Renderer { buffer: &mut StyledBuffer, title: &str, padding: usize, - label: &str, override_style: Option, ) -> usize { - // The extra 5 ` ` is padding that's always needed to align to the `note: `: - // - // error: message - // --> file.rs:13:20 - // | - // 13 | - // | ^^^^ - // | - // = note: multiline - // message - // ++^^^----xx - // | | | | - // | | | magic `2` - // | | length of label - // | magic `3` - // `max_line_num_len` - let padding = " ".repeat(padding + label.len() + 5); + let padding = " ".repeat(padding); let mut line_number = buffer.num_lines().saturating_sub(1); diff --git a/tests/formatter.rs b/tests/formatter.rs index f763f663..fb671dfd 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -2535,7 +2535,7 @@ LL | let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types | | | expected due to this = expected reference `&str` - found reference `&'static [u8; 0]` + found reference `&'static [u8; 0]` "#]]; let renderer = Renderer::plain().anonymized_line_numbers(true); assert_data_eq!(renderer.render(input), expected); @@ -2582,7 +2582,7 @@ LL | let s: &str = include_bytes!("file.txt"); //~ ERROR mismatched types | expected due to this | = custom: expected reference `&str` - found reference `&'static [u8; 0]` + found reference `&'static [u8; 0]` "#]]; let renderer = Renderer::plain().anonymized_line_numbers(true); assert_data_eq!(renderer.render(input), expected);