From 2d684573af822beb0e0da89f9e8840b63b0ec2f6 Mon Sep 17 00:00:00 2001 From: Martin Asquino Date: Fri, 11 Dec 2020 18:05:04 -0300 Subject: [PATCH] Fix priority of diagnostic's virtual texts --- src/config/mod.rs | 7 +++++- src/language_server_protocol.rs | 38 +++++++++++++++++---------------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/config/mod.rs b/src/config/mod.rs index 96998abc8..a59082c65 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -194,6 +194,11 @@ impl Config { None => HoverPreviewOption::Auto, }; + let mut diagnostics_display = DiagnosticsDisplay::default(); + res.diagnostics_display.into_iter().for_each(|(k, v)| { + diagnostics_display.insert(k, v); + }); + Ok(Config { auto_start: res.auto_start == 1, server_commands: res.server_commands, @@ -210,7 +215,7 @@ impl Config { ), diagnostics_enable: res.diagnostics_enable == 1, diagnostics_list, - diagnostics_display: res.diagnostics_display, + diagnostics_display, code_lens_display: res.code_lens_display.unwrap_or_default(), window_log_message_level: message_type(&res.window_log_message_level)?, hover_preview, diff --git a/src/language_server_protocol.rs b/src/language_server_protocol.rs index 5c32103bd..d3361a742 100644 --- a/src/language_server_protocol.rs +++ b/src/language_server_protocol.rs @@ -3033,26 +3033,28 @@ impl LanguageClient { viewport: &viewport::Viewport, ) -> Result> { let mut virtual_texts = vec![]; - let diagnostics = self.get_state(|state| state.diagnostics.clone())?; + let diagnostics = + self.get_state(|state| state.diagnostics.get(filename).cloned().unwrap_or_default())?; + let diagnostics: Vec = diagnostics + .into_iter() + .sorted_by(|a, b| Ord::cmp(&b.severity, &a.severity)) + .collect(); let diagnostics_display = self.get_config(|c| c.diagnostics_display.clone())?; - let diag_list = diagnostics.get(filename); - if let Some(diag_list) = diag_list { - for diag in diag_list { - if viewport.overlaps(diag.range) { - let mut explanation = diag.message.clone(); - if let Some(source) = &diag.source { - explanation = format!("{}: {}\n", source, explanation); - } - virtual_texts.push(VirtualText { - line: diag.range.start.line, - text: explanation.replace("\n", " "), - hl_group: diagnostics_display - .get(&(diag.severity.unwrap_or(DiagnosticSeverity::Hint) as u64)) - .ok_or_else(|| anyhow!("Failed to get display"))? - .virtual_texthl - .clone(), - }); + for diag in diagnostics { + if viewport.overlaps(diag.range) { + let mut explanation = diag.message.clone(); + if let Some(source) = &diag.source { + explanation = format!("{}: {}\n", source, explanation); } + virtual_texts.push(VirtualText { + line: diag.range.start.line, + text: explanation.replace("\n", " "), + hl_group: diagnostics_display + .get(&(diag.severity.unwrap_or(DiagnosticSeverity::Hint) as u64)) + .ok_or_else(|| anyhow!("Failed to get display"))? + .virtual_texthl + .clone(), + }); } }