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.
| -rw-r--r-- | helix-view/src/handlers/completion.rs | 39 |
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 |