diff options
-rw-r--r-- | crates/ra_ide/src/lib.rs | 5 | ||||
-rw-r--r-- | crates/ra_ide/src/prime_caches.rs | 15 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 5 |
3 files changed, 25 insertions, 0 deletions
diff --git a/crates/ra_ide/src/lib.rs b/crates/ra_ide/src/lib.rs index 5a41f702e..4dfe0553e 100644 --- a/crates/ra_ide/src/lib.rs +++ b/crates/ra_ide/src/lib.rs | |||
@@ -13,6 +13,7 @@ | |||
13 | pub mod mock_analysis; | 13 | pub mod mock_analysis; |
14 | mod source_change; | 14 | mod source_change; |
15 | 15 | ||
16 | mod prime_caches; | ||
16 | mod status; | 17 | mod status; |
17 | mod completion; | 18 | mod completion; |
18 | mod runnables; | 19 | mod runnables; |
@@ -227,6 +228,10 @@ impl Analysis { | |||
227 | self.with_db(|db| status::status(&*db)) | 228 | self.with_db(|db| status::status(&*db)) |
228 | } | 229 | } |
229 | 230 | ||
231 | pub fn prime_caches(&self, files: Vec<FileId>) -> Cancelable<()> { | ||
232 | self.with_db(|db| prime_caches::prime_caches(db, files)) | ||
233 | } | ||
234 | |||
230 | /// Gets the text of the source file. | 235 | /// Gets the text of the source file. |
231 | pub fn file_text(&self, file_id: FileId) -> Cancelable<Arc<String>> { | 236 | pub fn file_text(&self, file_id: FileId) -> Cancelable<Arc<String>> { |
232 | self.with_db(|db| db.file_text(file_id)) | 237 | 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 000000000..628c989bf --- /dev/null +++ b/crates/ra_ide/src/prime_caches.rs | |||
@@ -0,0 +1,15 @@ | |||
1 | //! rust-analyzer is lazy and doesn't not compute anything unless asked. This | ||
2 | //! sometimes is counter productive when, for example, the first goto definition | ||
3 | //! request takes longer to compute. This modules implemented prepopulating of | ||
4 | //! various caches, it's not really advanced at the moment. | ||
5 | |||
6 | use hir::Semantics; | ||
7 | |||
8 | use crate::{FileId, RootDatabase}; | ||
9 | |||
10 | pub(crate) fn prime_caches(db: &RootDatabase, files: Vec<FileId>) { | ||
11 | let sema = Semantics::new(db); | ||
12 | for file in files { | ||
13 | let _ = sema.to_module_def(file); | ||
14 | } | ||
15 | } | ||
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index fe804aada..580ad1f2c 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -426,6 +426,11 @@ fn loop_turn( | |||
426 | show_message(req::MessageType::Info, msg, &connection.sender); | 426 | show_message(req::MessageType::Info, msg, &connection.sender); |
427 | } | 427 | } |
428 | world_state.check_watcher.update(); | 428 | world_state.check_watcher.update(); |
429 | pool.execute({ | ||
430 | let subs = loop_state.subscriptions.subscriptions(); | ||
431 | let snap = world_state.snapshot(); | ||
432 | move || snap.analysis().prime_caches(subs).unwrap_or_else(|_: Canceled| ()) | ||
433 | }); | ||
429 | } | 434 | } |
430 | 435 | ||
431 | if state_changed { | 436 | if state_changed { |