Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/handlers/lsp.rs')
| -rw-r--r-- | helix-view/src/handlers/lsp.rs | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/helix-view/src/handlers/lsp.rs b/helix-view/src/handlers/lsp.rs index 14e37c15..81388540 100644 --- a/helix-view/src/handlers/lsp.rs +++ b/helix-view/src/handlers/lsp.rs @@ -2,13 +2,18 @@ use std::collections::btree_map::Entry; use std::fmt::Display; use crate::editor::Action; -use crate::events::DiagnosticsDidChange; +use crate::events::{ + DiagnosticsDidChange, DocumentDidChange, DocumentDidClose, LanguageServerInitialized, +}; use crate::Editor; use helix_core::diagnostic::DiagnosticProvider; use helix_core::Uri; +use helix_event::register_hook; use helix_lsp::util::generate_transaction_from_edits; use helix_lsp::{lsp, LanguageServerId, OffsetEncoding}; +use super::Handlers; + #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum SignatureHelpInvoked { Automatic, @@ -381,3 +386,50 @@ impl Editor { }); } } + +pub fn register_hooks(_handlers: &Handlers) { + register_hook!(move |event: &mut LanguageServerInitialized<'_>| { + let language_server = event.editor.language_server_by_id(event.server_id).unwrap(); + + for doc in event + .editor + .documents() + .filter(|doc| doc.supports_language_server(event.server_id)) + { + let Some(url) = doc.url() else { + continue; + }; + + let language_id = doc.language_id().map(ToOwned::to_owned).unwrap_or_default(); + + language_server.text_document_did_open(url, doc.version(), doc.text(), language_id); + } + + Ok(()) + }); + + register_hook!(move |event: &mut DocumentDidChange<'_>| { + // Send textDocument/didChange notifications. + if !event.ghost_transaction { + for language_server in event.doc.language_servers() { + language_server.text_document_did_change( + event.doc.versioned_identifier(), + event.old_text, + event.doc.text(), + event.changes, + ); + } + } + + Ok(()) + }); + + register_hook!(move |event: &mut DocumentDidClose<'_>| { + // Send textDocument/didClose notifications. + for language_server in event.doc.language_servers() { + language_server.text_document_did_close(event.doc.identifier()); + } + + Ok(()) + }); +} |