@@ -367,6 +367,7 @@ impl State {
367
367
} )
368
368
. collect ( ) ;
369
369
signs. sort_unstable ( ) ;
370
+ signs. dedup_by_key ( |s| s. line ) ;
370
371
371
372
let cmd = self . update ( |state| {
372
373
let signs_prev = state. signs . remove ( filename) . unwrap_or_default ( ) ;
@@ -1663,19 +1664,24 @@ impl State {
1663
1664
// Unify name to avoid mismatch due to case insensitivity.
1664
1665
let filename = filename. canonicalize ( ) ;
1665
1666
1666
- self . update ( |state| {
1667
- state
1668
- . diagnostics
1669
- . insert ( filename. clone ( ) , params. diagnostics . clone ( ) ) ;
1670
- Ok ( ( ) )
1671
- } ) ?;
1667
+ // Make sure error comes after warning.
1668
+ let mut diagnostics = params. diagnostics . clone ( ) ;
1669
+ diagnostics. sort_by_key ( |d| {
1670
+ (
1671
+ d. range . start . line ,
1672
+ -( d. severity . map_or ( 4 , |s| s. to_int ( ) . unwrap_or ( 4 ) ) as i64 ) ,
1673
+ )
1674
+ } ) ;
1675
+
1676
+ self . diagnostics
1677
+ . insert ( filename. clone ( ) , diagnostics. clone ( ) ) ;
1672
1678
self . update_quickfixlist ( ) ?;
1673
1679
1674
1680
let current_filename: String = self . eval ( VimVar :: Filename ) ?;
1675
1681
if filename != current_filename. canonicalize ( ) {
1676
1682
return Ok ( ( ) ) ;
1677
1683
}
1678
- self . display_diagnostics ( & current_filename, & params . diagnostics ) ?;
1684
+ self . display_diagnostics ( & current_filename, & diagnostics) ?;
1679
1685
self . call :: < _ , u8 > ( None , "s:ExecuteAutocmd" , "LanguageClientDiagnosticsChanged" ) ?;
1680
1686
1681
1687
info ! ( "End {}" , lsp:: notification:: PublishDiagnostics :: METHOD ) ;
0 commit comments