diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-09 10:21:13 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-02-09 10:21:13 +0000 |
commit | d0a32627a741826502692f2c3de71512b7ec23cf (patch) | |
tree | ee3cef56bd9738f5c3b98caae9b8ce1b8dbf401f /crates/ra_lsp_server/src/project_model.rs | |
parent | 34398a8756b56c323d3b4b2ef32fbca32d88a105 (diff) | |
parent | e91a46eb0c4a355af25656d77dead55c2e29258e (diff) |
Merge #767
767: Extract project model to separate crate r=matklad a=flodiebold
I'm looking into creating a separate crate that would allow getting a HIR db for a project for 'batch' analyses, and this seems to be an obvious first step. We'd probably want to change the error handling to not rely on failure, though, right?
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_lsp_server/src/project_model.rs')
-rw-r--r-- | crates/ra_lsp_server/src/project_model.rs | 42 |
1 files changed, 3 insertions, 39 deletions
diff --git a/crates/ra_lsp_server/src/project_model.rs b/crates/ra_lsp_server/src/project_model.rs index fd5875a0a..6800eb138 100644 --- a/crates/ra_lsp_server/src/project_model.rs +++ b/crates/ra_lsp_server/src/project_model.rs | |||
@@ -1,34 +1,13 @@ | |||
1 | mod cargo_workspace; | 1 | use std::path::PathBuf; |
2 | mod sysroot; | ||
3 | 2 | ||
4 | use std::path::{Path, PathBuf}; | ||
5 | |||
6 | use failure::bail; | ||
7 | use thread_worker::{WorkerHandle, Worker}; | 3 | use thread_worker::{WorkerHandle, Worker}; |
8 | 4 | ||
9 | use crate::Result; | 5 | use crate::Result; |
10 | 6 | ||
11 | pub use crate::project_model::{ | 7 | pub use ra_project_model::{ |
12 | cargo_workspace::{CargoWorkspace, Package, Target, TargetKind}, | 8 | ProjectWorkspace, CargoWorkspace, Package, Target, TargetKind, Sysroot, |
13 | sysroot::Sysroot, | ||
14 | }; | 9 | }; |
15 | 10 | ||
16 | #[derive(Debug, Clone)] | ||
17 | pub struct ProjectWorkspace { | ||
18 | pub(crate) cargo: CargoWorkspace, | ||
19 | pub(crate) sysroot: Sysroot, | ||
20 | } | ||
21 | |||
22 | impl ProjectWorkspace { | ||
23 | pub fn discover(path: &Path) -> Result<ProjectWorkspace> { | ||
24 | let cargo_toml = find_cargo_toml(path)?; | ||
25 | let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml)?; | ||
26 | let sysroot = Sysroot::discover(&cargo_toml)?; | ||
27 | let res = ProjectWorkspace { cargo, sysroot }; | ||
28 | Ok(res) | ||
29 | } | ||
30 | } | ||
31 | |||
32 | pub fn workspace_loader() -> (Worker<PathBuf, Result<ProjectWorkspace>>, WorkerHandle) { | 11 | pub fn workspace_loader() -> (Worker<PathBuf, Result<ProjectWorkspace>>, WorkerHandle) { |
33 | thread_worker::spawn::<PathBuf, Result<ProjectWorkspace>, _>( | 12 | thread_worker::spawn::<PathBuf, Result<ProjectWorkspace>, _>( |
34 | "workspace loader", | 13 | "workspace loader", |
@@ -42,18 +21,3 @@ pub fn workspace_loader() -> (Worker<PathBuf, Result<ProjectWorkspace>>, WorkerH | |||
42 | }, | 21 | }, |
43 | ) | 22 | ) |
44 | } | 23 | } |
45 | |||
46 | fn find_cargo_toml(path: &Path) -> Result<PathBuf> { | ||
47 | if path.ends_with("Cargo.toml") { | ||
48 | return Ok(path.to_path_buf()); | ||
49 | } | ||
50 | let mut curr = Some(path); | ||
51 | while let Some(path) = curr { | ||
52 | let candidate = path.join("Cargo.toml"); | ||
53 | if candidate.exists() { | ||
54 | return Ok(candidate); | ||
55 | } | ||
56 | curr = path.parent(); | ||
57 | } | ||
58 | bail!("can't find Cargo.toml at {}", path.display()) | ||
59 | } | ||