diff options
Diffstat (limited to 'helix-view')
-rw-r--r-- | helix-view/Cargo.toml | 2 | ||||
-rw-r--r-- | helix-view/src/document.rs | 29 |
2 files changed, 30 insertions, 1 deletions
diff --git a/helix-view/Cargo.toml b/helix-view/Cargo.toml index 0a48b721..658943c5 100644 --- a/helix-view/Cargo.toml +++ b/helix-view/Cargo.toml @@ -13,6 +13,7 @@ default = ["term"] [dependencies] anyhow = "1" helix-core = { path = "../helix-core" } +helix-lsp = { path = "../helix-lsp"} # Conversion traits # tui = { version = "0.12", default-features = false, features = ["crossterm"], optional = true} @@ -22,3 +23,4 @@ once_cell = "1.4" url = "2" smol = "1" +futures-util = "0.3" diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index d6246c34..785b0ca8 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -1,6 +1,7 @@ use anyhow::Error; use std::future::Future; use std::path::{Path, PathBuf}; +use std::sync::Arc; use helix_core::{ syntax::LOADER, ChangeSet, Diagnostic, History, Position, Range, Rope, RopeSlice, Selection, @@ -35,6 +36,7 @@ pub struct Document { pub version: i32, // should be usize? pub diagnostics: Vec<Diagnostic>, + pub language_server: Option<Arc<helix_lsp::Client>>, } /// Like std::mem::replace() except it allows the replacement value to be mapped from the @@ -53,6 +55,8 @@ where } } +use futures_util::TryFutureExt; +use helix_lsp::lsp; use url::Url; impl Document { @@ -72,6 +76,7 @@ impl Document { diagnostics: Vec::new(), version: 0, history: History::default(), + language_server: None, } } @@ -134,7 +139,7 @@ impl Document { // TODO: flush? Ok(()) - } // and_then(// lsp.send_text_saved_notification()) + } // and_then notify save } pub fn set_language(&mut self, scope: &str, scopes: &[String]) { @@ -148,6 +153,10 @@ impl Document { }; } + pub fn set_language_server(&mut self, language_server: Option<Arc<helix_lsp::Client>>) { + self.language_server = language_server; + } + pub fn set_selection(&mut self, selection: Selection) { // TODO: use a transaction? self.state.selection = selection; @@ -181,6 +190,14 @@ impl Document { } // TODO: map state.diagnostics over changes::map_pos too + + // emit lsp notification + if let Some(language_server) = &self.language_server { + let notify = language_server + .text_document_did_change(self.versioned_identifier(), transaction.changes()); + + smol::block_on(notify).expect("failed to emit textDocument/didChange"); + } } success } @@ -263,4 +280,14 @@ impl Document { // } // TODO: transact(Fn) ? + + // -- LSP methods + + pub fn identifier(&self) -> lsp::TextDocumentIdentifier { + lsp::TextDocumentIdentifier::new(self.url().unwrap()) + } + + pub fn versioned_identifier(&self) -> lsp::VersionedTextDocumentIdentifier { + lsp::VersionedTextDocumentIdentifier::new(self.url().unwrap(), self.version) + } } |