on master help sign in
Optimize gutter diagnostics and simplify shown_diagnostics
8ee5999Philipp Mildenberger
helix-view/src/document.rs+3−12
@@ -179,7 +179,7 @@ pub struct Document {
179 version: i32, // should be usize?
179 version: i32, // should be usize?
180 pub(crate) modified_since_accessed: bool,
180 pub(crate) modified_since_accessed: bool,
181
181
182− diagnostics: Vec<Diagnostic>,
182+ pub(crate) diagnostics: Vec<Diagnostic>,
183 pub(crate) language_servers: HashMap<LanguageServerName, Arc<Client>>,
183 pub(crate) language_servers: HashMap<LanguageServerName, Arc<Client>>,
184
184
185 diff_handle: Option<DiffHandle>,
185 diff_handle: Option<DiffHandle>,
@@ -1605,17 +1605,8 @@ impl Document {
1605
1605
1606 pub fn shown_diagnostics(&self) -> impl Iterator<Item = &Diagnostic> + DoubleEndedIterator {
1606 pub fn shown_diagnostics(&self) -> impl Iterator<Item = &Diagnostic> + DoubleEndedIterator {
1607 self.diagnostics.iter().filter(|d| {
1607 self.diagnostics.iter().filter(|d| {
1608− self.language_servers()
1609− .find(|ls| ls.id() == d.language_server_id)
1610− .and_then(|ls| {
1611− let config = self.language_config()?;
1612− let features = config
1613− .language_servers
1614− .iter()
1615− .find(|features| features.name == ls.name())?;
1616− Some(features.has_feature(LanguageServerFeature::Diagnostics))
1608+ self.language_servers_with_feature(LanguageServerFeature::Diagnostics)
1617− })
1609+ .any(|ls| ls.id() == d.language_server_id)
1618− == Some(true)
1619 })
1610 })
1620 }
1611 }
1621
1612
helix-view/src/gutter.rs+13−3
@@ -1,5 +1,7 @@
1use std::fmt::Write;
1use std::fmt::Write;
2
2
3+use helix_core::{syntax::LanguageServerFeature, Diagnostic};
4+
3use crate::{
5use crate::{
4 editor::GutterType,
6 editor::GutterType,
5 graphics::{Style, UnderlineStyle},
7 graphics::{Style, UnderlineStyle},
@@ -55,7 +57,7 @@ pub fn diagnostic<'doc>(
55 let error = theme.get("error");
57 let error = theme.get("error");
56 let info = theme.get("info");
58 let info = theme.get("info");
57 let hint = theme.get("hint");
59 let hint = theme.get("hint");
58− let diagnostics = doc.shown_diagnostics().collect::<Vec<_>>();
60+ let diagnostics = &doc.diagnostics;
59
61
60 Box::new(
62 Box::new(
61 move |line: usize, _selected: bool, first_visual_line: bool, out: &mut String| {
63 move |line: usize, _selected: bool, first_visual_line: bool, out: &mut String| {
@@ -64,12 +66,20 @@ pub fn diagnostic<'doc>(
64 }
66 }
65 use helix_core::diagnostic::Severity;
67 use helix_core::diagnostic::Severity;
66 if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) {
68 if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) {
69+ let on_line_and_is_visible = |d: &&Diagnostic| {
70+ d.line == line
71+ && doc
72+ .language_servers_with_feature(LanguageServerFeature::Diagnostics)
73+ .any(|ls| ls.id() == d.language_server_id)
74+ };
67− let after = diagnostics[index..].iter().take_while(|d| d.line == line);
75+ let after = diagnostics[index..]
76+ .iter()
77+ .take_while(on_line_and_is_visible);
68
78
69 let before = diagnostics[..index]
79 let before = diagnostics[..index]
70 .iter()
80 .iter()
71 .rev()
81 .rev()
72− .take_while(|d| d.line == line);
82+ .take_while(on_line_and_is_visible);
73
83
74 let diagnostics_on_line = after.chain(before);
84 let diagnostics_on_line = after.chain(before);
75
85