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.rs31
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(())