aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server/src/main.rs')
-rw-r--r--crates/ra_lsp_server/src/main.rs74
1 files changed, 37 insertions, 37 deletions
diff --git a/crates/ra_lsp_server/src/main.rs b/crates/ra_lsp_server/src/main.rs
index 1debe7660..88504bb89 100644
--- a/crates/ra_lsp_server/src/main.rs
+++ b/crates/ra_lsp_server/src/main.rs
@@ -1,5 +1,5 @@
1use flexi_logger::{Duplicate, Logger}; 1use flexi_logger::{Duplicate, Logger};
2use lsp_server::{run_server, stdio_transport, LspServerError}; 2use lsp_server::Connection;
3 3
4use ra_lsp_server::{show_message, Result, ServerConfig}; 4use ra_lsp_server::{show_message, Result, ServerConfig};
5use ra_prof; 5use ra_prof;
@@ -29,46 +29,46 @@ fn main() -> Result<()> {
29} 29}
30 30
31fn main_inner() -> Result<()> { 31fn main_inner() -> Result<()> {
32 let (sender, receiver, io_threads) = stdio_transport();
33 let cwd = std::env::current_dir()?; 32 let cwd = std::env::current_dir()?;
34 let caps = serde_json::to_value(ra_lsp_server::server_capabilities()).unwrap(); 33 let (connection, io_threads) = Connection::stdio();
35 run_server(caps, sender, receiver, |params, s, r| { 34 let server_capabilities = serde_json::to_value(ra_lsp_server::server_capabilities()).unwrap();
36 let params: lsp_types::InitializeParams = serde_json::from_value(params)?;
37 let root = params.root_uri.and_then(|it| it.to_file_path().ok()).unwrap_or(cwd);
38 35
39 let workspace_roots = params 36 let initialize_params = connection.initialize(server_capabilities)?;
40 .workspace_folders 37 let initialize_params: lsp_types::InitializeParams = serde_json::from_value(initialize_params)?;
41 .map(|workspaces| {
42 workspaces
43 .into_iter()
44 .filter_map(|it| it.uri.to_file_path().ok())
45 .collect::<Vec<_>>()
46 })
47 .filter(|workspaces| !workspaces.is_empty())
48 .unwrap_or_else(|| vec![root]);
49 38
50 let server_config: ServerConfig = params 39 let root = initialize_params.root_uri.and_then(|it| it.to_file_path().ok()).unwrap_or(cwd);
51 .initialization_options 40
52 .and_then(|v| { 41 let workspace_roots = initialize_params
53 serde_json::from_value(v) 42 .workspace_folders
54 .map_err(|e| { 43 .map(|workspaces| {
55 log::error!("failed to deserialize config: {}", e); 44 workspaces.into_iter().filter_map(|it| it.uri.to_file_path().ok()).collect::<Vec<_>>()
56 show_message( 45 })
57 lsp_types::MessageType::Error, 46 .filter(|workspaces| !workspaces.is_empty())
58 format!("failed to deserialize config: {}", e), 47 .unwrap_or_else(|| vec![root]);
59 s, 48
60 ); 49 let server_config: ServerConfig = initialize_params
61 }) 50 .initialization_options
62 .ok() 51 .and_then(|v| {
63 }) 52 serde_json::from_value(v)
64 .unwrap_or_default(); 53 .map_err(|e| {
54 log::error!("failed to deserialize config: {}", e);
55 show_message(
56 lsp_types::MessageType::Error,
57 format!("failed to deserialize config: {}", e),
58 &connection.sender,
59 );
60 })
61 .ok()
62 })
63 .unwrap_or_default();
64
65 ra_lsp_server::main_loop(
66 workspace_roots,
67 initialize_params.capabilities,
68 server_config,
69 &connection,
70 )?;
65 71
66 ra_lsp_server::main_loop(workspace_roots, params.capabilities, server_config, r, s)
67 })
68 .map_err(|err| match err {
69 LspServerError::ProtocolError(err) => err.into(),
70 LspServerError::ServerError(err) => err,
71 })?;
72 log::info!("shutting down IO..."); 72 log::info!("shutting down IO...");
73 io_threads.join()?; 73 io_threads.join()?;
74 log::info!("... IO is down"); 74 log::info!("... IO is down");