on master help sign in
Simplify gutter diagnostics rendering by using partition_point instead of binary search

Co-authored-by: Pascal Kuthe <pascal.kuthe@semimod.de>

commit656ee24966c17ed505acc2faded2da505e9c7052 authorPhilipp Mildenberger <philipp@mildenberger.me> dateWed 5 Apr 2023, 20:03 (4 years ago) parent2b746ea
1 file changed+17−25
helix-view/src/gutter.rs+17−25
helix-view/src/gutter.rs+17−25
@@ -1,6 +1,6 @@
11use std::fmt::Write;
22
3−use helix_core::{syntax::LanguageServerFeature, Diagnostic};
3+use helix_core::syntax::LanguageServerFeature;
44
55use crate::{
66 editor::GutterType,
@@ -65,35 +65,27 @@ pub fn diagnostic<'doc>(
6565 return None;
6666 }
6767 use helix_core::diagnostic::Severity;
68− if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) {
69− let on_line_and_is_visible = |d: &&Diagnostic| {
68+ let first_diag_idx_maybe_on_line = diagnostics.partition_point(|d| d.line < line);
69+ if first_diag_idx_maybe_on_line == diagnostics.len() {
70+ return None;
71+ }
72+ let diagnostics_on_line = diagnostics[first_diag_idx_maybe_on_line..]
73+ .iter()
74+ .take_while(|d| {
7075 d.line == line
7176 && doc
7277 .language_servers_with_feature(LanguageServerFeature::Diagnostics)
7378 .any(|ls| ls.id() == d.language_server_id)
74− };
75− let after = diagnostics[index..]
76− .iter()
77− .take_while(on_line_and_is_visible);
78−
79− let before = diagnostics[..index]
80− .iter()
81− .rev()
82− .take_while(on_line_and_is_visible);
83−
84− let diagnostics_on_line = after.chain(before);
85−
86− if let Some(diagnostic) = diagnostics_on_line.max_by_key(|d| d.severity) {
87− write!(out, "●").ok();
88− return Some(match diagnostic.severity {
89− Some(Severity::Error) => error,
90− Some(Severity::Warning) | None => warning,
91− Some(Severity::Info) => info,
92− Some(Severity::Hint) => hint,
93− });
79+ });
80+ diagnostics_on_line.max_by_key(|d| d.severity).map(|d| {
81+ write!(out, "●").ok();
82+ match d.severity {
83+ Some(Severity::Error) => error,
84+ Some(Severity::Warning) | None => warning,
85+ Some(Severity::Info) => info,
86+ Some(Severity::Hint) => hint,
9487 }
95− }
96− None
88+ })
9789 },
9890 )
9991}