about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-02-11 08:47:36 +0000
committerGitHub <noreply@github.com>2020-02-11 08:47:36 +0000
commit6ac871b1df68070cf04085120d588efcb5c55986 (patch)
tree64011248f5c92002bda04fc990d46363bf0e1967
parentf8d6d6f23bfb15021be91031ba983da19f0d3ada (diff)
parent44425eaebcf9c1b3fb8ad311bed83887ab54a43b (diff)
downloadrust-6ac871b1df68070cf04085120d588efcb5c55986.tar.gz
rust-6ac871b1df68070cf04085120d588efcb5c55986.zip
Merge #3102
3102: Better error messages while deserializing r=matklad a=matklad



Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
-rw-r--r--crates/ra_lsp_server/src/lib.rs8
-rw-r--r--crates/ra_lsp_server/src/main.rs17
-rw-r--r--crates/ra_lsp_server/src/main_loop/handlers.rs3
3 files changed, 17 insertions, 11 deletions
diff --git a/crates/ra_lsp_server/src/lib.rs b/crates/ra_lsp_server/src/lib.rs
index 1208c13435b..a3464a5a3c6 100644
--- a/crates/ra_lsp_server/src/lib.rs
+++ b/crates/ra_lsp_server/src/lib.rs
@@ -31,6 +31,8 @@ mod config;
 mod world;
 mod diagnostics;
 
+use serde::de::DeserializeOwned;
+
 pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
 pub use crate::{
     caps::server_capabilities,
@@ -38,3 +40,9 @@ pub use crate::{
     main_loop::LspError,
     main_loop::{main_loop, show_message},
 };
+
+pub fn from_json<T: DeserializeOwned>(what: &'static str, json: serde_json::Value) -> Result<T> {
+    let res = T::deserialize(&json)
+        .map_err(|e| format!("Failed to deserialize {}: {}; {}", what, e, json))?;
+    Ok(res)
+}
diff --git a/crates/ra_lsp_server/src/main.rs b/crates/ra_lsp_server/src/main.rs
index 3879eeff2d4..c8a017c5c80 100644
--- a/crates/ra_lsp_server/src/main.rs
+++ b/crates/ra_lsp_server/src/main.rs
@@ -1,7 +1,7 @@
 //! `ra_lsp_server` binary
 
 use lsp_server::Connection;
-use ra_lsp_server::{show_message, Result, ServerConfig};
+use ra_lsp_server::{from_json, show_message, Result, ServerConfig};
 use ra_prof;
 
 fn main() -> Result<()> {
@@ -45,7 +45,8 @@ fn run_server() -> Result<()> {
     let server_capabilities = serde_json::to_value(ra_lsp_server::server_capabilities()).unwrap();
 
     let initialize_params = connection.initialize(server_capabilities)?;
-    let initialize_params: lsp_types::InitializeParams = serde_json::from_value(initialize_params)?;
+    let initialize_params =
+        from_json::<lsp_types::InitializeParams>("InitializeParams", initialize_params)?;
 
     if let Some(client_info) = initialize_params.client_info {
         log::info!("Client '{}' {}", client_info.name, client_info.version.unwrap_or_default());
@@ -62,17 +63,13 @@ fn run_server() -> Result<()> {
         .filter(|workspaces| !workspaces.is_empty())
         .unwrap_or_else(|| vec![root]);
 
-    let server_config: ServerConfig = initialize_params
+    let server_config = initialize_params
         .initialization_options
         .and_then(|v| {
-            serde_json::from_value(v)
+            from_json::<ServerConfig>("config", v)
                 .map_err(|e| {
-                    log::error!("failed to deserialize config: {}", e);
-                    show_message(
-                        lsp_types::MessageType::Error,
-                        format!("failed to deserialize config: {}", e),
-                        &connection.sender,
-                    );
+                    log::error!("{}", e);
+                    show_message(lsp_types::MessageType::Error, e.to_string(), &connection.sender);
                 })
                 .ok()
         })
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs
index 65e8bc856df..59c86bbfa46 100644
--- a/crates/ra_lsp_server/src/main_loop/handlers.rs
+++ b/crates/ra_lsp_server/src/main_loop/handlers.rs
@@ -35,6 +35,7 @@ use crate::{
         TryConvWithToVec,
     },
     diagnostics::DiagnosticTask,
+    from_json,
     req::{self, Decoration, InlayHint, InlayHintsParams, InlayKind},
     world::WorldSnapshot,
     LspError, Result,
@@ -811,7 +812,7 @@ enum CodeLensResolveData {
 pub fn handle_code_lens_resolve(world: WorldSnapshot, code_lens: CodeLens) -> Result<CodeLens> {
     let _p = profile("handle_code_lens_resolve");
     let data = code_lens.data.unwrap();
-    let resolve = serde_json::from_value(data)?;
+    let resolve = from_json::<Option<CodeLensResolveData>>("CodeLensResolveData", data)?;
     match resolve {
         Some(CodeLensResolveData::Impls(lens_params)) => {
             let locations: Vec<Location> =