Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-term/src/handlers/signature_help.rs')
| -rw-r--r-- | helix-term/src/handlers/signature_help.rs | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/helix-term/src/handlers/signature_help.rs b/helix-term/src/handlers/signature_help.rs index 8a0c9754..aaa97b9a 100644 --- a/helix-term/src/handlers/signature_help.rs +++ b/helix-term/src/handlers/signature_help.rs @@ -1,8 +1,10 @@ use std::sync::Arc; use std::time::Duration; -use helix_core::syntax::config::LanguageServerFeature; -use helix_event::{cancelable_future, register_hook, send_blocking, TaskController, TaskHandle}; +use helix_core::syntax::LanguageServerFeature; +use helix_event::{ + cancelable_future, cancelation, register_hook, send_blocking, CancelRx, CancelTx, +}; use helix_lsp::lsp::{self, SignatureInformation}; use helix_stdx::rope::RopeSliceExt; use helix_view::document::Mode; @@ -16,15 +18,15 @@ use crate::commands::Open; use crate::compositor::Compositor; use crate::events::{OnModeSwitch, PostInsertChar}; use crate::handlers::Handlers; -use crate::ui::lsp::signature_help::{Signature, SignatureHelp}; +use crate::ui::lsp::{Signature, SignatureHelp}; use crate::ui::Popup; use crate::{job, ui}; -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug)] enum State { Open, Closed, - Pending, + Pending { request: CancelTx }, } /// debounce timeout in ms, value taken from VSCode @@ -35,7 +37,6 @@ const TIMEOUT: u64 = 120; pub(super) struct SignatureHelpHandler { trigger: Option<SignatureHelpInvoked>, state: State, - task_controller: TaskController, } impl SignatureHelpHandler { @@ -43,7 +44,6 @@ impl SignatureHelpHandler { SignatureHelpHandler { trigger: None, state: State::Closed, - task_controller: TaskController::new(), } } } @@ -76,11 +76,12 @@ impl helix_event::AsyncHook for SignatureHelpHandler { } SignatureHelpEvent::RequestComplete { open } => { // don't cancel rerequest that was already triggered - if self.state == State::Pending && self.task_controller.is_running() { - return timeout; + if let State::Pending { request } = &self.state { + if !request.is_closed() { + return timeout; + } } self.state = if open { State::Open } else { State::Closed }; - self.task_controller.cancel(); return timeout; } @@ -93,16 +94,16 @@ impl helix_event::AsyncHook for SignatureHelpHandler { fn finish_debounce(&mut self) { let invocation = self.trigger.take().unwrap(); - self.state = State::Pending; - let handle = self.task_controller.restart(); - job::dispatch_blocking(move |editor, _| request_signature_help(editor, invocation, handle)) + let (tx, rx) = cancelation(); + self.state = State::Pending { request: tx }; + job::dispatch_blocking(move |editor, _| request_signature_help(editor, invocation, rx)) } } pub fn request_signature_help( editor: &mut Editor, invoked: SignatureHelpInvoked, - cancel: TaskHandle, + cancel: CancelRx, ) { let (view, doc) = current!(editor); @@ -353,7 +354,7 @@ pub(super) fn register_hooks(handlers: &Handlers) { let tx = handlers.signature_hints.clone(); register_hook!(move |event: &mut DocumentDidChange<'_>| { - if event.doc.config.load().lsp.auto_signature_help && !event.ghost_transaction { + if event.doc.config.load().lsp.auto_signature_help { send_blocking(&tx, SignatureHelpEvent::ReTrigger); } Ok(()) |