aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server/src/main.rs
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-04-14 18:26:07 +0100
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-04-14 18:26:07 +0100
commit88be6f32172813f53dae60d73c9f5deb0c3fb29f (patch)
tree0b5f8f793929f651dfe332e0f5545b938ff5189f /crates/ra_lsp_server/src/main.rs
parent5d35f284f5ac70cde5d758e7c63a38eae0fb0b55 (diff)
parentc2dfc8a229c0a18dff08d5ce7e6836c91648eee5 (diff)
Merge #1137
1137: Adds support for multiple editor workspaces on initialization r=matklad a=jrvidal OK, so this "simple hack" turned out to be way more contrived than I expected :joy: ### What works This patch only handles multi-folder editor workspaces _on initialization_. * I've found that modifying the layout of a workspace in VSCode just reloads the extension, so this hack should be enough for now. * Not sure about how emacs-lsp behaves, but we fallback gracefully to the mono-folder workspace, so it should be fine. ### What doesn't work * [x] `cargo watch` can only watch a single root folder with a `Cargo.toml`. I've left this part untouched but we could either warn that it's not supported or launch _multiple_ `cargo-watch` processes. * [x] The `rust-analyzer/runnables` command is not functional, since we don't send the correct `cwd`. * [x] Should we add some happy path test to `heavy_tests`? * [ ] Going from a single `root` to multiple `roots` leaves us with a couple of `n * m` loops that smell a bit. The number of folders in the editor workspace is probably low though. Co-authored-by: Roberto Vidal <[email protected]>
Diffstat (limited to 'crates/ra_lsp_server/src/main.rs')
-rw-r--r--crates/ra_lsp_server/src/main.rs13
1 files changed, 12 insertions, 1 deletions
diff --git a/crates/ra_lsp_server/src/main.rs b/crates/ra_lsp_server/src/main.rs
index eb4091a3d..82f52a6e8 100644
--- a/crates/ra_lsp_server/src/main.rs
+++ b/crates/ra_lsp_server/src/main.rs
@@ -40,12 +40,23 @@ fn main_inner() -> Result<()> {
40 run_server(ra_lsp_server::server_capabilities(), receiver, sender, |params, r, s| { 40 run_server(ra_lsp_server::server_capabilities(), receiver, sender, |params, r, s| {
41 let root = params.root_uri.and_then(|it| it.to_file_path().ok()).unwrap_or(cwd); 41 let root = params.root_uri.and_then(|it| it.to_file_path().ok()).unwrap_or(cwd);
42 42
43 let workspace_roots = params
44 .workspace_folders
45 .map(|workspaces| {
46 workspaces
47 .into_iter()
48 .filter_map(|it| it.uri.to_file_path().ok())
49 .collect::<Vec<_>>()
50 })
51 .filter(|workspaces| !workspaces.is_empty())
52 .unwrap_or_else(|| vec![root]);
53
43 let opts = params 54 let opts = params
44 .initialization_options 55 .initialization_options
45 .and_then(|v| InitializationOptions::deserialize(v).ok()) 56 .and_then(|v| InitializationOptions::deserialize(v).ok())
46 .unwrap_or(InitializationOptions::default()); 57 .unwrap_or(InitializationOptions::default());
47 58
48 ra_lsp_server::main_loop(root, opts, r, s) 59 ra_lsp_server::main_loop(workspace_roots, opts, r, s)
49 })?; 60 })?;
50 log::info!("shutting down IO..."); 61 log::info!("shutting down IO...");
51 threads.join()?; 62 threads.join()?;