Unnamed repository; edit this file 'description' to name the repository.
internal: more obviously correct code for cache priming progerss
It doesn't make sense for the prime_caches itself send begin/end events
-- the caller knows perfectly fine when they happen!
| -rw-r--r-- | crates/ide/src/prime_caches.rs | 25 | ||||
| -rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 48 |
2 files changed, 36 insertions, 37 deletions
diff --git a/crates/ide/src/prime_caches.rs b/crates/ide/src/prime_caches.rs index ac23ed8bd2..88a9240bfa 100644 --- a/crates/ide/src/prime_caches.rs +++ b/crates/ide/src/prime_caches.rs @@ -8,17 +8,12 @@ use ide_db::base_db::SourceDatabase; use crate::RootDatabase; +/// We started indexing a crate. #[derive(Debug)] -pub enum PrimeCachesProgress { - Started, - /// We started indexing a crate. - StartedOnCrate { - on_crate: String, - n_done: usize, - n_total: usize, - }, - /// We finished indexing all crates. - Finished, +pub struct PrimeCachesProgress { + pub on_crate: String, + pub n_done: usize, + pub n_total: usize, } pub(crate) fn prime_caches(db: &RootDatabase, cb: &(dyn Fn(PrimeCachesProgress) + Sync)) { @@ -26,21 +21,13 @@ pub(crate) fn prime_caches(db: &RootDatabase, cb: &(dyn Fn(PrimeCachesProgress) let graph = db.crate_graph(); let topo = &graph.crates_in_topological_order(); - cb(PrimeCachesProgress::Started); - // Take care to emit the finish signal even when the computation is canceled. - let _d = stdx::defer(|| cb(PrimeCachesProgress::Finished)); - // FIXME: This would be easy to parallelize, since it's in the ideal ordering for that. // Unfortunately rayon prevents panics from propagation out of a `scope`, which breaks // cancellation, so we cannot use rayon. for (i, &crate_id) in topo.iter().enumerate() { let crate_name = graph[crate_id].display_name.as_deref().unwrap_or_default().to_string(); - cb(PrimeCachesProgress::StartedOnCrate { - on_crate: crate_name, - n_done: i, - n_total: topo.len(), - }); + cb(PrimeCachesProgress { on_crate: crate_name, n_done: i, n_total: topo.len() }); db.crate_def_map(crate_id); db.import_map(crate_id); } diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index eaf417117e..38e0e9c65b 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -8,11 +8,10 @@ use std::{ use always_assert::always; use crossbeam_channel::{select, Receiver}; -use ide::{FileId, PrimeCachesProgress}; use ide_db::base_db::{SourceDatabaseExt, VfsPath}; use lsp_server::{Connection, Notification, Request}; use lsp_types::notification::Notification as _; -use vfs::ChangeKind; +use vfs::{ChangeKind, FileId}; use crate::{ config::Config, @@ -67,6 +66,13 @@ pub(crate) enum Task { FetchBuildData(BuildDataProgress), } +#[derive(Debug)] +pub(crate) enum PrimeCachesProgress { + Begin, + Report(ide::PrimeCachesProgress), + End { cancelled: bool }, +} + impl fmt::Debug for Event { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let debug_verbose_not = |not: &Notification, f: &mut fmt::Formatter| { @@ -209,17 +215,17 @@ impl GlobalState { } } Task::PrimeCaches(progress) => match progress { - PrimeCachesProgress::Started => prime_caches_progress.push(progress), - PrimeCachesProgress::StartedOnCrate { .. } => { + PrimeCachesProgress::Begin => prime_caches_progress.push(progress), + PrimeCachesProgress::Report(_) => { match prime_caches_progress.last_mut() { - Some(last @ PrimeCachesProgress::StartedOnCrate { .. }) => { + Some(last @ PrimeCachesProgress::Report(_)) => { // Coalesce subsequent update events. *last = progress; } _ => prime_caches_progress.push(progress), } } - PrimeCachesProgress::Finished => prime_caches_progress.push(progress), + PrimeCachesProgress::End { .. } => prime_caches_progress.push(progress), }, Task::FetchWorkspace(progress) => { let (state, msg) = match progress { @@ -275,17 +281,20 @@ impl GlobalState { for progress in prime_caches_progress { let (state, message, fraction); match progress { - PrimeCachesProgress::Started => { + PrimeCachesProgress::Begin => { state = Progress::Begin; message = None; fraction = 0.0; } - PrimeCachesProgress::StartedOnCrate { on_crate, n_done, n_total } => { + PrimeCachesProgress::Report(report) => { state = Progress::Report; - message = Some(format!("{}/{} ({})", n_done, n_total, on_crate)); - fraction = Progress::fraction(n_done, n_total); + message = Some(format!( + "{}/{} ({})", + report.n_done, report.n_total, report.on_crate + )); + fraction = Progress::fraction(report.n_done, report.n_total); } - PrimeCachesProgress::Finished => { + PrimeCachesProgress::End { cancelled: _ } => { state = Progress::End; message = None; fraction = 1.0; @@ -422,13 +431,16 @@ impl GlobalState { self.task_pool.handle.spawn_with_sender({ let analysis = self.snapshot().analysis; move |sender| { - let cb = |progress| { - sender.send(Task::PrimeCaches(progress)).unwrap(); - }; - match analysis.prime_caches(cb) { - Ok(()) => (), - Err(_canceled) => (), - } + sender.send(Task::PrimeCaches(PrimeCachesProgress::Begin)).unwrap(); + let res = analysis.prime_caches(|progress| { + let report = PrimeCachesProgress::Report(progress); + sender.send(Task::PrimeCaches(report)).unwrap(); + }); + sender + .send(Task::PrimeCaches(PrimeCachesProgress::End { + cancelled: res.is_err(), + })) + .unwrap(); } }); } |