Optimize gutter diagnostics and simplify shown_diagnostics

This commit is contained in:
Philipp Mildenberger 2023-03-20 00:51:41 +01:00
parent 8ab6d7be5e
commit 8ee599942a
2 changed files with 16 additions and 15 deletions

View File

@ -179,7 +179,7 @@ pub struct Document {
version: i32, // should be usize?
pub(crate) modified_since_accessed: bool,
diagnostics: Vec<Diagnostic>,
pub(crate) diagnostics: Vec<Diagnostic>,
pub(crate) language_servers: HashMap<LanguageServerName, Arc<Client>>,
diff_handle: Option<DiffHandle>,
@ -1605,17 +1605,8 @@ pub fn diagnostics(&self) -> &[Diagnostic] {
pub fn shown_diagnostics(&self) -> impl Iterator<Item = &Diagnostic> + DoubleEndedIterator {
self.diagnostics.iter().filter(|d| {
self.language_servers()
.find(|ls| ls.id() == d.language_server_id)
.and_then(|ls| {
let config = self.language_config()?;
let features = config
.language_servers
.iter()
.find(|features| features.name == ls.name())?;
Some(features.has_feature(LanguageServerFeature::Diagnostics))
})
== Some(true)
self.language_servers_with_feature(LanguageServerFeature::Diagnostics)
.any(|ls| ls.id() == d.language_server_id)
})
}

View File

@ -1,5 +1,7 @@
use std::fmt::Write;
use helix_core::{syntax::LanguageServerFeature, Diagnostic};
use crate::{
editor::GutterType,
graphics::{Style, UnderlineStyle},
@ -55,7 +57,7 @@ pub fn diagnostic<'doc>(
let error = theme.get("error");
let info = theme.get("info");
let hint = theme.get("hint");
let diagnostics = doc.shown_diagnostics().collect::<Vec<_>>();
let diagnostics = &doc.diagnostics;
Box::new(
move |line: usize, _selected: bool, first_visual_line: bool, out: &mut String| {
@ -64,12 +66,20 @@ pub fn diagnostic<'doc>(
}
use helix_core::diagnostic::Severity;
if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) {
let after = diagnostics[index..].iter().take_while(|d| d.line == line);
let on_line_and_is_visible = |d: &&Diagnostic| {
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(|d| d.line == line);
.take_while(on_line_and_is_visible);
let diagnostics_on_line = after.chain(before);