From d19f3ac83441420365bff5e4ce21d1d2175bd8c2 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 13 Aug 2018 15:35:53 +0300 Subject: workspace symbols --- crates/server/src/main_loop/handlers.rs | 29 +++++++++++++++++++++++++++-- crates/server/src/main_loop/mod.rs | 4 ++++ 2 files changed, 31 insertions(+), 2 deletions(-) (limited to 'crates/server/src/main_loop') diff --git a/crates/server/src/main_loop/handlers.rs b/crates/server/src/main_loop/handlers.rs index 14dcafc38..bd0e6825b 100644 --- a/crates/server/src/main_loop/handlers.rs +++ b/crates/server/src/main_loop/handlers.rs @@ -2,9 +2,10 @@ use std::collections::HashMap; use languageserver_types::{ Diagnostic, DiagnosticSeverity, Url, DocumentSymbol, - Command, TextDocumentIdentifier, WorkspaceEdit + Command, TextDocumentIdentifier, WorkspaceEdit, + SymbolInformation, Location, }; -use libanalysis::World; +use libanalysis::{World}; use libeditor; use libsyntax2::TextUnit; use serde_json::{to_value, from_value}; @@ -94,6 +95,30 @@ pub fn handle_code_action( Ok(ret) } +pub fn handle_workspace_symbol( + world: World, + params: req::WorkspaceSymbolParams, +) -> Result>> { + let mut acc = Vec::new(); + for (path, symbol) in world.world_symbols(¶ms.query).take(128) { + let line_index = world.file_line_index(path)?; + + let info = SymbolInformation { + name: symbol.name.to_string(), + kind: symbol.kind.conv(), + location: Location::new( + Url::from_file_path(path) + .map_err(|()| format_err!("invalid url"))?, + symbol.node_range.conv_with(&line_index), + ), + container_name: None, + }; + acc.push(info); + }; + + Ok(Some(acc)) +} + pub fn handle_execute_command( world: World, mut params: req::ExecuteCommandParams, diff --git a/crates/server/src/main_loop/mod.rs b/crates/server/src/main_loop/mod.rs index f954e632c..e8b24355c 100644 --- a/crates/server/src/main_loop/mod.rs +++ b/crates/server/src/main_loop/mod.rs @@ -25,6 +25,7 @@ use { handle_document_symbol, handle_code_action, handle_execute_command, + handle_workspace_symbol, }, }; @@ -148,6 +149,9 @@ fn on_request( handle_request_on_threadpool::( &mut req, pool, world, sender, handle_code_action, )?; + handle_request_on_threadpool::( + &mut req, pool, world, sender, handle_workspace_symbol, + )?; dispatch::handle_request::(&mut req, |params, resp| { io.send(RawMsg::Response(resp.into_response(Ok(None))?)); -- cgit v1.2.3