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.rs36
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