Skip to content

Commit 6677ccd

Browse files
Merge #3764
3764: Move roots_to_scan to LoopState r=matklad a=edwin0cheng closes #3760 cc @lnicola Co-authored-by: Edwin Cheng <edwin0cheng@gmail.com>
2 parents 1c2d413 + 36812b9 commit 6677ccd

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed

crates/rust-analyzer/src/main_loop.rs

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

339345
impl 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(),

crates/rust-analyzer/src/world.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ pub struct Options {
5151
pub struct WorldState {
5252
pub options: Options,
5353
pub feature_flags: Arc<FeatureFlags>,
54-
//FIXME: this belongs to `LoopState` rather than to `WorldState`
55-
pub roots_to_scan: usize,
5654
pub roots: Vec<PathBuf>,
5755
pub workspaces: Arc<Vec<ProjectWorkspace>>,
5856
pub analysis_host: AnalysisHost,
@@ -123,7 +121,7 @@ impl WorldState {
123121
let (task_sender, task_receiver) = unbounded();
124122
let task_sender = Box::new(move |t| task_sender.send(t).unwrap());
125123
let (mut vfs, vfs_roots) = Vfs::new(roots, task_sender, watch);
126-
let roots_to_scan = vfs_roots.len();
124+
127125
for r in vfs_roots {
128126
let vfs_root_path = vfs.root2path(r);
129127
let is_local = folder_roots.iter().any(|it| vfs_root_path.starts_with(it));
@@ -190,7 +188,6 @@ impl WorldState {
190188
WorldState {
191189
options,
192190
feature_flags: Arc::new(feature_flags),
193-
roots_to_scan,
194191
roots: folder_roots,
195192
workspaces: Arc::new(workspaces),
196193
analysis_host,
@@ -206,6 +203,7 @@ impl WorldState {
206203
/// FIXME: better API here
207204
pub fn process_changes(
208205
&mut self,
206+
roots_scanned: &mut usize,
209207
) -> Option<Vec<(SourceRootId, Vec<(FileId, RelativePathBuf, Arc<String>)>)>> {
210208
let changes = self.vfs.write().commit_changes();
211209
if changes.is_empty() {
@@ -219,7 +217,7 @@ impl WorldState {
219217
let root_path = self.vfs.read().root2path(root);
220218
let is_local = self.roots.iter().any(|r| root_path.starts_with(r));
221219
if is_local {
222-
self.roots_to_scan -= 1;
220+
*roots_scanned += 1;
223221
for (file, path, text) in files {
224222
change.add_file(SourceRootId(root.0), FileId(file.0), path, text);
225223
}
@@ -247,7 +245,6 @@ impl WorldState {
247245
}
248246

249247
pub fn add_lib(&mut self, data: LibraryData) {
250-
self.roots_to_scan -= 1;
251248
let mut change = AnalysisChange::new();
252249
change.add_library(data);
253250
self.analysis_host.apply_change(change);

0 commit comments

Comments
 (0)