diff options
Diffstat (limited to 'crates/project_model')
-rw-r--r-- | crates/project_model/src/lib.rs | 8 | ||||
-rw-r--r-- | crates/project_model/src/project_json.rs | 21 |
2 files changed, 21 insertions, 8 deletions
diff --git a/crates/project_model/src/lib.rs b/crates/project_model/src/lib.rs index 288c39e49..258f60e28 100644 --- a/crates/project_model/src/lib.rs +++ b/crates/project_model/src/lib.rs | |||
@@ -308,7 +308,13 @@ impl ProjectWorkspace { | |||
308 | .crates() | 308 | .crates() |
309 | .filter_map(|(crate_id, krate)| { | 309 | .filter_map(|(crate_id, krate)| { |
310 | let file_path = &krate.root_module; | 310 | let file_path = &krate.root_module; |
311 | let file_id = load(&file_path)?; | 311 | let file_id = match load(&file_path) { |
312 | Some(id) => id, | ||
313 | None => { | ||
314 | log::error!("failed to load crate root {}", file_path.display()); | ||
315 | return None; | ||
316 | } | ||
317 | }; | ||
312 | 318 | ||
313 | let env = krate.env.clone().into_iter().collect(); | 319 | let env = krate.env.clone().into_iter().collect(); |
314 | let proc_macro = krate | 320 | let proc_macro = krate |
diff --git a/crates/project_model/src/project_json.rs b/crates/project_model/src/project_json.rs index 545f254aa..a6895ecdd 100644 --- a/crates/project_model/src/project_json.rs +++ b/crates/project_model/src/project_json.rs | |||
@@ -13,7 +13,7 @@ use crate::cfg_flag::CfgFlag; | |||
13 | #[derive(Clone, Debug, Eq, PartialEq)] | 13 | #[derive(Clone, Debug, Eq, PartialEq)] |
14 | pub struct ProjectJson { | 14 | pub struct ProjectJson { |
15 | pub(crate) sysroot_src: Option<AbsPathBuf>, | 15 | pub(crate) sysroot_src: Option<AbsPathBuf>, |
16 | project_root: Option<AbsPathBuf>, | 16 | project_root: AbsPathBuf, |
17 | crates: Vec<Crate>, | 17 | crates: Vec<Crate>, |
18 | } | 18 | } |
19 | 19 | ||
@@ -34,10 +34,17 @@ pub struct Crate { | |||
34 | } | 34 | } |
35 | 35 | ||
36 | impl ProjectJson { | 36 | impl ProjectJson { |
37 | /// Create a new ProjectJson instance. | ||
38 | /// | ||
39 | /// # Arguments | ||
40 | /// | ||
41 | /// * `base` - The path to the workspace root (i.e. the folder containing `rust-project.json`) | ||
42 | /// * `data` - The parsed contents of `rust-project.json`, or project json that's passed via | ||
43 | /// configuration. | ||
37 | pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { | 44 | pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { |
38 | ProjectJson { | 45 | ProjectJson { |
39 | sysroot_src: data.sysroot_src.map(|it| base.join(it)), | 46 | sysroot_src: data.sysroot_src.map(|it| base.join(it)), |
40 | project_root: base.parent().map(AbsPath::to_path_buf), | 47 | project_root: base.to_path_buf(), |
41 | crates: data | 48 | crates: data |
42 | .crates | 49 | .crates |
43 | .into_iter() | 50 | .into_iter() |
@@ -85,17 +92,17 @@ impl ProjectJson { | |||
85 | .collect::<Vec<_>>(), | 92 | .collect::<Vec<_>>(), |
86 | } | 93 | } |
87 | } | 94 | } |
95 | /// Returns the number of crates in the project. | ||
88 | pub fn n_crates(&self) -> usize { | 96 | pub fn n_crates(&self) -> usize { |
89 | self.crates.len() | 97 | self.crates.len() |
90 | } | 98 | } |
99 | /// Returns an iterator over the crates in the project. | ||
91 | pub fn crates(&self) -> impl Iterator<Item = (CrateId, &Crate)> + '_ { | 100 | pub fn crates(&self) -> impl Iterator<Item = (CrateId, &Crate)> + '_ { |
92 | self.crates.iter().enumerate().map(|(idx, krate)| (CrateId(idx as u32), krate)) | 101 | self.crates.iter().enumerate().map(|(idx, krate)| (CrateId(idx as u32), krate)) |
93 | } | 102 | } |
94 | pub fn path(&self) -> Option<&AbsPath> { | 103 | /// Returns the path to the project's root folder. |
95 | match &self.project_root { | 104 | pub fn path(&self) -> &AbsPath { |
96 | Some(p) => Some(p.as_path()), | 105 | &self.project_root |
97 | None => None, | ||
98 | } | ||
99 | } | 106 | } |
100 | } | 107 | } |
101 | 108 | ||