diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index a535cfd252..660528daf1 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -65,6 +65,7 @@ struct Request<'a, T> { #[derive(Serialize, Deserialize)] struct AnyResponse<'a> { + jsonrpc: &'a str, id: usize, #[serde(default)] error: Option, @@ -204,8 +205,9 @@ impl LanguageServer { } else { on_unhandled_notification(msg); } - } else if let Ok(AnyResponse { id, error, result }) = - serde_json::from_slice(&buffer) + } else if let Ok(AnyResponse { + id, error, result, .. + }) = serde_json::from_slice(&buffer) { if let Some(handler) = response_handlers .lock() @@ -461,35 +463,57 @@ impl LanguageServer { method, Box::new(move |id, params, cx| { if let Some(id) = id { - if let Some(params) = serde_json::from_str(params).log_err() { - let response = f(params, cx.clone()); - cx.foreground() - .spawn({ - let outbound_tx = outbound_tx.clone(); - async move { - let response = match response.await { - Ok(result) => Response { - jsonrpc: JSON_RPC_VERSION, - id, - result: Some(result), - error: None, - }, - Err(error) => Response { - jsonrpc: JSON_RPC_VERSION, - id, - result: None, - error: Some(Error { - message: error.to_string(), - }), - }, - }; - if let Some(response) = serde_json::to_vec(&response).log_err() - { - outbound_tx.try_send(response).ok(); + match serde_json::from_str(params) { + Ok(params) => { + let response = f(params, cx.clone()); + cx.foreground() + .spawn({ + let outbound_tx = outbound_tx.clone(); + async move { + let response = match response.await { + Ok(result) => Response { + jsonrpc: JSON_RPC_VERSION, + id, + result: Some(result), + error: None, + }, + Err(error) => Response { + jsonrpc: JSON_RPC_VERSION, + id, + result: None, + error: Some(Error { + message: error.to_string(), + }), + }, + }; + if let Some(response) = + serde_json::to_vec(&response).log_err() + { + outbound_tx.try_send(response).ok(); + } } - } - }) - .detach(); + }) + .detach(); + } + Err(error) => { + log::error!( + "error deserializing {} request: {:?}, message: {:?}", + method, + error, + params + ); + let response = AnyResponse { + jsonrpc: JSON_RPC_VERSION, + id, + result: None, + error: Some(Error { + message: error.to_string(), + }), + }; + if let Some(response) = serde_json::to_vec(&response).log_err() { + outbound_tx.try_send(response).ok(); + } + } } } }),