Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/handlers/completion/resolve.rs')
| -rw-r--r-- | helix-term/src/handlers/completion/resolve.rs | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/helix-term/src/handlers/completion/resolve.rs b/helix-term/src/handlers/completion/resolve.rs index 802d6f51..0b2c9067 100644 --- a/helix-term/src/handlers/completion/resolve.rs +++ b/helix-term/src/handlers/completion/resolve.rs @@ -4,10 +4,9 @@ use helix_lsp::lsp; use tokio::sync::mpsc::Sender; use tokio::time::{Duration, Instant}; -use helix_event::{send_blocking, AsyncHook, TaskController, TaskHandle}; +use helix_event::{send_blocking, AsyncHook, CancelRx}; use helix_view::Editor; -use super::LspCompletionItem; use crate::handlers::completion::CompletionItem; use crate::job; @@ -23,7 +22,7 @@ use crate::job; /// > 'completionItem/resolve' request is sent with the selected completion item as a parameter. /// > The returned completion item should have the documentation property filled in. pub struct ResolveHandler { - last_request: Option<Arc<LspCompletionItem>>, + last_request: Option<Arc<CompletionItem>>, resolver: Sender<ResolveRequest>, } @@ -31,11 +30,15 @@ impl ResolveHandler { pub fn new() -> ResolveHandler { ResolveHandler { last_request: None, - resolver: ResolveTimeout::default().spawn(), + resolver: ResolveTimeout { + next_request: None, + in_flight: None, + } + .spawn(), } } - pub fn ensure_item_resolved(&mut self, editor: &mut Editor, item: &mut LspCompletionItem) { + pub fn ensure_item_resolved(&mut self, editor: &mut Editor, item: &mut CompletionItem) { if item.resolved { return; } @@ -90,15 +93,14 @@ impl ResolveHandler { } struct ResolveRequest { - item: Arc<LspCompletionItem>, + item: Arc<CompletionItem>, ls: Arc<helix_lsp::Client>, } #[derive(Default)] struct ResolveTimeout { next_request: Option<ResolveRequest>, - in_flight: Option<Arc<LspCompletionItem>>, - task_controller: TaskController, + in_flight: Option<(helix_event::CancelTx, Arc<CompletionItem>)>, } impl AsyncHook for ResolveTimeout { @@ -118,7 +120,7 @@ impl AsyncHook for ResolveTimeout { } else if self .in_flight .as_ref() - .is_some_and(|old_request| old_request.item == request.item.item) + .is_some_and(|(_, old_request)| old_request.item == request.item.item) { self.next_request = None; None @@ -132,14 +134,14 @@ impl AsyncHook for ResolveTimeout { let Some(request) = self.next_request.take() else { return; }; - let token = self.task_controller.restart(); - self.in_flight = Some(request.item.clone()); - tokio::spawn(request.execute(token)); + let (tx, rx) = helix_event::cancelation(); + self.in_flight = Some((tx, request.item.clone())); + tokio::spawn(request.execute(rx)); } } impl ResolveRequest { - async fn execute(self, cancel: TaskHandle) { + async fn execute(self, cancel: CancelRx) { let future = self.ls.resolve_completion_item(&self.item.item); let Some(resolved_item) = helix_event::cancelable_future(future, cancel).await else { return; @@ -150,8 +152,8 @@ impl ResolveRequest { .unwrap() .completion { - let resolved_item = CompletionItem::Lsp(match resolved_item { - Ok(item) => LspCompletionItem { + let resolved_item = match resolved_item { + Ok(item) => CompletionItem { item, resolved: true, ..*self.item @@ -164,8 +166,8 @@ impl ResolveRequest { item.resolved = true; item } - }); - completion.replace_item(&*self.item, resolved_item); + }; + completion.replace_item(&self.item, resolved_item); }; }) .await |