@@ -208,6 +208,9 @@ pub fn main_loop(
208208 )
209209 } ;
210210
211+ loop_state. roots_total = world_state. vfs . read ( ) . n_roots ( ) ;
212+ loop_state. roots_scanned = 0 ;
213+
211214 let pool = ThreadPool :: default ( ) ;
212215 let ( task_sender, task_receiver) = unbounded :: < Task > ( ) ;
213216 let ( libdata_sender, libdata_receiver) = unbounded :: < LibraryData > ( ) ;
@@ -333,7 +336,10 @@ struct LoopState {
333336 in_flight_libraries : usize ,
334337 pending_libraries : Vec < ( SourceRootId , Vec < ( FileId , RelativePathBuf , Arc < String > ) > ) > ,
335338 workspace_loaded : bool ,
336- roots_scanned_progress : Option < usize > ,
339+
340+ roots_progress_reported : Option < usize > ,
341+ roots_scanned : usize ,
342+ roots_total : usize ,
337343}
338344
339345impl LoopState {
@@ -377,6 +383,7 @@ fn loop_turn(
377383 world_state. add_lib ( lib) ;
378384 world_state. maybe_collect_garbage ( ) ;
379385 loop_state. in_flight_libraries -= 1 ;
386+ loop_state. roots_scanned += 1 ;
380387 }
381388 Event :: CheckWatcher ( task) => on_check_task ( task, world_state, task_sender) ?,
382389 Event :: Msg ( msg) => match msg {
@@ -408,7 +415,7 @@ fn loop_turn(
408415 } ;
409416
410417 let mut state_changed = false ;
411- if let Some ( changes) = world_state. process_changes ( ) {
418+ if let Some ( changes) = world_state. process_changes ( & mut loop_state . roots_scanned ) {
412419 state_changed = true ;
413420 loop_state. pending_libraries . extend ( changes) ;
414421 }
@@ -427,8 +434,11 @@ fn loop_turn(
427434 } ) ;
428435 }
429436
437+ let show_progress = !loop_state. workspace_loaded
438+ && world_state. feature_flags . get ( "notifications.workspace-loaded" ) ;
439+
430440 if !loop_state. workspace_loaded
431- && world_state . roots_to_scan == 0
441+ && loop_state . roots_scanned == loop_state . roots_total
432442 && loop_state. pending_libraries . is_empty ( )
433443 && loop_state. in_flight_libraries == 0
434444 {
@@ -439,9 +449,10 @@ fn loop_turn(
439449 let snap = world_state. snapshot ( ) ;
440450 move || snap. analysis ( ) . prime_caches ( subs) . unwrap_or_else ( |_: Canceled | ( ) )
441451 } ) ;
442- send_startup_progress ( & connection. sender , loop_state, world_state) ;
443- } else if !loop_state. workspace_loaded {
444- send_startup_progress ( & connection. sender , loop_state, world_state) ;
452+ }
453+
454+ if show_progress {
455+ send_startup_progress ( & connection. sender , loop_state) ;
445456 }
446457
447458 if state_changed {
@@ -706,21 +717,13 @@ fn on_diagnostic_task(task: DiagnosticTask, msg_sender: &Sender<Message>, state:
706717 }
707718}
708719
709- fn send_startup_progress (
710- sender : & Sender < Message > ,
711- loop_state : & mut LoopState ,
712- world_state : & WorldState ,
713- ) {
714- if !world_state. feature_flags . get ( "notifications.workspace-loaded" ) {
715- return ;
716- }
717-
718- let total: usize = world_state. workspaces . iter ( ) . map ( |it| it. n_packages ( ) ) . sum ( ) ;
719- let prev_progress = loop_state. roots_scanned_progress ;
720- let progress = total - world_state. roots_to_scan ;
721- loop_state. roots_scanned_progress = Some ( progress) ;
720+ fn send_startup_progress ( sender : & Sender < Message > , loop_state : & mut LoopState ) {
721+ let total: usize = loop_state. roots_total ;
722+ let prev = loop_state. roots_progress_reported ;
723+ let progress = loop_state. roots_scanned ;
724+ loop_state. roots_progress_reported = Some ( progress) ;
722725
723- match ( prev_progress , loop_state. workspace_loaded ) {
726+ match ( prev , loop_state. workspace_loaded ) {
724727 ( None , false ) => {
725728 let work_done_progress_create = request_new :: < req:: WorkDoneProgressCreate > (
726729 loop_state. next_request_id ( ) ,
0 commit comments