@@ -3,7 +3,11 @@ use std::sync::atomic::{AtomicUsize, Ordering};
33use crate :: server:: { Notification , Output } ;
44use lazy_static:: lazy_static;
55use lsp_types:: notification:: { Progress , PublishDiagnostics , ShowMessage } ;
6- use lsp_types:: { MessageType , ProgressParams , PublishDiagnosticsParams , ShowMessageParams } ;
6+ use lsp_types:: {
7+ MessageType , NumberOrString , ProgressParams , ProgressParamsValue , PublishDiagnosticsParams ,
8+ ShowMessageParams , WorkDoneProgress , WorkDoneProgressBegin , WorkDoneProgressEnd ,
9+ WorkDoneProgressReport ,
10+ } ;
711
812/// Communication of build progress back to the client.
913pub trait ProgressNotifier : Send {
@@ -37,11 +41,16 @@ fn new_progress_params(title: String) -> ProgressParams {
3741 }
3842
3943 ProgressParams {
40- id : format ! ( "progress_{}" , PROGRESS_ID_COUNTER . fetch_add( 1 , Ordering :: SeqCst ) ) ,
41- title,
42- message : None ,
43- percentage : None ,
44- done : None ,
44+ token : NumberOrString :: String ( format ! (
45+ "progress_{}" ,
46+ PROGRESS_ID_COUNTER . fetch_add( 1 , Ordering :: SeqCst )
47+ ) ) ,
48+ value : ProgressParamsValue :: WorkDone ( WorkDoneProgress :: Begin ( WorkDoneProgressBegin {
49+ title,
50+ cancellable : None ,
51+ message : None ,
52+ percentage : None ,
53+ } ) ) ,
4554 }
4655}
4756
@@ -67,15 +76,45 @@ impl<O: Output> ProgressNotifier for BuildProgressNotifier<O> {
6776 }
6877 fn notify_progress ( & self , update : ProgressUpdate ) {
6978 let mut params = self . progress_params . clone ( ) ;
70- match update {
71- ProgressUpdate :: Message ( s) => params. message = Some ( s) ,
72- ProgressUpdate :: Percentage ( p) => params. percentage = Some ( p) ,
73- }
79+
80+ // set the value to WorkDoneProgress::Report if it is not
81+ match & mut params. value {
82+ ProgressParamsValue :: WorkDone ( work) => match work {
83+ WorkDoneProgress :: Report ( _) => { }
84+ _ => {
85+ params. value = ProgressParamsValue :: WorkDone ( WorkDoneProgress :: Report (
86+ WorkDoneProgressReport {
87+ cancellable : None ,
88+ message : None ,
89+ percentage : None ,
90+ } ,
91+ ) )
92+ }
93+ } ,
94+ } ;
95+
96+ match & mut params. value {
97+ ProgressParamsValue :: WorkDone ( work) => match work {
98+ WorkDoneProgress :: Report ( value) => match update {
99+ ProgressUpdate :: Message ( m) => {
100+ value. message = Some ( m) ;
101+ }
102+ ProgressUpdate :: Percentage ( p) => {
103+ value. percentage = Some ( p as u32 ) ;
104+ }
105+ } ,
106+ _ => {
107+ unreachable ! ( "params.value is set to WorkDoneProgress::Report" ) ;
108+ }
109+ } ,
110+ } ;
74111 self . out . notify ( Notification :: < Progress > :: new ( params) ) ;
75112 }
76113 fn notify_end_progress ( & self ) {
77114 let mut params = self . progress_params . clone ( ) ;
78- params. done = Some ( true ) ;
115+ params. value = ProgressParamsValue :: WorkDone ( WorkDoneProgress :: End ( WorkDoneProgressEnd {
116+ message : None ,
117+ } ) ) ;
79118 self . out . notify ( Notification :: < Progress > :: new ( params) ) ;
80119 }
81120}
@@ -110,13 +149,15 @@ impl<O: Output> DiagnosticsNotifier for BuildDiagnosticsNotifier<O> {
110149 }
111150 fn notify_error_diagnostics ( & self , message : String ) {
112151 self . out . notify ( Notification :: < ShowMessage > :: new ( ShowMessageParams {
113- typ : MessageType :: Error ,
152+ typ : MessageType :: ERROR ,
114153 message,
115154 } ) ) ;
116155 }
117156 fn notify_end_diagnostics ( & self ) {
118157 let mut params = self . progress_params . clone ( ) ;
119- params. done = Some ( true ) ;
158+ params. value = ProgressParamsValue :: WorkDone ( WorkDoneProgress :: End ( WorkDoneProgressEnd {
159+ message : None ,
160+ } ) ) ;
120161 self . out . notify ( Notification :: < Progress > :: new ( params) ) ;
121162 }
122163}
0 commit comments