Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #19052 from Veykril/push-yqwutllwwyyp
Prioritize formatting thread tasks in main_loop
Lukas Wirth 2025-01-28
parent 606cfef · parent ec06a9d · commit fe253df
-rw-r--r--crates/rust-analyzer/src/handlers/dispatch.rs18
-rw-r--r--crates/rust-analyzer/src/main_loop.rs5
2 files changed, 14 insertions, 9 deletions
diff --git a/crates/rust-analyzer/src/handlers/dispatch.rs b/crates/rust-analyzer/src/handlers/dispatch.rs
index ff50f7533a..4683877db6 100644
--- a/crates/rust-analyzer/src/handlers/dispatch.rs
+++ b/crates/rust-analyzer/src/handlers/dispatch.rs
@@ -118,7 +118,7 @@ impl RequestDispatcher<'_> {
}
return self;
}
- self.on_with_thread_intent::<true, ALLOW_RETRYING, R>(
+ self.on_with_thread_intent::<false, ALLOW_RETRYING, R>(
ThreadIntent::Worker,
f,
Self::content_modified_error,
@@ -147,7 +147,7 @@ impl RequestDispatcher<'_> {
}
return self;
}
- self.on_with_thread_intent::<true, false, R>(ThreadIntent::Worker, f, on_cancelled)
+ self.on_with_thread_intent::<false, false, R>(ThreadIntent::Worker, f, on_cancelled)
}
/// Dispatches a non-latency-sensitive request onto the thread pool. When the VFS is marked not
@@ -166,7 +166,7 @@ impl RequestDispatcher<'_> {
}
return self;
}
- self.on_with_thread_intent::<true, ALLOW_RETRYING, R>(
+ self.on_with_thread_intent::<false, ALLOW_RETRYING, R>(
ThreadIntent::Worker,
f,
Self::content_modified_error,
@@ -193,7 +193,7 @@ impl RequestDispatcher<'_> {
}
return self;
}
- self.on_with_thread_intent::<true, ALLOW_RETRYING, R>(
+ self.on_with_thread_intent::<false, ALLOW_RETRYING, R>(
ThreadIntent::LatencySensitive,
f,
Self::content_modified_error,
@@ -212,7 +212,7 @@ impl RequestDispatcher<'_> {
R::Params: DeserializeOwned + panic::UnwindSafe + Send + fmt::Debug,
R::Result: Serialize,
{
- self.on_with_thread_intent::<false, false, R>(
+ self.on_with_thread_intent::<true, false, R>(
ThreadIntent::LatencySensitive,
f,
Self::content_modified_error,
@@ -231,7 +231,7 @@ impl RequestDispatcher<'_> {
}
}
- fn on_with_thread_intent<const MAIN_POOL: bool, const ALLOW_RETRYING: bool, R>(
+ fn on_with_thread_intent<const RUSTFMT: bool, const ALLOW_RETRYING: bool, R>(
&mut self,
intent: ThreadIntent,
f: fn(GlobalStateSnapshot, R::Params) -> anyhow::Result<R::Result>,
@@ -251,10 +251,10 @@ impl RequestDispatcher<'_> {
tracing::debug!(?params);
let world = self.global_state.snapshot();
- if MAIN_POOL {
- &mut self.global_state.task_pool.handle
- } else {
+ if RUSTFMT {
&mut self.global_state.fmt_pool.handle
+ } else {
+ &mut self.global_state.task_pool.handle
}
.spawn(intent, move || {
let result = panic::catch_unwind(move || {
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index d6dc8b521f..de0ee639ca 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -253,6 +253,11 @@ impl GlobalState {
&self,
inbox: &Receiver<lsp_server::Message>,
) -> Result<Option<Event>, crossbeam_channel::RecvError> {
+ // Make sure we reply to formatting requests ASAP so the editor doesn't block
+ if let Ok(task) = self.fmt_pool.receiver.try_recv() {
+ return Ok(Some(Event::Task(task)));
+ }
+
select! {
recv(inbox) -> msg =>
return Ok(msg.ok().map(Event::Lsp)),