Get rid of failure: ra_lsp_server & ra_project_model

This commit is contained in:
Muhammad Mominul Huque 2019-06-15 02:42:56 +06:00
parent a931fb1ef6
commit 9709bd39ca
No known key found for this signature in database
GPG key ID: 37AF141540DE557D
10 changed files with 32 additions and 36 deletions

3
Cargo.lock generated
View file

@ -1128,8 +1128,6 @@ name = "ra_lsp_server"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-channel 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"flexi_logger 0.11.5 (registry+https://github.com/rust-lang/crates.io-index)", "flexi_logger 0.11.5 (registry+https://github.com/rust-lang/crates.io-index)",
"gen_lsp_server 0.2.0", "gen_lsp_server 0.2.0",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1187,7 +1185,6 @@ name = "ra_project_model"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"cargo_metadata 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "cargo_metadata 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"ra_arena 0.1.0", "ra_arena 0.1.0",
"ra_db 0.1.0", "ra_db 0.1.0",

View file

@ -7,8 +7,6 @@ authors = ["rust-analyzer developers"]
[dependencies] [dependencies]
threadpool = "1.7.1" threadpool = "1.7.1"
relative-path = "0.4.0" relative-path = "0.4.0"
failure = "0.1.4"
failure_derive = "0.1.4"
serde_json = "1.0.34" serde_json = "1.0.34"
serde = { version = "1.0.83", features = ["derive"] } serde = { version = "1.0.83", features = ["derive"] }
crossbeam-channel = "0.3.5" crossbeam-channel = "0.3.5"

View file

@ -9,5 +9,5 @@ pub mod req;
pub mod init; pub mod init;
mod world; mod world;
pub type Result<T> = ::std::result::Result<T, ::failure::Error>; pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
pub use crate::{caps::server_capabilities, main_loop::main_loop, main_loop::LspError, init::InitializationOptions}; pub use crate::{caps::server_capabilities, main_loop::main_loop, main_loop::LspError, init::InitializationOptions};

View file

@ -25,7 +25,7 @@ fn main() -> Result<()> {
} }
Err(_) => { Err(_) => {
log::error!("server panicked"); log::error!("server panicked");
failure::bail!("server panicked") Err("server panicked")?
} }
} }
} }

View file

