Skip to content

Commit 6e8ddac

Browse files
author
Jonas Schievink
committed
Coalesce prime_caches updates
1 parent cb04f0c commit 6e8ddac

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

crates/rust-analyzer/src/main_loop.rs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -190,15 +190,35 @@ impl GlobalState {
190190
}
191191
lsp_server::Message::Response(resp) => self.complete_request(resp),
192192
},
193-
Event::Task(task) => match task {
194-
Task::Response(response) => self.respond(response),
195-
Task::Diagnostics(diagnostics_per_file) => {
196-
for (file_id, diagnostics) in diagnostics_per_file {
197-
self.diagnostics.set_native_diagnostics(file_id, diagnostics)
193+
Event::Task(mut task) => {
194+
let _p = profile::span("GlobalState::handle_event/task");
195+
let mut prime_caches_started = false;
196+
let mut prime_caches_progress = None;
197+
loop {
198+
match task {
199+
Task::Response(response) => self.respond(response),
200+
Task::Diagnostics(diagnostics_per_file) => {
201+
for (file_id, diagnostics) in diagnostics_per_file {
202+
self.diagnostics.set_native_diagnostics(file_id, diagnostics)
203+
}
204+
}
205+
Task::Workspaces(workspaces) => self.switch_workspaces(workspaces),
206+
Task::PrimeCaches(progress) => {
207+
if let PrimeCachesProgress::Started = progress {
208+
prime_caches_started = true;
209+
}
210+
211+
prime_caches_progress = Some(progress);
212+
}
198213
}
214+
// Coalesce multiple task events into one loop turn
215+
task = match self.task_pool.receiver.try_recv() {
216+
Ok(task) => task,
217+
Err(_) => break,
218+
};
199219
}
200-
Task::Workspaces(workspaces) => self.switch_workspaces(workspaces),
201-
Task::PrimeCaches(progress) => {
220+
221+
if let Some(progress) = prime_caches_progress {
202222
let (state, message, fraction);
203223
match progress {
204224
PrimeCachesProgress::Started => {
@@ -218,9 +238,15 @@ impl GlobalState {
218238
}
219239
};
220240

221-
self.report_progress("indexing", state, message, Some(fraction));
241+
if state != Progress::Begin && prime_caches_started {
242+
// Progress indicator needs to be created first.
243+
self.report_progress("indexing", Progress::Begin, None, Some(0.0));
244+
}
245+
246+
self.report_progress("indexing", state, message.clone(), Some(fraction));
247+
eprintln!("progress reported: {:?}", message);
222248
}
223-
},
249+
}
224250
Event::Vfs(mut task) => {
225251
let _p = profile::span("GlobalState::handle_event/vfs");
226252
loop {

0 commit comments

Comments
 (0)