aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/rust-analyzer/src/main_loop.rs35
-rw-r--r--crates/rust-analyzer/src/world.rs9
2 files changed, 22 insertions, 22 deletions
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index 7825b0077..a96628235 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -208,6 +208,9 @@ pub fn main_loop(
208 ) 208 )
209 }; 209 };
210 210
211 loop_state.roots_to_scan = world_state.vfs.read().n_roots();
212 loop_state.roots_total = loop_state.roots_to_scan;
213
211 let pool = ThreadPool::default(); 214 let pool = ThreadPool::default();
212 let (task_sender, task_receiver) = unbounded::<Task>(); 215 let (task_sender, task_receiver) = unbounded::<Task>();
213 let (libdata_sender, libdata_receiver) = unbounded::<LibraryData>(); 216 let (libdata_sender, libdata_receiver) = unbounded::<LibraryData>();
@@ -333,7 +336,10 @@ struct LoopState {
333 in_flight_libraries: usize, 336 in_flight_libraries: usize,
334 pending_libraries: Vec<(SourceRootId, Vec<(FileId, RelativePathBuf, Arc<String>)>)>, 337 pending_libraries: Vec<(SourceRootId, Vec<(FileId, RelativePathBuf, Arc<String>)>)>,
335 workspace_loaded: bool, 338 workspace_loaded: bool,
339
336 roots_scanned_progress: Option<usize>, 340 roots_scanned_progress: Option<usize>,
341 roots_to_scan: usize,
342 roots_total: usize,
337} 343}
338 344
339impl LoopState { 345impl LoopState {
@@ -377,6 +383,7 @@ fn loop_turn(
377 world_state.add_lib(lib); 383 world_state.add_lib(lib);
378 world_state.maybe_collect_garbage(); 384 world_state.maybe_collect_garbage();
379 loop_state.in_flight_libraries -= 1; 385 loop_state.in_flight_libraries -= 1;
386 loop_state.roots_to_scan -= 1;
380 } 387 }
381 Event::CheckWatcher(task) => on_check_task(task, world_state, task_sender)?, 388 Event::CheckWatcher(task) => on_check_task(task, world_state, task_sender)?,
382 Event::Msg(msg) => match msg { 389 Event::Msg(msg) => match msg {
@@ -408,7 +415,7 @@ fn loop_turn(
408 }; 415 };
409 416
410 let mut state_changed = false; 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_to_scan) {
412 state_changed = true; 419 state_changed = true;
413 loop_state.pending_libraries.extend(changes); 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 if !loop_state.workspace_loaded 440 if !loop_state.workspace_loaded
431 && world_state.roots_to_scan == 0 441 && loop_state.roots_to_scan == 0
432 && loop_state.pending_libraries.is_empty() 442 && loop_state.pending_libraries.is_empty()
433 && loop_state.in_flight_libraries == 0 443 && loop_state.in_flight_libraries == 0
434 { 444 {
@@ -439,9 +449,10 @@ fn loop_turn(
439 let snap = world_state.snapshot(); 449 let snap = world_state.snapshot();
440 move || snap.analysis().prime_caches(subs).unwrap_or_else(|_: Canceled| ()) 450 move || snap.analysis().prime_caches(subs).unwrap_or_else(|_: Canceled| ())
441 }); 451 });
442 send_startup_progress(&connection.sender, loop_state, world_state); 452 }
443 } else if !loop_state.workspace_loaded { 453
444 send_startup_progress(&connection.sender, loop_state, world_state); 454 if show_progress {
455 send_startup_progress(&connection.sender, loop_state);
445 } 456 }
446 457
447 if state_changed { 458 if state_changed {
@@ -706,18 +717,10 @@ fn on_diagnostic_task(task: DiagnosticTask, msg_sender: &Sender<Message>, state:
706 } 717 }
707} 718}
708 719
709fn send_startup_progress( 720fn send_startup_progress(sender: &Sender<Message>, loop_state: &mut LoopState) {
710 sender: &Sender<Message>, 721 let total: usize = loop_state.roots_total;
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; 722 let prev_progress = loop_state.roots_scanned_progress;
720 let progress = total - world_state.roots_to_scan; 723 let progress = total - loop_state.roots_to_scan;
721 loop_state.roots_scanned_progress = Some(progress); 724 loop_state.roots_scanned_progress = Some(progress);
722 725
723 match (prev_progress, loop_state.workspace_loaded) { 726 match (prev_progress, loop_state.workspace_loaded) {
diff --git a/crates/rust-analyzer/src/world.rs b/crates/rust-analyzer/src/world.rs
index 64a7b907e..01008b09f 100644
--- a/crates/rust-analyzer/src/world.rs
+++ b/crates/rust-analyzer/src/world.rs
@@ -51,8 +51,6 @@ pub struct Options {
51pub struct WorldState { 51pub struct WorldState {
52 pub options: Options, 52 pub options: Options,
53 pub feature_flags: Arc<FeatureFlags>, 53 pub feature_flags: Arc<FeatureFlags>,
54 //FIXME: this belongs to `LoopState` rather than to `WorldState`
55 pub roots_to_scan: usize,
56 pub roots: Vec<PathBuf>, 54 pub roots: Vec<PathBuf>,
57 pub workspaces: Arc<Vec<ProjectWorkspace>>, 55 pub workspaces: Arc<Vec<ProjectWorkspace>>,
58 pub analysis_host: AnalysisHost, 56 pub analysis_host: AnalysisHost,
@@ -123,7 +121,7 @@ impl WorldState {
123 let (task_sender, task_receiver) = unbounded(); 121 let (task_sender, task_receiver) = unbounded();
124 let task_sender = Box::new(move |t| task_sender.send(t).unwrap()); 122 let task_sender = Box::new(move |t| task_sender.send(t).unwrap());
125 let (mut vfs, vfs_roots) = Vfs::new(roots, task_sender, watch); 123 let (mut vfs, vfs_roots) = Vfs::new(roots, task_sender, watch);
126 let roots_to_scan = vfs_roots.len(); 124
127 for r in vfs_roots { 125 for r in vfs_roots {
128 let vfs_root_path = vfs.root2path(r); 126 let vfs_root_path = vfs.root2path(r);
129 let is_local = folder_roots.iter().any(|it| vfs_root_path.starts_with(it)); 127 let is_local = folder_roots.iter().any(|it| vfs_root_path.starts_with(it));
@@ -190,7 +188,6 @@ impl WorldState {
190 WorldState { 188 WorldState {
191 options, 189 options,
192 feature_flags: Arc::new(feature_flags), 190 feature_flags: Arc::new(feature_flags),
193 roots_to_scan,
194 roots: folder_roots, 191 roots: folder_roots,
195 workspaces: Arc::new(workspaces), 192 workspaces: Arc::new(workspaces),
196 analysis_host, 193 analysis_host,
@@ -206,6 +203,7 @@ impl WorldState {
206 /// FIXME: better API here 203 /// FIXME: better API here
207 pub fn process_changes( 204 pub fn process_changes(
208 &mut self, 205 &mut self,
206 roots_to_scan: &mut usize,
209 ) -> Option<Vec<(SourceRootId, Vec<(FileId, RelativePathBuf, Arc<String>)>)>> { 207 ) -> Option<Vec<(SourceRootId, Vec<(FileId, RelativePathBuf, Arc<String>)>)>> {
210 let changes = self.vfs.write().commit_changes(); 208 let changes = self.vfs.write().commit_changes();
211 if changes.is_empty() { 209 if changes.is_empty() {
@@ -219,7 +217,7 @@ impl WorldState {
219 let root_path = self.vfs.read().root2path(root); 217 let root_path = self.vfs.read().root2path(root);
220 let is_local = self.roots.iter().any(|r| root_path.starts_with(r)); 218 let is_local = self.roots.iter().any(|r| root_path.starts_with(r));
221 if is_local { 219 if is_local {
222 self.roots_to_scan -= 1; 220 *roots_to_scan -= 1;
223 for (file, path, text) in files { 221 for (file, path, text) in files {
224 change.add_file(SourceRootId(root.0), FileId(file.0), path, text); 222 change.add_file(SourceRootId(root.0), FileId(file.0), path, text);
225 } 223 }
@@ -247,7 +245,6 @@ impl WorldState {
247 } 245 }
248 246
249 pub fn add_lib(&mut self, data: LibraryData) { 247 pub fn add_lib(&mut self, data: LibraryData) {
250 self.roots_to_scan -= 1;
251 let mut change = AnalysisChange::new(); 248 let mut change = AnalysisChange::new();
252 change.add_library(data); 249 change.add_library(data);
253 self.analysis_host.apply_change(change); 250 self.analysis_host.apply_change(change);