@ -2,11 +2,9 @@ mod handlers;
mod subscriptions; mod subscriptions;
pub(crate) mod pending_requests; pub(crate) mod pending_requests;
use std::{fmt, path::PathBuf, sync::Arc, time::Instant}; use std::{fmt, path::PathBuf, sync::Arc, time::Instant, error::Error};
use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender}; use crossbeam_channel::{select, unbounded, Receiver, RecvError, Sender};
use failure::{bail, format_err};
use failure_derive::Fail;
use gen_lsp_server::{ use gen_lsp_server::{
handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse, handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse,
}; };
@ -32,8 +30,7 @@ use crate::{
const THREADPOOL_SIZE: usize = 8; const THREADPOOL_SIZE: usize = 8;
const MAX_IN_FLIGHT_LIBS: usize = THREADPOOL_SIZE - 3; const MAX_IN_FLIGHT_LIBS: usize = THREADPOOL_SIZE - 3;
#[derive(Debug, Fail)] #[derive(Debug)]
#[fail(display = "Language Server request failed with {}. ({})", code, message)]
pub struct LspError { pub struct LspError {
pub code: i32, pub code: i32,
pub message: String, pub message: String,
@ -45,6 +42,14 @@ impl LspError {
} }
} }
impl fmt::Display for LspError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Language Server request failed with {}. ({})", self.code, self.message)
}
}
impl Error for LspError {}
pub fn main_loop( pub fn main_loop(
ws_roots: Vec<PathBuf>, ws_roots: Vec<PathBuf>,
options: InitializationOptions, options: InitializationOptions,
@ -177,12 +182,12 @@ fn main_loop_inner(
let event = select! { let event = select! {
recv(msg_receiver) -> msg => match msg { recv(msg_receiver) -> msg => match msg {
Ok(msg) => Event::Msg(msg), Ok(msg) => Event::Msg(msg),
Err(RecvError) => bail!("client exited without shutdown"), Err(RecvError) => Err("client exited without shutdown")?,
}, },
recv(task_receiver) -> task => Event::Task(task.unwrap()), recv(task_receiver) -> task => Event::Task(task.unwrap()),
recv(state.vfs.read().task_receiver()) -> task => match task { recv(state.vfs.read().task_receiver()) -> task => match task {
Ok(task) => Event::Vfs(task), Ok(task) => Event::Vfs(task),
Err(RecvError) => bail!("vfs died"), Err(RecvError) => Err("vfs died")?,
}, },
recv(libdata_receiver) -> data => Event::Lib(data.unwrap()) recv(libdata_receiver) -> data => Event::Lib(data.unwrap())
}; };
@ -380,7 +385,7 @@ fn on_notification(
let not = match not.cast::<req::DidOpenTextDocument>() { let not = match not.cast::<req::DidOpenTextDocument>() {
Ok(params) => { Ok(params) => {
let uri = params.text_document.uri; let uri = params.text_document.uri;
let path = uri.to_file_path().map_err(|()| format_err!("invalid uri: {}", uri))?; let path = uri.to_file_path().map_err(|()| format!("invalid uri: {}", uri))?;
if let Some(file_id) = if let Some(file_id) =
state.vfs.write().add_file_overlay(&path, params.text_document.text) state.vfs.write().add_file_overlay(&path, params.text_document.text)
{ {
@ -393,9 +398,9 @@ fn on_notification(
let not = match not.cast::<req::DidChangeTextDocument>() { let not = match not.cast::<req::DidChangeTextDocument>() {
Ok(mut params) => { Ok(mut params) => {
let uri = params.text_document.uri; let uri = params.text_document.uri;
let path = uri.to_file_path().map_err(|()| format_err!("invalid uri: {}", uri))?; let path = uri.to_file_path().map_err(|()| format!("invalid uri: {}", uri))?;
let text = let text =
params.content_changes.pop().ok_or_else(|| format_err!("empty changes"))?.text; params.content_changes.pop().ok_or_else(|| format!("empty changes"))?.text;
state.vfs.write().change_file_overlay(path.as_path(), text); state.vfs.write().change_file_overlay(path.as_path(), text);
return Ok(()); return Ok(());
} }
@ -404,7 +409,7 @@ fn on_notification(
let not = match not.cast::<req::DidCloseTextDocument>() { let not = match not.cast::<req::DidCloseTextDocument>() {
Ok(params) => { Ok(params) => {
let uri = params.text_document.uri; let uri = params.text_document.uri;
let path = uri.to_file_path().map_err(|()| format_err!("invalid uri: {}", uri))?; let path = uri.to_file_path().map_err(|()| format!("invalid uri: {}", uri))?;
if let Some(file_id) = state.vfs.write().remove_file_overlay(path.as_path()) { if let Some(file_id) = state.vfs.write().remove_file_overlay(path.as_path()) {
subs.remove_sub(FileId(file_id.0)); subs.remove_sub(FileId(file_id.0));
} }
@ -546,7 +551,7 @@ where
RawResponse::err( RawResponse::err(
id, id,
ErrorCode::InternalError as i32, ErrorCode::InternalError as i32,
format!("{}\n{}", e, e.backtrace()), e.to_string()
) )
} }
} }
@ -599,6 +604,6 @@ fn show_message(typ: req::MessageType, message: impl Into<String>, sender: &Send
sender.send(not.into()).unwrap(); sender.send(not.into()).unwrap();
} }
fn is_canceled(e: &failure::Error) -> bool { fn is_canceled(e: &Box<dyn std::error::Error + Send + Sync>) -> bool {
e.downcast_ref::<Canceled>().is_some() e.downcast_ref::<Canceled>().is_some()
} }

View file

@ -11,7 +11,6 @@ use ra_ide_api::{
use ra_vfs::{Vfs, VfsChange, VfsFile, VfsRoot}; use ra_vfs::{Vfs, VfsChange, VfsFile, VfsRoot};
use relative_path::RelativePathBuf; use relative_path::RelativePathBuf;
use parking_lot::RwLock; use parking_lot::RwLock;
use failure::{Error, format_err};
use gen_lsp_server::ErrorCode; use gen_lsp_server::ErrorCode;
use crate::{ use crate::{
@ -169,13 +168,13 @@ impl WorldSnapshot {
} }
pub fn uri_to_file_id(&self, uri: &Url) -> Result<FileId> { pub fn uri_to_file_id(&self, uri: &Url) -> Result<FileId> {
let path = uri.to_file_path().map_err(|()| format_err!("invalid uri: {}", uri))?; let path = uri.to_file_path().map_err(|()| format!("invalid uri: {}", uri))?;
let file = self.vfs.read().path2file(&path).ok_or_else(|| { let file = self.vfs.read().path2file(&path).ok_or_else(|| {
// Show warning as this file is outside current workspace // Show warning as this file is outside current workspace
Error::from(LspError { LspError {
code: ErrorCode::InvalidRequest as i32, code: ErrorCode::InvalidRequest as i32,
message: "Rust file outside current workspace is not supported yet.".to_string(), message: "Rust file outside current workspace is not supported yet.".to_string(),
}) }
})?; })?;
Ok(FileId(file.0)) Ok(FileId(file.0))
} }
@ -183,7 +182,7 @@ impl WorldSnapshot {
pub fn file_id_to_uri(&self, id: FileId) -> Result<Url> { pub fn file_id_to_uri(&self, id: FileId) -> Result<Url> {
let path = self.vfs.read().file2path(VfsFile(id.0)); let path = self.vfs.read().file2path(VfsFile(id.0));
let url = Url::from_file_path(&path) let url = Url::from_file_path(&path)
.map_err(|_| format_err!("can't convert path to url: {}", path.display()))?; .map_err(|_| format!("can't convert path to url: {}", path.display()))?;
Ok(url) Ok(url)
} }
@ -191,7 +190,7 @@ impl WorldSnapshot {
let base = self.vfs.read().root2path(VfsRoot(root.0)); let base = self.vfs.read().root2path(VfsRoot(root.0));
let path = path.to_path(base); let path = path.to_path(base);
let url = Url::from_file_path(&path) let url = Url::from_file_path(&path)
.map_err(|_| format_err!("can't convert path to url: {}", path.display()))?; .map_err(|_| format!("can't convert path to url: {}", path.display()))?;
Ok(url) Ok(url)
} }

View file

@ -9,8 +9,6 @@ log = "0.4.5"
rustc-hash = "1.0" rustc-hash = "1.0"
relative-path = "0.4.0" relative-path = "0.4.0"
failure = "0.1.4"
walkdir = "2.2.7" walkdir = "2.2.7"
cargo_metadata = "0.7.0" cargo_metadata = "0.7.0"

View file

@ -3,7 +3,6 @@ use std::path::{Path, PathBuf};
use cargo_metadata::{MetadataCommand, CargoOpt}; use cargo_metadata::{MetadataCommand, CargoOpt};
use ra_arena::{Arena, RawId, impl_arena_id}; use ra_arena::{Arena, RawId, impl_arena_id};
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use failure::format_err;
use ra_db::Edition; use ra_db::Edition;
use crate::Result; use crate::Result;
@ -127,7 +126,7 @@ impl CargoWorkspace {
if let Some(parent) = cargo_toml.parent() { if let Some(parent) = cargo_toml.parent() {
meta.current_dir(parent); meta.current_dir(parent);
} }
let meta = meta.exec().map_err(|e| format_err!("cargo metadata failed: {}", e))?; let meta = meta.exec().map_err(|e| format!("cargo metadata failed: {}", e))?;
let mut pkg_by_id = FxHashMap::default(); let mut pkg_by_id = FxHashMap::default();
let mut packages = Arena::default(); let mut packages = Arena::default();
let mut targets = Arena::default(); let mut targets = Arena::default();

View file

@ -6,9 +6,9 @@ use std::{
fs::File, fs::File,
io::BufReader, io::BufReader,
path::{Path, PathBuf}, path::{Path, PathBuf},
error::Error
}; };
use failure::bail;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use ra_db::{CrateGraph, FileId, Edition}; use ra_db::{CrateGraph, FileId, Edition};
@ -24,7 +24,7 @@ pub use crate::{
}; };
// FIXME use proper error enum // FIXME use proper error enum
pub type Result<T> = ::std::result::Result<T, ::failure::Error>; pub type Result<T> = ::std::result::Result<T, Box<dyn Error + Send + Sync>>;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub enum ProjectWorkspace { pub enum ProjectWorkspace {
@ -298,5 +298,5 @@ fn find_cargo_toml(path: &Path) -> Result<PathBuf> {
} }
curr = path.parent(); curr = path.parent();
} }
bail!("can't find Cargo.toml at {}", path.display()) Err(format!("can't find Cargo.toml at {}", path.display()))?
} }

View file

@ -38,18 +38,18 @@ impl Sysroot {
.args(&["--print", "sysroot"]) .args(&["--print", "sysroot"])
.output()?; .output()?;
if !rustc_output.status.success() { if !rustc_output.status.success() {
failure::bail!("failed to locate sysroot") Err("failed to locate sysroot")?
} }
let stdout = String::from_utf8(rustc_output.stdout)?; let stdout = String::from_utf8(rustc_output.stdout)?;
let sysroot_path = Path::new(stdout.trim()); let sysroot_path = Path::new(stdout.trim());
let src = sysroot_path.join("lib/rustlib/src/rust/src"); let src = sysroot_path.join("lib/rustlib/src/rust/src");
if !src.exists() { if !src.exists() {
failure::bail!( Err(format!(
"can't load standard library from sysroot\n\ "can't load standard library from sysroot\n\
{:?}\n\ {:?}\n\
try running `rustup component add rust-src`", try running `rustup component add rust-src`",
src, src,
); ))?;
} }
let mut sysroot = Sysroot { crates: Arena::default() }; let mut sysroot = Sysroot { crates: Arena::default() };