diff --git a/examples/custom_level.svg b/examples/custom_level.svg index eebff280..62dded57 100644 --- a/examples/custom_level.svg +++ b/examples/custom_level.svg @@ -41,7 +41,7 @@ ╰╴ - suggestion: use `break` on its own without a value inside this `while` loop + suggestion: use `break` on its own without a value inside this `while` loop ╭╴ diff --git a/examples/footer.svg b/examples/footer.svg index e24ba5f5..e55ee041 100644 --- a/examples/footer.svg +++ b/examples/footer.svg @@ -32,9 +32,9 @@ | - note: expected type: `snippet::Annotation` + note: expected type: `snippet::Annotation` - found type: `__&__snippet::Annotation` + found type: `__&__snippet::Annotation` diff --git a/examples/highlight_title.svg b/examples/highlight_title.svg index 24f1b364..c748a1de 100644 --- a/examples/highlight_title.svg +++ b/examples/highlight_title.svg @@ -41,7 +41,7 @@ found fn item `fn(Box<(dyn Any + Send + 'static)>) -> Pin<_> {wrapped_fn}` - note: function defined here + note: function defined here --> $DIR/highlighting.rs:10:4 diff --git a/src/level.rs b/src/level.rs index 87d1a9f6..eaa95600 100644 --- a/src/level.rs +++ b/src/level.rs @@ -78,7 +78,6 @@ impl<'a> Level<'a> { groups: vec![Group::new().element(Element::Title(Title { level: self, title: header, - primary: true, }))], } } @@ -92,11 +91,7 @@ impl<'a> Level<'a> { /// /// pub fn title(self, title: &'a str) -> Title<'a> { - Title { - level: self, - title, - primary: false, - } + Title { level: self, title } } pub(crate) fn as_str(&self) -> &'a str { diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 24455add..6afe3183 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -315,12 +315,16 @@ impl Renderer { let peek = message_iter.peek().map(|(_, s)| s).copied(); match §ion { Element::Title(title) => { + let title_style = match (i == 0, g == 0) { + (true, true) => TitleStyle::MainHeader, + (true, false) => TitleStyle::Header, + (false, _) => TitleStyle::Secondary, + }; self.render_title( &mut buffer, title, - peek, max_line_num_len, - if i == 0 { false } else { !title.primary }, + title_style, message.id.as_ref().and_then(|id| { if g == 0 && i == 0 { Some(id) @@ -433,26 +437,14 @@ impl Renderer { &self, buffer: &mut StyledBuffer, title: &Title<'_>, - next_section: Option<&Element<'_>>, max_line_num_len: usize, - is_secondary: bool, + title_style: TitleStyle, id: Option<&&str>, is_cont: bool, ) { let line_offset = buffer.num_lines(); - let (has_primary_spans, has_span_labels) = - next_section.map_or((false, false), |s| match s { - Element::Title(_) | Element::Padding(_) => (false, false), - Element::Cause(cause) => ( - cause.markers.iter().any(|m| m.kind.is_primary()), - cause.markers.iter().any(|m| m.label.is_some()), - ), - Element::Suggestion(_) => (true, false), - Element::Origin(_) => (false, true), - }); - - if !has_primary_spans && !has_span_labels && is_secondary { + if title_style == TitleStyle::Secondary { // This is a secondary message with no span info for _ in 0..max_line_num_len { buffer.prepend(line_offset, " ", ElementStyle::NoStyle); @@ -503,10 +495,10 @@ impl Renderer { buffer.append(line_offset, "]", ElementStyle::Level(title.level.level)); label_width += 2 + id.len(); } - let header_style = if is_secondary { - ElementStyle::HeaderMsg - } else { - ElementStyle::MainHeaderMsg + let header_style = match title_style { + TitleStyle::MainHeader => ElementStyle::MainHeaderMsg, + TitleStyle::Header => ElementStyle::HeaderMsg, + TitleStyle::Secondary => unreachable!(), }; if title.level.name != Some(None) { buffer.append(line_offset, ": ", header_style); @@ -661,7 +653,14 @@ impl Renderer { max_line_num_len + 1, ); let title = Level::NOTE.title(label); - self.render_title(buffer, &title, None, max_line_num_len, true, None, false); + self.render_title( + buffer, + &title, + max_line_num_len, + TitleStyle::Secondary, + None, + false, + ); } } @@ -2717,6 +2716,13 @@ pub enum OutputTheme { Unicode, } +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +enum TitleStyle { + MainHeader, + Header, + Secondary, +} + #[cfg(test)] mod test { use super::OUTPUT_REPLACEMENTS; diff --git a/src/snippet.rs b/src/snippet.rs index 7226783d..d3f50104 100644 --- a/src/snippet.rs +++ b/src/snippet.rs @@ -159,14 +159,6 @@ pub struct Padding; pub struct Title<'a> { pub(crate) level: Level<'a>, pub(crate) title: &'a str, - pub(crate) primary: bool, -} - -impl Title<'_> { - pub fn primary(mut self, primary: bool) -> Self { - self.primary = primary; - self - } } /// A source view [`Element`] in a [`Group`] diff --git a/tests/formatter.rs b/tests/formatter.rs index a0e4df87..4fd96ff2 100644 --- a/tests/formatter.rs +++ b/tests/formatter.rs @@ -1663,6 +1663,8 @@ zappy let input_new = Level::ERROR .header("the size for values of type `T` cannot be known at compilation time") .id("E0277") + // We need an empty group here to ensure the HELP line is rendered correctly + .group(Group::new()) .group( Group::new() .element(Level::HELP.title(