diff --git a/src/lspc.rs b/src/lspc.rs index 7b1e518..5bc5abf 100644 --- a/src/lspc.rs +++ b/src/lspc.rs @@ -10,15 +10,16 @@ use std::{ use crossbeam::channel::{Receiver, Select}; use lsp_types::{ + notification::ShowMessage, request::{HoverRequest, Initialize}, - Position, TextDocumentIdentifier, Hover + Hover, Position, ShowMessageParams, TextDocumentIdentifier, }; use serde::{Deserialize, Serialize}; use url::Url; use self::{ handler::LangServerHandler, - msg::LspMessage, + msg::{LspMessage, RawNotification, RawRequest, RawResponse}, types::{InlayHint, InlayHints}, }; @@ -67,12 +68,35 @@ impl From for LspcError { pub enum LangServerError { Process(io::Error), ServerDisconnected, - InvalidResponse, + InvalidRequest(String), + InvalidNotification(String), + InvalidResponse(String), } -impl From for LspcError { - fn from(lse: LangServerError) -> Self { - LspcError::LangServer(lse) +impl From for LangServerError { + fn from(r: RawRequest) -> Self { + LangServerError::InvalidRequest(format!("{:?}", r)) + } +} + +impl From for LangServerError { + fn from(r: RawNotification) -> Self { + LangServerError::InvalidNotification(format!("{:?}", r)) + } +} + +impl From for LangServerError { + fn from(r: RawResponse) -> Self { + LangServerError::InvalidResponse(format!("{:?}", r)) + } +} + +impl From for LspcError +where + T: Into, +{ + fn from(r: T) -> Self { + LspcError::LangServer(r.into()) } } @@ -99,6 +123,7 @@ pub trait Editor { text_document: TextDocumentIdentifier, hints: &Vec, ) -> Result<(), EditorError>; + fn show_message(&self, show_message_params: ShowMessageParams) -> Result<(), EditorError>; } pub struct Lspc { @@ -191,9 +216,7 @@ impl Lspc { capabilities, Box::new(move |editor: &mut E, handler, response| { log::debug!("InitializeResponse callback"); - let response = response - .cast::() - .map_err(|_| LspcError::LangServer(LangServerError::InvalidResponse))?; + let response = response.cast::()?; handler.initialize_response(response)?; @@ -216,9 +239,7 @@ impl Lspc { position, Box::new(move |editor: &mut E, _handler, response| { log::debug!("HoverResponse callback"); - let response = response - .cast::() - .map_err(|_| LspcError::LangServer(LangServerError::InvalidResponse))?; + let response = response.cast::()?; if let Some(hover) = response { editor.show_hover(text_document_clone, &hover)?; } @@ -237,9 +258,8 @@ impl Lspc { text_document, Box::new(move |editor: &mut E, _handler, response| { log::debug!("InlayHintsResponse callback"); - let hints = response - .cast::() - .map_err(|_| LspcError::LangServer(LangServerError::InvalidResponse))?; + let hints = response.cast::()?; + editor.inline_hints(text_document_clone, &hints)?; Ok(()) @@ -255,7 +275,18 @@ impl Lspc { let lsp_handler = &mut self.lsp_handlers[index]; match msg { LspMessage::Request(_req) => {} - LspMessage::Notification(_notification) => {} + LspMessage::Notification(mut noti) => { + noti = match noti.cast::() { + Ok(params) => { + self.editor.show_message(params)?; + + return Ok(()); + } + Err(noti) => noti, + }; + + log::warn!("Not supported notification: {:?}", noti); + } LspMessage::Response(res) => { if let Some(callback) = lsp_handler.callback_for(res.id) { (callback.func)(&mut self.editor, lsp_handler, res)?; diff --git a/src/neovim.rs b/src/neovim.rs index 165d572..9a70f58 100644 --- a/src/neovim.rs +++ b/src/neovim.rs @@ -10,7 +10,8 @@ use std::{ use crossbeam::channel::{self, Receiver, Sender}; use lsp_types::{ - Hover, HoverContents, MarkedString, MarkupContent, MarkupKind, Position, TextDocumentIdentifier, + Hover, HoverContents, MarkedString, MarkupContent, MarkupKind, Position, ShowMessageParams, + TextDocumentIdentifier, }; use rmp_serde::Deserializer; use rmpv::Value; @@ -139,7 +140,10 @@ pub fn from_value(config_value: &Value) -> Option { } } if let (Some(root_markers), Some(command)) = (root_markers, command) { - Some(LsConfig { root_markers, command }) + Some(LsConfig { + root_markers, + command, + }) } else { None } @@ -328,8 +332,6 @@ impl Neovim { method: method.into(), params, }; - log::debug!("NVIM > {:?}", noti); - // FIXME: add RpcQueueFull to EditorError?? self.rpc_client.sender.send(noti).unwrap(); @@ -463,6 +465,12 @@ impl Editor for Neovim { Ok(()) } + + fn show_message(&self, params: ShowMessageParams) -> Result<(), EditorError> { + self.command(&format!("echo '[LS-{:?}] {}'", params.typ, params.message))?; + + Ok(()) + } } impl Message for NvimMessage {