@@ -7,6 +7,7 @@ use crate::lsp::request::Request;
77use crate :: rpcclient:: RpcClient ;
88use crate :: sign:: Sign ;
99use failure:: err_msg;
10+ use itertools:: Itertools ;
1011use notify:: Watcher ;
1112use std:: sync:: mpsc;
1213use 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