From fc970d188e9eeca02bc189bbcc0082a0bbf13a57 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 5 Mar 2020 12:42:04 +0100 Subject: [PATCH] Prime open files on load --- crates/ra_ide/src/lib.rs | 5 +++++ crates/ra_ide/src/prime_caches.rs | 15 +++++++++++++++ crates/rust-analyzer/src/main_loop.rs | 5 +++++ 3 files changed, 25 insertions(+) create mode 100644 crates/ra_ide/src/prime_caches.rs diff --git a/crates/ra_ide/src/lib.rs b/crates/ra_ide/src/lib.rs index 5a41f702ef..4dfe0553e1 100644 --- a/crates/ra_ide/src/lib.rs +++ b/crates/ra_ide/src/lib.rs @@ -13,6 +13,7 @@ pub mod mock_analysis; mod source_change; +mod prime_caches; mod status; mod completion; mod runnables; @@ -227,6 +228,10 @@ impl Analysis { self.with_db(|db| status::status(&*db)) } + pub fn prime_caches(&self, files: Vec) -> Cancelable<()> { + self.with_db(|db| prime_caches::prime_caches(db, files)) + } + /// Gets the text of the source file. pub fn file_text(&self, file_id: FileId) -> Cancelable> { self.with_db(|db| db.file_text(file_id)) diff --git a/crates/ra_ide/src/prime_caches.rs b/crates/ra_ide/src/prime_caches.rs new file mode 100644 index 0000000000..628c989bfc --- /dev/null +++ b/crates/ra_ide/src/prime_caches.rs @@ -0,0 +1,15 @@ +//! rust-analyzer is lazy and doesn't not compute anything unless asked. This +//! sometimes is counter productive when, for example, the first goto definition +//! request takes longer to compute. This modules implemented prepopulating of +//! various caches, it's not really advanced at the moment. + +use hir::Semantics; + +use crate::{FileId, RootDatabase}; + +pub(crate) fn prime_caches(db: &RootDatabase, files: Vec) { + let sema = Semantics::new(db); + for file in files { + let _ = sema.to_module_def(file); + } +} diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index fe804aadaa..580ad1f2c8 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -426,6 +426,11 @@ fn loop_turn( show_message(req::MessageType::Info, msg, &connection.sender); } world_state.check_watcher.update(); + pool.execute({ + let subs = loop_state.subscriptions.subscriptions(); + let snap = world_state.snapshot(); + move || snap.analysis().prime_caches(subs).unwrap_or_else(|_: Canceled| ()) + }); } if state_changed {