From 6453b29cb571d5c54bac427842ba8a9dd6874861 Mon Sep 17 00:00:00 2001 From: "Jeremy A. Kolb" Date: Mon, 22 Oct 2018 13:49:27 -0400 Subject: Add LspError to explicity return errors from LSP handlers Fixes #145 --- crates/ra_lsp_server/src/main_loop/handlers.rs | 5 +++-- crates/ra_lsp_server/src/main_loop/mod.rs | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) (limited to 'crates/ra_lsp_server/src/main_loop') diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index f5dff4c80..baf82f3fc 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -7,6 +7,7 @@ use languageserver_types::{ InsertTextFormat, Location, Position, SymbolInformation, TextDocumentIdentifier, TextEdit, RenameParams, WorkspaceEdit, PrepareRenameResponse }; +use gen_lsp_server::ErrorCode; use ra_analysis::{FileId, FoldKind, Query, RunnableKind}; use ra_syntax::text_utils::contains_offset_nonstrict; use serde_json::to_value; @@ -16,7 +17,7 @@ use crate::{ project_model::TargetKind, req::{self, Decoration}, server_world::ServerWorld, - Result, + Result, LspError }; pub fn handle_syntax_tree( @@ -476,7 +477,7 @@ pub fn handle_rename( let offset = params.position.conv_with(&line_index); if params.new_name.is_empty() { - return Ok(None); + return Err(LspError::new(ErrorCode::InvalidParams as i32, "New Name cannot be empty".into()).into()); } let refs = world.analysis().find_all_refs(file_id, offset)?; diff --git a/crates/ra_lsp_server/src/main_loop/mod.rs b/crates/ra_lsp_server/src/main_loop/mod.rs index b35ebd38b..aa3cf1dbd 100644 --- a/crates/ra_lsp_server/src/main_loop/mod.rs +++ b/crates/ra_lsp_server/src/main_loop/mod.rs @@ -23,6 +23,19 @@ use crate::{ Result, }; +#[derive(Debug, Fail)] +#[fail(display = "Language Server request failed with {}. ({})", code, message)] +pub struct LspError { + pub code: i32, + pub message: String, +} + +impl LspError { + pub fn new(code: i32, message: String) -> LspError { + LspError {code, message} + } +} + #[derive(Debug)] enum Task { Respond(RawResponse), @@ -361,7 +374,10 @@ impl<'a> PoolDispatcher<'a> { let resp = match f(world, params) { Ok(resp) => RawResponse::ok::(id, &resp), Err(e) => { - RawResponse::err(id, ErrorCode::InternalError as i32, e.to_string()) + match e.downcast::() { + Ok(lsp_error) => RawResponse::err(id, lsp_error.code, lsp_error.message), + Err(e) => RawResponse::err(id, ErrorCode::InternalError as i32, e.to_string()) + } } }; let task = Task::Respond(resp); -- cgit v1.2.3