diff options
author | Jonas Schievink <[email protected]> | 2020-09-11 13:48:56 +0100 |
---|---|---|
committer | Jonas Schievink <[email protected]> | 2020-09-11 13:48:56 +0100 |
commit | 681ac6294ada917b8c5fbba60f9ba1c82da338aa (patch) | |
tree | cc663cb5aefb149c0a0bdb666d60b2d46c8cb265 | |
parent | 4f1167d8ddac9d392f034341e6bc032b51014918 (diff) |
Report better errors in project.json/sysroot
-rw-r--r-- | crates/project_model/src/lib.rs | 32 | ||||
-rw-r--r-- | crates/project_model/src/project_json.rs | 6 | ||||
-rw-r--r-- | crates/project_model/src/sysroot.rs | 13 | ||||
-rw-r--r-- | crates/rust-analyzer/src/reload.rs | 2 |
4 files changed, 36 insertions, 17 deletions
diff --git a/crates/project_model/src/lib.rs b/crates/project_model/src/lib.rs index 2d91939ce..288c39e49 100644 --- a/crates/project_model/src/lib.rs +++ b/crates/project_model/src/lib.rs | |||
@@ -33,7 +33,7 @@ pub enum ProjectWorkspace { | |||
33 | /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`. | 33 | /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`. |
34 | Cargo { cargo: CargoWorkspace, sysroot: Sysroot }, | 34 | Cargo { cargo: CargoWorkspace, sysroot: Sysroot }, |
35 | /// Project workspace was manually specified using a `rust-project.json` file. | 35 | /// Project workspace was manually specified using a `rust-project.json` file. |
36 | Json { project: ProjectJson }, | 36 | Json { project: ProjectJson, sysroot: Option<Sysroot> }, |
37 | } | 37 | } |
38 | 38 | ||
39 | impl fmt::Debug for ProjectWorkspace { | 39 | impl fmt::Debug for ProjectWorkspace { |
@@ -44,10 +44,10 @@ impl fmt::Debug for ProjectWorkspace { | |||
44 | .field("n_packages", &cargo.packages().len()) | 44 | .field("n_packages", &cargo.packages().len()) |
45 | .field("n_sysroot_crates", &sysroot.crates().len()) | 45 | .field("n_sysroot_crates", &sysroot.crates().len()) |
46 | .finish(), | 46 | .finish(), |
47 | ProjectWorkspace::Json { project } => { | 47 | ProjectWorkspace::Json { project, sysroot } => { |
48 | let mut debug_struct = f.debug_struct("Json"); | 48 | let mut debug_struct = f.debug_struct("Json"); |
49 | debug_struct.field("n_crates", &project.n_crates()); | 49 | debug_struct.field("n_crates", &project.n_crates()); |
50 | if let Some(sysroot) = &project.sysroot { | 50 | if let Some(sysroot) = sysroot { |
51 | debug_struct.field("n_sysroot_crates", &sysroot.crates().len()); | 51 | debug_struct.field("n_sysroot_crates", &sysroot.crates().len()); |
52 | } | 52 | } |
53 | debug_struct.finish() | 53 | debug_struct.finish() |
@@ -169,7 +169,11 @@ impl ProjectWorkspace { | |||
169 | })?; | 169 | })?; |
170 | let project_location = project_json.parent().unwrap().to_path_buf(); | 170 | let project_location = project_json.parent().unwrap().to_path_buf(); |
171 | let project = ProjectJson::new(&project_location, data); | 171 | let project = ProjectJson::new(&project_location, data); |
172 | ProjectWorkspace::Json { project } | 172 | let sysroot = match &project.sysroot_src { |
173 | Some(path) => Some(Sysroot::load(path)?), | ||
174 | None => None, | ||
175 | }; | ||
176 | ProjectWorkspace::Json { project, sysroot } | ||
173 | } | 177 | } |
174 | ProjectManifest::CargoToml(cargo_toml) => { | 178 | ProjectManifest::CargoToml(cargo_toml) => { |
175 | let cargo_version = utf8_stdout({ | 179 | let cargo_version = utf8_stdout({ |
@@ -203,12 +207,21 @@ impl ProjectWorkspace { | |||
203 | Ok(res) | 207 | Ok(res) |
204 | } | 208 | } |
205 | 209 | ||
210 | pub fn load_inline(project_json: ProjectJson) -> Result<ProjectWorkspace> { | ||
211 | let sysroot = match &project_json.sysroot_src { | ||
212 | Some(path) => Some(Sysroot::load(path)?), | ||
213 | None => None, | ||
214 | }; | ||
215 | |||
216 | Ok(ProjectWorkspace::Json { project: project_json, sysroot }) | ||
217 | } | ||
218 | |||
206 | /// Returns the roots for the current `ProjectWorkspace` | 219 | /// Returns the roots for the current `ProjectWorkspace` |
207 | /// The return type contains the path and whether or not | 220 | /// The return type contains the path and whether or not |
208 | /// the root is a member of the current workspace | 221 | /// the root is a member of the current workspace |
209 | pub fn to_roots(&self) -> Vec<PackageRoot> { | 222 | pub fn to_roots(&self) -> Vec<PackageRoot> { |
210 | match self { | 223 | match self { |
211 | ProjectWorkspace::Json { project } => project | 224 | ProjectWorkspace::Json { project, sysroot } => project |
212 | .crates() | 225 | .crates() |
213 | .map(|(_, krate)| PackageRoot { | 226 | .map(|(_, krate)| PackageRoot { |
214 | is_member: krate.is_workspace_member, | 227 | is_member: krate.is_workspace_member, |
@@ -217,7 +230,7 @@ impl ProjectWorkspace { | |||
217 | }) | 230 | }) |
218 | .collect::<FxHashSet<_>>() | 231 | .collect::<FxHashSet<_>>() |
219 | .into_iter() | 232 | .into_iter() |
220 | .chain(project.sysroot.as_ref().into_iter().flat_map(|sysroot| { | 233 | .chain(sysroot.as_ref().into_iter().flat_map(|sysroot| { |
221 | sysroot.crates().map(move |krate| PackageRoot { | 234 | sysroot.crates().map(move |krate| PackageRoot { |
222 | is_member: false, | 235 | is_member: false, |
223 | include: vec![sysroot[krate].root_dir().to_path_buf()], | 236 | include: vec![sysroot[krate].root_dir().to_path_buf()], |
@@ -255,7 +268,7 @@ impl ProjectWorkspace { | |||
255 | 268 | ||
256 | pub fn proc_macro_dylib_paths(&self) -> Vec<AbsPathBuf> { | 269 | pub fn proc_macro_dylib_paths(&self) -> Vec<AbsPathBuf> { |
257 | match self { | 270 | match self { |
258 | ProjectWorkspace::Json { project } => project | 271 | ProjectWorkspace::Json { project, sysroot: _ } => project |
259 | .crates() | 272 | .crates() |
260 | .filter_map(|(_, krate)| krate.proc_macro_dylib_path.as_ref()) | 273 | .filter_map(|(_, krate)| krate.proc_macro_dylib_path.as_ref()) |
261 | .cloned() | 274 | .cloned() |
@@ -285,9 +298,8 @@ impl ProjectWorkspace { | |||
285 | ) -> CrateGraph { | 298 | ) -> CrateGraph { |
286 | let mut crate_graph = CrateGraph::default(); | 299 | let mut crate_graph = CrateGraph::default(); |
287 | match self { | 300 | match self { |
288 | ProjectWorkspace::Json { project } => { | 301 | ProjectWorkspace::Json { project, sysroot } => { |
289 | let sysroot_dps = project | 302 | let sysroot_dps = sysroot |
290 | .sysroot | ||
291 | .as_ref() | 303 | .as_ref() |
292 | .map(|sysroot| sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load)); | 304 | .map(|sysroot| sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load)); |
293 | 305 | ||
diff --git a/crates/project_model/src/project_json.rs b/crates/project_model/src/project_json.rs index 5a0fe749a..979e90058 100644 --- a/crates/project_model/src/project_json.rs +++ b/crates/project_model/src/project_json.rs | |||
@@ -7,12 +7,12 @@ use paths::{AbsPath, AbsPathBuf}; | |||
7 | use rustc_hash::FxHashMap; | 7 | use rustc_hash::FxHashMap; |
8 | use serde::{de, Deserialize}; | 8 | use serde::{de, Deserialize}; |
9 | 9 | ||
10 | use crate::{cfg_flag::CfgFlag, Sysroot}; | 10 | use crate::cfg_flag::CfgFlag; |
11 | 11 | ||
12 | /// Roots and crates that compose this Rust project. | 12 | /// Roots and crates that compose this Rust project. |
13 | #[derive(Clone, Debug, Eq, PartialEq)] | 13 | #[derive(Clone, Debug, Eq, PartialEq)] |
14 | pub struct ProjectJson { | 14 | pub struct ProjectJson { |
15 | pub(crate) sysroot: Option<Sysroot>, | 15 | pub(crate) sysroot_src: Option<AbsPathBuf>, |
16 | crates: Vec<Crate>, | 16 | crates: Vec<Crate>, |
17 | } | 17 | } |
18 | 18 | ||
@@ -35,7 +35,7 @@ pub struct Crate { | |||
35 | impl ProjectJson { | 35 | impl ProjectJson { |
36 | pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { | 36 | pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { |
37 | ProjectJson { | 37 | ProjectJson { |
38 | sysroot: data.sysroot_src.map(|it| base.join(it)).map(|it| Sysroot::load(&it)), | 38 | sysroot_src: data.sysroot_src.map(|it| base.join(it)), |
39 | crates: data | 39 | crates: data |
40 | .crates | 40 | .crates |
41 | .into_iter() | 41 | .into_iter() |
diff --git a/crates/project_model/src/sysroot.rs b/crates/project_model/src/sysroot.rs index 74c0eda9a..871808d89 100644 --- a/crates/project_model/src/sysroot.rs +++ b/crates/project_model/src/sysroot.rs | |||
@@ -51,11 +51,11 @@ impl Sysroot { | |||
51 | pub fn discover(cargo_toml: &AbsPath) -> Result<Sysroot> { | 51 | pub fn discover(cargo_toml: &AbsPath) -> Result<Sysroot> { |
52 | let current_dir = cargo_toml.parent().unwrap(); | 52 | let current_dir = cargo_toml.parent().unwrap(); |
53 | let sysroot_src_dir = discover_sysroot_src_dir(current_dir)?; | 53 | let sysroot_src_dir = discover_sysroot_src_dir(current_dir)?; |
54 | let res = Sysroot::load(&sysroot_src_dir); | 54 | let res = Sysroot::load(&sysroot_src_dir)?; |
55 | Ok(res) | 55 | Ok(res) |
56 | } | 56 | } |
57 | 57 | ||
58 | pub fn load(sysroot_src_dir: &AbsPath) -> Sysroot { | 58 | pub fn load(sysroot_src_dir: &AbsPath) -> Result<Sysroot> { |
59 | let mut sysroot = Sysroot { crates: Arena::default() }; | 59 | let mut sysroot = Sysroot { crates: Arena::default() }; |
60 | 60 | ||
61 | for name in SYSROOT_CRATES.trim().lines() { | 61 | for name in SYSROOT_CRATES.trim().lines() { |
@@ -89,7 +89,14 @@ impl Sysroot { | |||
89 | } | 89 | } |
90 | } | 90 | } |
91 | 91 | ||
92 | sysroot | 92 | if sysroot.by_name("core").is_none() { |
93 | anyhow::bail!( | ||
94 | "could not find libcore in sysroot path `{}`", | ||
95 | sysroot_src_dir.as_ref().display() | ||
96 | ); | ||
97 | } | ||
98 | |||
99 | Ok(sysroot) | ||
93 | } | 100 | } |
94 | 101 | ||
95 | fn by_name(&self, name: &str) -> Option<SysrootCrate> { | 102 | fn by_name(&self, name: &str) -> Option<SysrootCrate> { |
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index 20019b944..bab6f8a71 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs | |||
@@ -109,7 +109,7 @@ impl GlobalState { | |||
109 | ) | 109 | ) |
110 | } | 110 | } |
111 | LinkedProject::InlineJsonProject(it) => { | 111 | LinkedProject::InlineJsonProject(it) => { |
112 | Ok(project_model::ProjectWorkspace::Json { project: it.clone() }) | 112 | project_model::ProjectWorkspace::load_inline(it.clone()) |
113 | } | 113 | } |
114 | }) | 114 | }) |
115 | .collect::<Vec<_>>(); | 115 | .collect::<Vec<_>>(); |