From e5fd5e2a9c78a3f391cda24cb57d187e248f06d1 Mon Sep 17 00:00:00 2001 From: Skyler Hawthorne Date: Tue, 9 Aug 2022 00:32:04 -0400 Subject: [PATCH] fix panic when view of pending write is closed --- helix-term/src/commands/typed.rs | 18 ++++++++---------- helix-term/src/compositor.rs | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index a687b8549..fa2ba5e6d 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -34,6 +34,7 @@ fn quit(cx: &mut compositor::Context, args: &[Cow], event: PromptEvent) -> buffers_remaining_impl(cx.editor)? } + cx.block_try_flush_writes()?; cx.editor.close(view!(cx.editor).id); Ok(()) @@ -518,15 +519,7 @@ fn write_quit( } write_impl(cx, args.first(), false)?; - - tokio::task::block_in_place(|| helix_lsp::block_on(cx.jobs.finish(Some(cx.editor), None)))?; - - let doc = doc_mut!(cx.editor); - - tokio::task::block_in_place(|| helix_lsp::block_on(doc.try_flush_saves())) - .map(|result| result.map(|_| ())) - .unwrap_or(Ok(()))?; - + cx.block_try_flush_writes()?; quit(cx, &[], event) } @@ -540,6 +533,7 @@ fn force_write_quit( } write_impl(cx, args.first(), true)?; + cx.block_try_flush_writes()?; force_quit(cx, &[], event) } @@ -613,6 +607,8 @@ fn write_all_impl( buffers_remaining_impl(cx.editor)?; } + cx.block_try_flush_writes()?; + // close all views let views: Vec<_> = cx.editor.tree.views().map(|(view, _)| view.id).collect(); for view_id in views { @@ -682,6 +678,7 @@ fn quit_all( return Ok(()); } + cx.block_try_flush_writes()?; quit_all_impl(cx.editor, false) } @@ -710,8 +707,9 @@ fn cquit( .first() .and_then(|code| code.parse::().ok()) .unwrap_or(1); - cx.editor.exit_code = exit_code; + cx.editor.exit_code = exit_code; + cx.block_try_flush_writes()?; quit_all_impl(cx.editor, false) } diff --git a/helix-term/src/compositor.rs b/helix-term/src/compositor.rs index c0898dae2..6ef77341d 100644 --- a/helix-term/src/compositor.rs +++ b/helix-term/src/compositor.rs @@ -27,6 +27,24 @@ pub struct Context<'a> { pub jobs: &'a mut Jobs, } +impl<'a> Context<'a> { + /// Waits on all pending jobs, and then tries to flush all pending write + /// operations for the current document. + pub fn block_try_flush_writes(&mut self) -> anyhow::Result<()> { + tokio::task::block_in_place(|| { + helix_lsp::block_on(self.jobs.finish(Some(self.editor), None)) + })?; + + let doc = doc_mut!(self.editor); + + tokio::task::block_in_place(|| helix_lsp::block_on(doc.try_flush_saves())) + .map(|result| result.map(|_| ())) + .unwrap_or(Ok(()))?; + + Ok(()) + } +} + pub trait Component: Any + AnyComponent { /// Process input events, return true if handled. fn handle_event(&mut self, _event: &Event, _ctx: &mut Context) -> EventResult {