From cc6bdf8f66889087223d9a8491479ceecc09a663 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Fri, 23 Oct 2020 18:48:03 +0900 Subject: Text change generation, RPC call handling. --- helix-term/src/application.rs | 87 +++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 37 deletions(-) (limited to 'helix-term/src') diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index b9594b7e..802dd399 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -433,8 +433,8 @@ impl<'a> Application<'a> { event = reader.next().fuse() => { self.handle_terminal_events(event).await } - notification = self.lsp.incoming.next().fuse() => { - self.handle_lsp_notification(notification).await + call = self.lsp.incoming.next().fuse() => { + self.handle_lsp_message(call).await } } } @@ -566,43 +566,56 @@ impl<'a> Application<'a> { }; } - pub async fn handle_lsp_notification(&mut self, notification: Option) { - use helix_lsp::Notification; - match notification { - Some(Notification::PublishDiagnostics(params)) => { - let path = Some(params.uri.to_file_path().unwrap()); - let view = self - .editor - .views - .iter_mut() - .find(|view| view.doc.path == path); - - if let Some(view) = view { - let doc = view.doc.text().slice(..); - let diagnostics = params - .diagnostics - .into_iter() - .map(|diagnostic| { - use helix_lsp::util::lsp_pos_to_pos; - let start = lsp_pos_to_pos(&doc, diagnostic.range.start); - let end = lsp_pos_to_pos(&doc, diagnostic.range.end); - - helix_core::Diagnostic { - range: (start, end), - line: diagnostic.range.start.line as usize, - message: diagnostic.message, - // severity - // code - // source - } - }) - .collect(); - - view.doc.diagnostics = diagnostics; - - self.render(); + pub async fn handle_lsp_message(&mut self, call: Option) { + use helix_lsp::{Call, Notification}; + match call { + Some(Call::Notification(helix_lsp::jsonrpc::Notification { + method, params, .. + })) => { + let notification = Notification::parse(&method, params); + match notification { + Notification::PublishDiagnostics(params) => { + let path = Some(params.uri.to_file_path().unwrap()); + let view = self + .editor + .views + .iter_mut() + .find(|view| view.doc.path == path); + + if let Some(view) = view { + let doc = view.doc.text().slice(..); + let diagnostics = params + .diagnostics + .into_iter() + .map(|diagnostic| { + use helix_lsp::util::lsp_pos_to_pos; + let start = lsp_pos_to_pos(&doc, diagnostic.range.start); + let end = lsp_pos_to_pos(&doc, diagnostic.range.end); + + helix_core::Diagnostic { + range: (start, end), + line: diagnostic.range.start.line as usize, + message: diagnostic.message, + // severity + // code + // source + } + }) + .collect(); + + view.doc.diagnostics = diagnostics; + + self.render(); + } + } + _ => unreachable!(), } } + Some(Call::MethodCall(call)) => { + // TODO: need to make Result + + unimplemented!("{:?}", call) + } _ => unreachable!(), } } -- cgit v1.2.3-70-g09d2