@@ -1,5 +1,7 @@
11use std::fmt::Write;
22
3+use helix_core::{syntax::LanguageServerFeature, Diagnostic};
4+
35use crate::{
46 editor::GutterType,
57 graphics::{Style, UnderlineStyle},
@@ -55,7 +57,7 @@ pub fn diagnostic<'doc>(
5557 let error = theme.get("error");
5658 let info = theme.get("info");
5759 let hint = theme.get("hint");
58− let diagnostics = doc.shown_diagnostics().collect::<Vec<_>>();
60+ let diagnostics = &doc.diagnostics;
5961
6062 Box::new(
6163 move |line: usize, _selected: bool, first_visual_line: bool, out: &mut String| {
@@ -64,12 +66,20 @@ pub fn diagnostic<'doc>(
6466 }
6567 use helix_core::diagnostic::Severity;
6668 if let Ok(index) = diagnostics.binary_search_by_key(&line, |d| d.line) {
67− let after = diagnostics[index..].iter().take_while(|d| d.line == 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+ };
75+ let after = diagnostics[index..]
76+ .iter()
77+ .take_while(on_line_and_is_visible);
6878
6979 let before = diagnostics[..index]
7080 .iter()
7181 .rev()
72− .take_while(|d| d.line == line);
82+ .take_while(on_line_and_is_visible);
7383
7484 let diagnostics_on_line = after.chain(before);
7585