aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlaž Hrastnik2021-03-12 07:20:56 +0000
committerBlaž Hrastnik2021-03-12 07:25:12 +0000
commit6cbfb050e2c99acf5cdfe7d981c262fbdeaf761c (patch)
tree5fb54d50d2cb0c72e62bea9b0ca52d0dc8c70d9c
parentb7dd7310c44532f3e6e3154367100ee6520ca69b (diff)
lsp: Emit didSave notifications.
-rw-r--r--TODO.md7
-rw-r--r--helix-lsp/src/client.rs21
-rw-r--r--helix-view/src/document.rs11
3 files changed, 36 insertions, 3 deletions
diff --git a/TODO.md b/TODO.md
index f65a3536..b3578b61 100644
--- a/TODO.md
+++ b/TODO.md
@@ -31,9 +31,14 @@
- [x] q should only close the view, if all are closed, close the editor
- [ ] buffers should sit on editor.buffers, view simply refs them
+- [ ] pressing b at start of file needs to not crash
+- [ ] draw separator line between views
+- [ ] command to drop all selections except primary
+
+- [ ] diagnostic severity
- [ ] lsp: signature help
-- [ ] lsp: hover
+- [x] lsp: hover
- [ ] lsp: document symbols (nested/vec)
- [ ] lsp: code actions
- [ ] lsp: formatting
diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs
index 40736f2b..ae858ce0 100644
--- a/helix-lsp/src/client.rs
+++ b/helix-lsp/src/client.rs
@@ -414,10 +414,29 @@ impl Client {
pub async fn text_document_did_save(
&self,
text_document: lsp::TextDocumentIdentifier,
+ text: &Rope,
) -> Result<()> {
+ let capabilities = self.capabilities.as_ref().unwrap(); // TODO: needs post init
+
+ let include_text = match &capabilities.text_document_sync {
+ Some(lsp::TextDocumentSyncCapability::Options(lsp::TextDocumentSyncOptions {
+ save: Some(options),
+ ..
+ })) => match options {
+ lsp::TextDocumentSyncSaveOptions::Supported(true) => false,
+ lsp::TextDocumentSyncSaveOptions::SaveOptions(lsp_types::SaveOptions {
+ include_text,
+ }) => include_text.unwrap_or(false),
+ // Supported(false)
+ _ => return Ok(()),
+ },
+ // unsupported
+ _ => return Ok(()),
+ };
+
self.notify::<lsp::notification::DidSaveTextDocument>(lsp::DidSaveTextDocumentParams {
text_document,
- text: None, // TODO:
+ text: include_text.then(|| text.into()),
})
.await
}
diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs
index b79e201d..f394f2be 100644
--- a/helix-view/src/document.rs
+++ b/helix-view/src/document.rs
@@ -111,10 +111,13 @@ impl Document {
let text = self.text().clone();
let path = self.path.clone().expect("Can't save with no path set!"); // TODO: handle no path
+ let identifier = self.identifier();
// TODO: mark changes up to now as saved
// TODO: mark dirty false
+ let language_server = self.language_server.clone();
+
async move {
use smol::{fs::File, prelude::*};
let mut file = File::create(path).await?;
@@ -125,8 +128,14 @@ impl Document {
}
// TODO: flush?
+ if let Some(language_server) = language_server {
+ language_server
+ .text_document_did_save(identifier, &text)
+ .await?;
+ }
+
Ok(())
- } // and_then notify save
+ }
}
pub fn set_language(