151: Add LspError to explicity return errors from LSP handlers r=matklad a=kjeremy
Fixes #145
Co-authored-by: Jeremy A. Kolb <jkolb@ara.com>
"crossbeam-channel 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
"drop_bomb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "failure_derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"flexi_logger 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)",
"gen_lsp_server 0.1.0",
"im 12.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
rayon = "1.0.2"
relative-path = "0.3.7"
failure = "0.1.2"
+failure_derive = "0.1.2"
serde_json = "1.0.24"
serde = "1.0.71"
serde_derive = "1.0.71"
extern crate log;
extern crate cargo_metadata;
extern crate drop_bomb;
+#[macro_use]
+extern crate failure_derive;
extern crate im;
extern crate relative_path;
extern crate rustc_hash;
mod vfs;
pub type Result<T> = ::std::result::Result<T, ::failure::Error>;
-pub use crate::{caps::server_capabilities, main_loop::main_loop};
+pub use crate::{caps::server_capabilities, main_loop::main_loop, main_loop::LspError};
\ No newline at end of file
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;
project_model::TargetKind,
req::{self, Decoration},
server_world::ServerWorld,
- Result,
+ Result, LspError
};
pub fn handle_syntax_tree(
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)?;
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),
let resp = match f(world, params) {
Ok(resp) => RawResponse::ok::<R>(id, &resp),
Err(e) => {
- RawResponse::err(id, ErrorCode::InternalError as i32, e.to_string())
+ match e.downcast::<LspError>() {
+ 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);