Unnamed repository; edit this file 'description' to name the repository.
Add a completion handler type in helix-view for tracking responses
This will replace the `Sender<CompletionEvent>` in the child commits. It tracks sender alongside extra metadata about the responses received from providers - namely whether a request is incomplete or not - which can be reused between subsequent requests to the provider.
Pascal Kuthe 2025-02-02
parent 1ab35ad · commit 4e0fc0e
-rw-r--r--helix-view/src/handlers/completion.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/helix-view/src/handlers/completion.rs b/helix-view/src/handlers/completion.rs
index 27ca1d71..db3f0b26 100644
--- a/helix-view/src/handlers/completion.rs
+++ b/helix-view/src/handlers/completion.rs
@@ -1,4 +1,41 @@
-use crate::{DocumentId, ViewId};
+use std::{collections::HashMap, sync::Arc};
+
+use helix_core::completion::CompletionProvider;
+use helix_event::{send_blocking, TaskController};
+
+use crate::{document::SavePoint, DocumentId, ViewId};
+
+use tokio::sync::mpsc::Sender;
+
+pub struct CompletionHandler {
+ event_tx: Sender<CompletionEvent>,
+ pub active_completions: HashMap<CompletionProvider, ResponseContext>,
+ pub request_controller: TaskController,
+}
+
+impl CompletionHandler {
+ pub fn new(event_tx: Sender<CompletionEvent>) -> Self {
+ Self {
+ event_tx,
+ active_completions: HashMap::new(),
+ request_controller: TaskController::new(),
+ }
+ }
+
+ pub fn event(&self, event: CompletionEvent) {
+ send_blocking(&self.event_tx, event);
+ }
+}
+
+pub struct ResponseContext {
+ /// Whether the completion response is marked as "incomplete."
+ ///
+ /// This is used by LSP. When completions are "incomplete" and you continue typing, the
+ /// completions should be recomputed by the server instead of filtered.
+ pub is_incomplete: bool,
+ pub priority: i8,
+ pub savepoint: Arc<SavePoint>,
+}
pub enum CompletionEvent {
/// Auto completion was triggered by typing a word char