diff options
Diffstat (limited to 'crates/ra_lsp_server/src/main.rs')
-rw-r--r-- | crates/ra_lsp_server/src/main.rs | 74 |
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 @@ | |||
1 | use flexi_logger::{Duplicate, Logger}; | 1 | use flexi_logger::{Duplicate, Logger}; |
2 | use lsp_server::{run_server, stdio_transport, LspServerError}; | 2 | use lsp_server::Connection; |
3 | 3 | ||
4 | use ra_lsp_server::{show_message, Result, ServerConfig}; | 4 | use ra_lsp_server::{show_message, Result, ServerConfig}; |
5 | use ra_prof; | 5 | use ra_prof; |
@@ -29,46 +29,46 @@ fn main() -> Result<()> { | |||
29 | } | 29 | } |
30 | 30 | ||
31 | fn main_inner() -> Result<()> { | 31 | fn 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"); |