@@ -190,15 +190,35 @@ impl GlobalState {
190190 }
191191 lsp_server:: Message :: Response ( resp) => self . complete_request ( resp) ,
192192 } ,
193- Event :: Task ( task) => match task {
194- Task :: Response ( response) => self . respond ( response) ,
195- Task :: Diagnostics ( diagnostics_per_file) => {
196- for ( file_id, diagnostics) in diagnostics_per_file {
197- self . diagnostics . set_native_diagnostics ( file_id, diagnostics)
193+ Event :: Task ( mut task) => {
194+ let _p = profile:: span ( "GlobalState::handle_event/task" ) ;
195+ let mut prime_caches_started = false ;
196+ let mut prime_caches_progress = None ;
197+ loop {
198+ match task {
199+ Task :: Response ( response) => self . respond ( response) ,
200+ Task :: Diagnostics ( diagnostics_per_file) => {
201+ for ( file_id, diagnostics) in diagnostics_per_file {
202+ self . diagnostics . set_native_diagnostics ( file_id, diagnostics)
203+ }
204+ }
205+ Task :: Workspaces ( workspaces) => self . switch_workspaces ( workspaces) ,
206+ Task :: PrimeCaches ( progress) => {
207+ if let PrimeCachesProgress :: Started = progress {
208+ prime_caches_started = true ;
209+ }
210+
211+ prime_caches_progress = Some ( progress) ;
212+ }
198213 }
214+ // Coalesce multiple task events into one loop turn
215+ task = match self . task_pool . receiver . try_recv ( ) {
216+ Ok ( task) => task,
217+ Err ( _) => break ,
218+ } ;
199219 }
200- Task :: Workspaces ( workspaces ) => self . switch_workspaces ( workspaces ) ,
201- Task :: PrimeCaches ( progress) => {
220+
221+ if let Some ( progress) = prime_caches_progress {
202222 let ( state, message, fraction) ;
203223 match progress {
204224 PrimeCachesProgress :: Started => {
@@ -218,9 +238,15 @@ impl GlobalState {
218238 }
219239 } ;
220240
221- self . report_progress ( "indexing" , state, message, Some ( fraction) ) ;
241+ if state != Progress :: Begin && prime_caches_started {
242+ // Progress indicator needs to be created first.
243+ self . report_progress ( "indexing" , Progress :: Begin , None , Some ( 0.0 ) ) ;
244+ }
245+
246+ self . report_progress ( "indexing" , state, message. clone ( ) , Some ( fraction) ) ;
247+ eprintln ! ( "progress reported: {:?}" , message) ;
222248 }
223- } ,
249+ }
224250 Event :: Vfs ( mut task) => {
225251 let _p = profile:: span ( "GlobalState::handle_event/vfs" ) ;
226252 loop {
0 commit comments