Skip to content

Commit 0f4a1fc

Browse files
committed
Support filter diagnostics by severity
Add config LanguageClient_diagnosticsMaxSeverity Close #846
1 parent ae23813 commit 0f4a1fc

File tree

5 files changed

+43
-2
lines changed

5 files changed

+43
-2
lines changed

doc/LanguageClient.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,13 @@ supported.
367367
Default: Empty string ('')
368368
Valid Options: string
369369

370+
2.28 g:LanguageClient_diagnosticsMaxSeverity *g:LanguageClient_diagnosticsMaxSeverity*
371+
372+
Maximum severity to show diagnostic messages.
373+
374+
Default: "Hint"
375+
Valid options: "Error" | "Warning" | "Information" | "Hint"
376+
370377
==============================================================================
371378
3. Commands *LanguageClientCommands*
372379

src/language_server_protocol.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,15 @@ impl LanguageClient {
112112

113113
let (
114114
diagnosticsSignsMax,
115+
diagnostics_max_severity,
115116
documentHighlightDisplay,
116117
selectionUI_autoOpen,
117118
use_virtual_text,
118119
echo_project_root,
119-
): (Option<u64>, Value, u8, u8, u8) = self.vim()?.eval(
120+
): (Option<u64>, String, Value, u8, u8, u8) = self.vim()?.eval(
120121
[
121122
"get(g:, 'LanguageClient_diagnosticsSignsMax', v:null)",
123+
"get(g:, 'LanguageClient_diagnosticsMaxSeverity', 'Hint')",
122124
"get(g:, 'LanguageClient_documentHighlightDisplay', {})",
123125
"!!s:GetVar('LanguageClient_selectionUI_autoOpen', 1)",
124126
"s:useVirtualText()",
@@ -184,6 +186,18 @@ impl LanguageClient {
184186

185187
let is_nvim = is_nvim == 1;
186188

189+
let diagnostics_max_severity = match diagnostics_max_severity.to_ascii_uppercase().as_str()
190+
{
191+
"ERROR" => DiagnosticSeverity::Error,
192+
"WARNING" => DiagnosticSeverity::Warning,
193+
"INFORMATION" => DiagnosticSeverity::Information,
194+
"HINT" => DiagnosticSeverity::Hint,
195+
_ => bail!(
196+
"Invalid option for LanguageClient_diagnosticsMaxSeverity: {}",
197+
diagnostics_max_severity
198+
),
199+
};
200+
187201
self.update(|state| {
188202
state.autoStart = autoStart;
189203
state.serverCommands.extend(serverCommands);
@@ -196,6 +210,7 @@ impl LanguageClient {
196210
serde_json::to_value(&state.diagnosticsDisplay)?.combine(&diagnosticsDisplay),
197211
)?;
198212
state.diagnosticsSignsMax = diagnosticsSignsMax;
213+
state.diagnostics_max_severity = diagnostics_max_severity;
199214
state.documentHighlightDisplay = serde_json::from_value(
200215
serde_json::to_value(&state.documentHighlightDisplay)?
201216
.combine(&documentHighlightDisplay),
@@ -1818,7 +1833,15 @@ impl LanguageClient {
18181833
// Unify name to avoid mismatch due to case insensitivity.
18191834
let filename = filename.canonicalize();
18201835

1821-
let mut diagnostics = params.diagnostics;
1836+
let diagnostics_max_severity = self.get(|state| state.diagnostics_max_severity)?;
1837+
let mut diagnostics = params
1838+
.diagnostics
1839+
.iter()
1840+
.filter(|&diagnostic| {
1841+
diagnostic.severity.unwrap_or(DiagnosticSeverity::Hint) <= diagnostics_max_severity
1842+
})
1843+
.map(Clone::clone)
1844+
.collect::<Vec<_>>();
18221845
diagnostics.sort_by_key(
18231846
// First sort by line.
18241847
// Then severity descendingly. Error should come last since when processing item comes

src/types.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ pub struct State {
148148
pub diagnosticsList: DiagnosticsList,
149149
pub diagnosticsDisplay: HashMap<u64, DiagnosticsDisplay>,
150150
pub diagnosticsSignsMax: Option<u64>,
151+
pub diagnostics_max_severity: DiagnosticSeverity,
151152
pub documentHighlightDisplay: HashMap<u64, DocumentHighlightDisplay>,
152153
pub windowLogMessageLevel: MessageType,
153154
pub settingsPath: String,
@@ -223,6 +224,7 @@ impl State {
223224
diagnosticsList: DiagnosticsList::Quickfix,
224225
diagnosticsDisplay: DiagnosticsDisplay::default(),
225226
diagnosticsSignsMax: None,
227+
diagnostics_max_severity: DiagnosticSeverity::Hint,
226228
documentHighlightDisplay: DocumentHighlightDisplay::default(),
227229
windowLogMessageLevel: MessageType::Warning,
228230
settingsPath: format!(".vim{}settings.json", std::path::MAIN_SEPARATOR),

tests/data/sample-cpp/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
compile_commands.json
2+
.ccls-cache

tests/data/sample-cpp/simple.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
int main() {
2+
int rc = 0;
3+
4+
if (rc == 0) {
5+
}
6+
7+
return rc;
8+
}

0 commit comments

Comments
 (0)