From 43027d91046f79d6dc495b351cdcbfd3819cd9e1 Mon Sep 17 00:00:00 2001 From: A-Walrus <58790821+A-Walrus@users.noreply.github.com> Date: Tue, 21 Jun 2022 05:39:43 +0300 Subject: [PATCH] Display highest severity diagnostic in gutter (#2835) * Display highest severity diagnostic in gutter * Improve gutter diagnostic performance Very slight improvement (doesn't really make a difference), iterates over the diagnostics of the line once instead of twice. * Add comment justifying unwrap --- helix-view/src/gutter.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index eb6796be..05fec758 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -26,7 +26,18 @@ pub fn diagnostic<'doc>( Box::new(move |line: usize, _selected: bool, out: &mut String| { use helix_core::diagnostic::Severity; if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) { - let diagnostic = &diagnostics[index]; + let after = diagnostics[index..].iter().take_while(|d| d.line == line); + + let before = diagnostics[..index] + .iter() + .rev() + .take_while(|d| d.line == line); + + let diagnostics_on_line = after.chain(before); + + // This unwrap is safe because the iterator cannot be empty as it contains at least the item found by the binary search. + let diagnostic = diagnostics_on_line.max_by_key(|d| d.severity).unwrap(); + write!(out, "●").unwrap(); return Some(match diagnostic.severity { Some(Severity::Error) => error,