]> git.lizzy.rs Git - rust.git/commitdiff
Add LspError to explicity return errors from LSP handlers
authorJeremy A. Kolb <jkolb@ara.com>
Mon, 22 Oct 2018 17:49:27 +0000 (13:49 -0400)
committerJeremy A. Kolb <jkolb@ara.com>
Mon, 22 Oct 2018 17:49:27 +0000 (13:49 -0400)
Fixes #145

Cargo.lock
crates/ra_lsp_server/Cargo.toml
crates/ra_lsp_server/src/lib.rs
crates/ra_lsp_server/src/main_loop/handlers.rs
crates/ra_lsp_server/src/main_loop/mod.rs

index b482ca28f9ec4b7a915c34931fc782decb2ba860..619f652024c451506a76852f3c11a378ba17c7da 100644 (file)
@@ -654,6 +654,7 @@ dependencies = [
  "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)",
index 2b32571171a13aba026bb76b7a3f12d3ebec980e..e4fc40a3a58a6071b2655b79febf4dbf5d199c23 100644 (file)
@@ -8,6 +8,7 @@ authors = ["Aleksey Kladov <aleksey.kladov@gmail.com>"]
 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"
index f1b17f2825d077297c8a780e9dfcb9a6d7a08154..ce77b2a33dbe5032598cf5cea18f20fd2978ae56 100644 (file)
@@ -12,6 +12,8 @@
 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;
@@ -34,4 +36,4 @@
 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
index f5dff4c80aab67f7508dd5af12db34ede9ec6f92..baf82f3fcde5359b3bd55c6cded614839a5d9f6b 100644 (file)
@@ -7,6 +7,7 @@
     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 @@
     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)?;
index b35ebd38b69a05ef9910eb9cfb136805f617e080..aa3cf1dbd273cd18b3bba78dabb4553d0dcd2ff1 100644 (file)
     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 @@ fn on<'b, R>(
                     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);