From ea2a78add2dd984bbb7375448cc8a375ad62c967 Mon Sep 17 00:00:00 2001 From: wojciechkepka Date: Wed, 16 Jun 2021 19:36:13 +0200 Subject: [PATCH] Add error reply to server if document is missing --- helix-lsp/src/lib.rs | 13 ++++++++++--- helix-term/src/application.rs | 19 ++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs index 877fed668a821..15e94ce8277c8 100644 --- a/helix-lsp/src/lib.rs +++ b/helix-lsp/src/lib.rs @@ -246,7 +246,7 @@ impl Notification { #[derive(Debug)] pub struct Registry { - inner: HashMap>, + inner: HashMap)>, counter: AtomicUsize, pub incoming: SelectAll>, @@ -267,6 +267,13 @@ impl Registry { } } + pub fn get_by_id(&mut self, id: usize) -> Option<&Client> { + self.inner + .values() + .find(|(client_id, _)| client_id == &id) + .map(|(_, client)| client.as_ref()) + } + pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result> { if let Some(config) = &language_config.language_server { // avoid borrow issues @@ -274,7 +281,7 @@ impl Registry { let s_incoming = &mut self.incoming; match inner.entry(language_config.scope.clone()) { - Entry::Occupied(language_server) => Ok(language_server.get().clone()), + Entry::Occupied(entry) => Ok(entry.get().1.clone()), Entry::Vacant(entry) => { // initialize a new client let id = self.counter.fetch_add(1, Ordering::Relaxed); @@ -284,7 +291,7 @@ impl Registry { s_incoming.push(UnboundedReceiverStream::new(incoming)); let client = Arc::new(client); - entry.insert(client.clone()); + entry.insert((id, client.clone())); Ok(client) } } diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 033d93611d7e6..49ce9345f3361 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -345,7 +345,24 @@ impl Application { helix_lsp::block_on(server.reply(id, Ok(serde_json::Value::Null))); } None => { - log::warn!("missing document with language server id {}", server_id) + if let Some(server) = + self.editor.language_servers.get_by_id(server_id) + { + log::warn!( + "missing document with language server id `{}`", + server_id + ); + helix_lsp::block_on(server.reply( + id, + Err(helix_lsp::jsonrpc::Error { + code: helix_lsp::jsonrpc::ErrorCode::InternalError, + message: "document missing".to_string(), + data: None, + }), + )); + } else { + log::warn!("can't find language server with id `{}`", server_id); + } } } }