diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-04-14 18:26:07 +0100 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-04-14 18:26:07 +0100 |
commit | 88be6f32172813f53dae60d73c9f5deb0c3fb29f (patch) | |
tree | 0b5f8f793929f651dfe332e0f5545b938ff5189f /crates/ra_lsp_server/src/main.rs | |
parent | 5d35f284f5ac70cde5d758e7c63a38eae0fb0b55 (diff) | |
parent | c2dfc8a229c0a18dff08d5ce7e6836c91648eee5 (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.rs | 13 |
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()?; |