mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Merge #3102
3102: Better error messages while deserializing r=matklad a=matklad Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
6ac871b1df
3 changed files with 17 additions and 11 deletions
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
|
|
|
@ -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> =
|
||||
|
|
Loading…
Reference in a new issue