From 656ee24966c17ed505acc2faded2da505e9c7052 Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Wed, 5 Apr 2023 20:03:41 +0200 Subject: [PATCH] Simplify gutter diagnostics rendering by using partition_point instead of binary search Co-authored-by: Pascal Kuthe --- helix-view/src/gutter.rs | 42 ++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/helix-view/src/gutter.rs b/helix-view/src/gutter.rs index 475ec5a37..d11cbe4d7 100644 --- a/helix-view/src/gutter.rs +++ b/helix-view/src/gutter.rs @@ -1,6 +1,6 @@ use std::fmt::Write; -use helix_core::{syntax::LanguageServerFeature, Diagnostic}; +use helix_core::syntax::LanguageServerFeature; use crate::{ editor::GutterType, @@ -65,35 +65,27 @@ pub fn diagnostic<'doc>( return None; } use helix_core::diagnostic::Severity; - if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) { - let on_line_and_is_visible = |d: &&Diagnostic| { + let first_diag_idx_maybe_on_line = diagnostics.partition_point(|d| d.line < line); + if first_diag_idx_maybe_on_line == diagnostics.len() { + return None; + } + let diagnostics_on_line = diagnostics[first_diag_idx_maybe_on_line..] + .iter() + .take_while(|d| { d.line == line && doc .language_servers_with_feature(LanguageServerFeature::Diagnostics) .any(|ls| ls.id() == d.language_server_id) - }; - let after = diagnostics[index..] - .iter() - .take_while(on_line_and_is_visible); - - let before = diagnostics[..index] - .iter() - .rev() - .take_while(on_line_and_is_visible); - - let diagnostics_on_line = after.chain(before); - - if let Some(diagnostic) = diagnostics_on_line.max_by_key(|d| d.severity) { - write!(out, "●").ok(); - return Some(match diagnostic.severity { - Some(Severity::Error) => error, - Some(Severity::Warning) | None => warning, - Some(Severity::Info) => info, - Some(Severity::Hint) => hint, - }); + }); + diagnostics_on_line.max_by_key(|d| d.severity).map(|d| { + write!(out, "●").ok(); + match d.severity { + Some(Severity::Error) => error, + Some(Severity::Warning) | None => warning, + Some(Severity::Info) => info, + Some(Severity::Hint) => hint, } - } - None + }) }, ) }