@@ -208,6 +208,9 @@ pub fn main_loop(
208
208
)
209
209
} ;
210
210
211
+ loop_state. roots_total = world_state. vfs . read ( ) . n_roots ( ) ;
212
+ loop_state. roots_scanned = 0 ;
213
+
211
214
let pool = ThreadPool :: default ( ) ;
212
215
let ( task_sender, task_receiver) = unbounded :: < Task > ( ) ;
213
216
let ( libdata_sender, libdata_receiver) = unbounded :: < LibraryData > ( ) ;
@@ -333,7 +336,10 @@ struct LoopState {
333
336
in_flight_libraries : usize ,
334
337
pending_libraries : Vec < ( SourceRootId , Vec < ( FileId , RelativePathBuf , Arc < String > ) > ) > ,
335
338
workspace_loaded : bool ,
336
- roots_scanned_progress : Option < usize > ,
339
+
340
+ roots_progress_reported : Option < usize > ,
341
+ roots_scanned : usize ,
342
+ roots_total : usize ,
337
343
}
338
344
339
345
impl LoopState {
@@ -377,6 +383,7 @@ fn loop_turn(
377
383
world_state. add_lib ( lib) ;
378
384
world_state. maybe_collect_garbage ( ) ;
379
385
loop_state. in_flight_libraries -= 1 ;
386
+ loop_state. roots_scanned += 1 ;
380
387
}
381
388
Event :: CheckWatcher ( task) => on_check_task ( task, world_state, task_sender) ?,
382
389
Event :: Msg ( msg) => match msg {
@@ -408,7 +415,7 @@ fn loop_turn(
408
415
} ;
409
416
410
417
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 ) {
412
419
state_changed = true ;
413
420
loop_state. pending_libraries . extend ( changes) ;
414
421
}
@@ -427,8 +434,11 @@ fn loop_turn(
427
434
} ) ;
428
435
}
429
436
437
+ let show_progress = !loop_state. workspace_loaded
438
+ && world_state. feature_flags . get ( "notifications.workspace-loaded" ) ;
439
+
430
440
if !loop_state. workspace_loaded
431
- && world_state . roots_to_scan == 0
441
+ && loop_state . roots_scanned == loop_state . roots_total
432
442
&& loop_state. pending_libraries . is_empty ( )
433
443
&& loop_state. in_flight_libraries == 0
434
444
{
@@ -439,9 +449,10 @@ fn loop_turn(
439
449
let snap = world_state. snapshot ( ) ;
440
450
move || snap. analysis ( ) . prime_caches ( subs) . unwrap_or_else ( |_: Canceled | ( ) )
441
451
} ) ;
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) ;
445
456
}
446
457
447
458
if state_changed {
@@ -706,21 +717,13 @@ fn on_diagnostic_task(task: DiagnosticTask, msg_sender: &Sender<Message>, state:
706
717
}
707
718
}
708
719
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) ;
722
725
723
- match ( prev_progress , loop_state. workspace_loaded ) {
726
+ match ( prev , loop_state. workspace_loaded ) {
724
727
( None , false ) => {
725
728
let work_done_progress_create = request_new :: < req:: WorkDoneProgressCreate > (
726
729
loop_state. next_request_id ( ) ,
0 commit comments