summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--helix-term/src/application.rs2
-rw-r--r--helix-term/src/commands/typed.rs2
-rw-r--r--helix-term/src/job.rs20
-rw-r--r--helix-term/tests/test/commands.rs1
4 files changed, 19 insertions, 6 deletions
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 15b44a85..2790c9a4 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -814,7 +814,7 @@ impl Application {
}
pub async fn close(&mut self) -> anyhow::Result<()> {
- self.jobs.finish().await;
+ self.jobs.finish().await?;
if self.editor.close_language_servers(None).await.is_err() {
log::error!("Timed out waiting for language servers to shutdown");
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index 3c88b0ce..5b48ca48 100644
--- a/helix-term/src/commands/typed.rs
+++ b/helix-term/src/commands/typed.rs
@@ -233,6 +233,7 @@ fn write_impl(
doc.detect_language(cx.editor.syn_loader.clone());
let _ = cx.editor.refresh_language_server(id);
}
+
Ok(())
}
@@ -422,6 +423,7 @@ fn write_quit(
event: PromptEvent,
) -> anyhow::Result<()> {
write_impl(cx, args.first(), false)?;
+ helix_lsp::block_on(cx.jobs.finish())?;
quit(cx, &[], event)
}
diff --git a/helix-term/src/job.rs b/helix-term/src/job.rs
index d21099f7..e5147992 100644
--- a/helix-term/src/job.rs
+++ b/helix-term/src/job.rs
@@ -2,7 +2,7 @@ use helix_view::Editor;
use crate::compositor::Compositor;
-use futures_util::future::{self, BoxFuture, Future, FutureExt};
+use futures_util::future::{BoxFuture, Future, FutureExt};
use futures_util::stream::{FuturesUnordered, StreamExt};
pub type Callback = Box<dyn FnOnce(&mut Editor, &mut Compositor) + Send>;
@@ -93,9 +93,21 @@ impl Jobs {
}
/// Blocks until all the jobs that need to be waited on are done.
- pub async fn finish(&mut self) {
- let wait_futures = std::mem::take(&mut self.wait_futures);
+ pub async fn finish(&mut self) -> anyhow::Result<()> {
log::debug!("waiting on jobs...");
- wait_futures.for_each(|_| future::ready(())).await
+ let mut wait_futures = std::mem::take(&mut self.wait_futures);
+ while let (Some(job), tail) = wait_futures.into_future().await {
+ match job {
+ Ok(_) => {
+ wait_futures = tail;
+ }
+ Err(e) => {
+ self.wait_futures = tail;
+ return Err(e);
+ }
+ }
+ }
+
+ Ok(())
}
}
diff --git a/helix-term/tests/test/commands.rs b/helix-term/tests/test/commands.rs
index 27b4da58..01f13c5c 100644
--- a/helix-term/tests/test/commands.rs
+++ b/helix-term/tests/test/commands.rs
@@ -9,7 +9,6 @@ use helix_term::application::Application;
use super::*;
#[tokio::test]
-#[ignore]
async fn test_write_quit_fail() -> anyhow::Result<()> {
let file = helpers::new_readonly_tempfile()?;