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(
world: ServerWorld,
params: req::WorkspaceSymbolParams,
) -> Result<Option<Vec<SymbolInformation>>> {
- let all_symbols = params.query.contains("#");
- let libs = params.query.contains("*");
+ let all_symbols = params.query.contains('#');
+ let libs = params.query.contains('*');
let query = {
let query: String = params
.query
.filter_map(|ws| {
let tgt = ws.target_by_root(path)?;
Some((
- tgt.package(ws).name(ws).clone(),
- tgt.name(ws).clone(),
+ tgt.package(ws).name(ws),
+ tgt.name(ws),
tgt.kind(ws),
))
})
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),
pub fn main_loop(
internal_mode: bool,
root: PathBuf,
- msg_receriver: &Receiver<RawMessage>,
+ msg_receiver: &Receiver<RawMessage>,
msg_sender: &Sender<RawMessage>,
) -> Result<()> {
let pool = rayon::ThreadPoolBuilder::new()
root,
&pool,
msg_sender,
- msg_receriver,
+ msg_receiver,
task_sender,
task_receiver.clone(),
fs_worker,
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);