mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 22:31:43 +00:00
Get rid of failure: ra_lsp_server & ra_project_model
This commit is contained in:
parent
a931fb1ef6
commit
9709bd39ca
10 changed files with 32 additions and 36 deletions
|
@ -9,5 +9,5 @@ pub mod req;
|
|||
pub mod init;
|
||||
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};
|
||||
|
|
|
@ -25,7 +25,7 @@ fn main() -> Result<()> {
|
|||
}
|
||||
Err(_) => {
|
||||
log::error!("server panicked");
|
||||
failure::bail!("server panicked")
|
||||
Err("server panicked")?
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,11 +2,9 @@ mod handlers;
|
|||
mod subscriptions;
|
||||
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 failure::{bail, format_err};
|
||||
use failure_derive::Fail;
|
||||
use gen_lsp_server::{
|
||||
handle_shutdown, ErrorCode, RawMessage, RawNotification, RawRequest, RawResponse,
|
||||
};
|
||||
|
@ -32,8 +30,7 @@ use crate::{
|
|||
const THREADPOOL_SIZE: usize = 8;
|
||||
const MAX_IN_FLIGHT_LIBS: usize = THREADPOOL_SIZE - 3;
|
||||
|
||||
#[derive(Debug, Fail)]
|
||||
#[fail(display = "Language Server request failed with {}. ({})", code, message)]
|
||||
#[derive(Debug)]
|
||||
pub struct LspError {
|
||||
pub code: i32,
|
||||
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(
|
||||
ws_roots: Vec<PathBuf>,
|
||||
options: InitializationOptions,
|
||||
|
@ -177,12 +182,12 @@ fn main_loop_inner(
|
|||
let event = select! {
|
||||
recv(msg_receiver) -> msg => match 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(state.vfs.read().task_receiver()) -> task => match task {
|
||||
Ok(task) => Event::Vfs(task),
|
||||
Err(RecvError) => bail!("vfs died"),
|
||||
Err(RecvError) => Err("vfs died")?,
|
||||
},
|
||||
recv(libdata_receiver) -> data => Event::Lib(data.unwrap())
|
||||
};
|
||||
|
@ -380,7 +385,7 @@ fn on_notification(
|
|||
let not = match not.cast::<req::DidOpenTextDocument>() {
|
||||
Ok(params) => {
|
||||
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().add_file_overlay(&path, params.text_document.text)
|
||||
{
|
||||
|
@ -393,9 +398,9 @@ fn on_notification(
|
|||
let not = match not.cast::<req::DidChangeTextDocument>() {
|
||||
Ok(mut params) => {
|
||||
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 =
|
||||
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);
|
||||
return Ok(());
|
||||
}
|
||||
|
@ -404,7 +409,7 @@ fn on_notification(
|
|||
let not = match not.cast::<req::DidCloseTextDocument>() {
|
||||
Ok(params) => {
|
||||
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()) {
|
||||
subs.remove_sub(FileId(file_id.0));
|
||||
}
|
||||
|
@ -546,7 +551,7 @@ where
|
|||
RawResponse::err(
|
||||
id,
|
||||
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();
|
||||
}
|
||||
|
||||
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()
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ use ra_ide_api::{
|
|||
use ra_vfs::{Vfs, VfsChange, VfsFile, VfsRoot};
|
||||
use relative_path::RelativePathBuf;
|
||||
use parking_lot::RwLock;
|
||||
use failure::{Error, format_err};
|
||||
use gen_lsp_server::ErrorCode;
|
||||
|
||||
use crate::{
|
||||
|
@ -169,13 +168,13 @@ impl WorldSnapshot {
|
|||
}
|
||||
|
||||
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(|| {
|
||||
// Show warning as this file is outside current workspace
|
||||
Error::from(LspError {
|
||||
LspError {
|
||||
code: ErrorCode::InvalidRequest as i32,
|
||||
message: "Rust file outside current workspace is not supported yet.".to_string(),
|
||||
})
|
||||
}
|
||||
})?;
|
||||
Ok(FileId(file.0))
|
||||
}
|
||||
|
@ -183,7 +182,7 @@ impl WorldSnapshot {
|
|||
pub fn file_id_to_uri(&self, id: FileId) -> Result<Url> {
|
||||
let path = self.vfs.read().file2path(VfsFile(id.0));
|
||||
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)
|
||||
}
|
||||
|
||||
|
@ -191,7 +190,7 @@ impl WorldSnapshot {
|
|||
let base = self.vfs.read().root2path(VfsRoot(root.0));
|
||||
let path = path.to_path(base);
|
||||
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)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue