Skip to content

Commit 467747b

Browse files
richardtsaiautozimu
authored andcommitted
fix diagnostic sign issues (#769)
* fix diagnostic sign issues * mark all existing signs as obsolete
1 parent 1459d24 commit 467747b

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

Cargo.lock

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ edition = "2018"
88

99
[dependencies]
1010
failure = "0"
11+
itertools = "0.8"
1112
log = "0.4"
1213
log4rs = "0"
1314
structopt = "0"

src/language_server_protocol.rs

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::lsp::request::Request;
77
use crate::rpcclient::RpcClient;
88
use crate::sign::Sign;
99
use failure::err_msg;
10+
use itertools::Itertools;
1011
use notify::Watcher;
1112
use std::sync::mpsc;
1213
use vim::try_get;
@@ -2226,31 +2227,38 @@ impl LanguageClient {
22262227
let bufnr = self.vim()?.get_bufnr(&filename, params)?;
22272228
let viewport = self.vim()?.get_viewport(params)?;
22282229

2230+
// use the most severe diagnostic of each line as the sign
22292231
let signs_next: Vec<_> = self.update(|state| {
2232+
let limit = if let Some(n) = state.diagnosticsSignsMax {
2233+
n as usize
2234+
} else {
2235+
usize::max_value()
2236+
};
22302237
Ok(state
22312238
.diagnostics
22322239
.entry(filename.clone())
22332240
.or_default()
22342241
.iter()
2235-
.filter_map(|diag| {
2236-
if viewport.overlaps(diag.range) {
2237-
let name = format!(
2238-
"LanguageClient{:?}",
2239-
diag.severity.unwrap_or(DiagnosticSeverity::Hint)
2240-
);
2241-
Some(Sign::new(diag.range.start.line, name))
2242-
} else {
2243-
None
2244-
}
2242+
.filter(|diag| viewport.overlaps(diag.range))
2243+
.map(|diag| {
2244+
(
2245+
diag.range.start.line,
2246+
diag.severity.unwrap_or(DiagnosticSeverity::Hint),
2247+
)
22452248
})
2249+
.group_by(|(line, _)| *line)
2250+
.into_iter()
2251+
.filter_map(|(_, group)| group.min_by_key(|(_, severity)| *severity))
2252+
.take(limit)
2253+
.map(|(line, severity)| Sign::new(line, format!("LanguageClient{:?}", severity)))
22462254
.collect())
22472255
})?;
22482256
let signs_prev: Vec<_> = self.update(|state| {
22492257
Ok(state
22502258
.signs
22512259
.entry(filename.clone())
22522260
.or_default()
2253-
.range(viewport.start..viewport.end)
2261+
.iter()
22542262
.map(|(_, sign)| sign.clone())
22552263
.collect())
22562264
})?;
@@ -2280,12 +2288,14 @@ impl LanguageClient {
22802288
.set_signs(&filename, &signs_to_add, &signs_to_delete)?;
22812289
self.update(|state| {
22822290
let signs = state.signs.entry(filename.clone()).or_default();
2283-
for sign in signs_to_add {
2284-
signs.insert(sign.line, sign);
2285-
}
2291+
// signs might be deleted AND added in the same line to change severity,
2292+
// so deletions must be before additions
22862293
for sign in signs_to_delete {
22872294
signs.remove(&sign.line);
22882295
}
2296+
for sign in signs_to_add {
2297+
signs.insert(sign.line, sign);
2298+
}
22892299
Ok(())
22902300
})?;
22912301

0 commit comments

Comments
 (0)