diff options
Diffstat (limited to 'crates/project_model/src/workspace.rs')
-rw-r--r-- | crates/project_model/src/workspace.rs | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs index 559f4e7bf..c30861976 100644 --- a/crates/project_model/src/workspace.rs +++ b/crates/project_model/src/workspace.rs | |||
@@ -16,8 +16,13 @@ use proc_macro_api::ProcMacroClient; | |||
16 | use rustc_hash::{FxHashMap, FxHashSet}; | 16 | use rustc_hash::{FxHashMap, FxHashSet}; |
17 | 17 | ||
18 | use crate::{ | 18 | use crate::{ |
19 | cargo_workspace, cfg_flag::CfgFlag, rustc_cfg, sysroot::SysrootCrate, utf8_stdout, CargoConfig, | 19 | build_data::{BuildData, BuildDataMap, BuildDataResult}, |
20 | CargoWorkspace, ProjectJson, ProjectManifest, Sysroot, TargetKind, | 20 | cargo_workspace, |
21 | cfg_flag::CfgFlag, | ||
22 | rustc_cfg, | ||
23 | sysroot::SysrootCrate, | ||
24 | utf8_stdout, BuildDataCollector, CargoConfig, CargoWorkspace, ProjectJson, ProjectManifest, | ||
25 | Sysroot, TargetKind, | ||
21 | }; | 26 | }; |
22 | 27 | ||
23 | /// `PackageRoot` describes a package root folder. | 28 | /// `PackageRoot` describes a package root folder. |
@@ -153,7 +158,7 @@ impl ProjectWorkspace { | |||
153 | /// Returns the roots for the current `ProjectWorkspace` | 158 | /// Returns the roots for the current `ProjectWorkspace` |
154 | /// The return type contains the path and whether or not | 159 | /// The return type contains the path and whether or not |
155 | /// the root is a member of the current workspace | 160 | /// the root is a member of the current workspace |
156 | pub fn to_roots(&self) -> Vec<PackageRoot> { | 161 | pub fn to_roots(&self, build_data: Option<&BuildDataResult>) -> Vec<PackageRoot> { |
157 | match self { | 162 | match self { |
158 | ProjectWorkspace::Json { project, sysroot, rustc_cfg: _ } => project | 163 | ProjectWorkspace::Json { project, sysroot, rustc_cfg: _ } => project |
159 | .crates() | 164 | .crates() |
@@ -179,7 +184,12 @@ impl ProjectWorkspace { | |||
179 | let pkg_root = cargo[pkg].root().to_path_buf(); | 184 | let pkg_root = cargo[pkg].root().to_path_buf(); |
180 | 185 | ||
181 | let mut include = vec![pkg_root.clone()]; | 186 | let mut include = vec![pkg_root.clone()]; |
182 | include.extend(cargo[pkg].build_data.out_dir.clone()); | 187 | include.extend( |
188 | build_data | ||
189 | .and_then(|it| it.get(cargo.workspace_root())) | ||
190 | .and_then(|map| map.get(&cargo[pkg].id)) | ||
191 | .and_then(|it| it.out_dir.clone()), | ||
192 | ); | ||
183 | 193 | ||
184 | let mut exclude = vec![pkg_root.join(".git")]; | 194 | let mut exclude = vec![pkg_root.join(".git")]; |
185 | if is_member { | 195 | if is_member { |
@@ -219,6 +229,7 @@ impl ProjectWorkspace { | |||
219 | 229 | ||
220 | pub fn to_crate_graph( | 230 | pub fn to_crate_graph( |
221 | &self, | 231 | &self, |
232 | build_data: Option<&BuildDataResult>, | ||
222 | proc_macro_client: Option<&ProcMacroClient>, | 233 | proc_macro_client: Option<&ProcMacroClient>, |
223 | load: &mut dyn FnMut(&AbsPath) -> Option<FileId>, | 234 | load: &mut dyn FnMut(&AbsPath) -> Option<FileId>, |
224 | ) -> CrateGraph { | 235 | ) -> CrateGraph { |
@@ -241,8 +252,10 @@ impl ProjectWorkspace { | |||
241 | &proc_macro_loader, | 252 | &proc_macro_loader, |
242 | load, | 253 | load, |
243 | cargo, | 254 | cargo, |
255 | build_data.and_then(|it| it.get(cargo.workspace_root())), | ||
244 | sysroot, | 256 | sysroot, |
245 | rustc, | 257 | rustc, |
258 | rustc.as_ref().zip(build_data).and_then(|(it, map)| map.get(it.workspace_root())), | ||
246 | ), | 259 | ), |
247 | }; | 260 | }; |
248 | if crate_graph.patch_cfg_if() { | 261 | if crate_graph.patch_cfg_if() { |
@@ -252,6 +265,18 @@ impl ProjectWorkspace { | |||
252 | } | 265 | } |
253 | crate_graph | 266 | crate_graph |
254 | } | 267 | } |
268 | |||
269 | pub fn collect_build_data_configs(&self, collector: &mut BuildDataCollector) { | ||
270 | match self { | ||
271 | ProjectWorkspace::Cargo { cargo, rustc, .. } => { | ||
272 | collector.add_config(&cargo.workspace_root(), cargo.build_data_config().clone()); | ||
273 | if let Some(rustc) = rustc { | ||
274 | collector.add_config(rustc.workspace_root(), rustc.build_data_config().clone()); | ||
275 | } | ||
276 | } | ||
277 | _ => {} | ||
278 | } | ||
279 | } | ||
255 | } | 280 | } |
256 | 281 | ||
257 | fn project_json_to_crate_graph( | 282 | fn project_json_to_crate_graph( |
@@ -324,8 +349,10 @@ fn cargo_to_crate_graph( | |||
324 | proc_macro_loader: &dyn Fn(&Path) -> Vec<ProcMacro>, | 349 | proc_macro_loader: &dyn Fn(&Path) -> Vec<ProcMacro>, |
325 | load: &mut dyn FnMut(&AbsPath) -> Option<FileId>, | 350 | load: &mut dyn FnMut(&AbsPath) -> Option<FileId>, |
326 | cargo: &CargoWorkspace, | 351 | cargo: &CargoWorkspace, |
352 | build_data_map: Option<&BuildDataMap>, | ||
327 | sysroot: &Sysroot, | 353 | sysroot: &Sysroot, |
328 | rustc: &Option<CargoWorkspace>, | 354 | rustc: &Option<CargoWorkspace>, |
355 | rustc_build_data_map: Option<&BuildDataMap>, | ||
329 | ) -> CrateGraph { | 356 | ) -> CrateGraph { |
330 | let _p = profile::span("cargo_to_crate_graph"); | 357 | let _p = profile::span("cargo_to_crate_graph"); |
331 | let mut crate_graph = CrateGraph::default(); | 358 | let mut crate_graph = CrateGraph::default(); |
@@ -351,6 +378,7 @@ fn cargo_to_crate_graph( | |||
351 | let crate_id = add_target_crate_root( | 378 | let crate_id = add_target_crate_root( |
352 | &mut crate_graph, | 379 | &mut crate_graph, |
353 | &cargo[pkg], | 380 | &cargo[pkg], |
381 | build_data_map.and_then(|it| it.get(&cargo[pkg].id)), | ||
354 | &cfg_options, | 382 | &cfg_options, |
355 | proc_macro_loader, | 383 | proc_macro_loader, |
356 | file_id, | 384 | file_id, |
@@ -427,6 +455,7 @@ fn cargo_to_crate_graph( | |||
427 | let crate_id = add_target_crate_root( | 455 | let crate_id = add_target_crate_root( |
428 | &mut crate_graph, | 456 | &mut crate_graph, |
429 | &rustc_workspace[pkg], | 457 | &rustc_workspace[pkg], |
458 | rustc_build_data_map.and_then(|it| it.get(&rustc_workspace[pkg].id)), | ||
430 | &cfg_options, | 459 | &cfg_options, |
431 | proc_macro_loader, | 460 | proc_macro_loader, |
432 | file_id, | 461 | file_id, |
@@ -475,6 +504,7 @@ fn cargo_to_crate_graph( | |||
475 | fn add_target_crate_root( | 504 | fn add_target_crate_root( |
476 | crate_graph: &mut CrateGraph, | 505 | crate_graph: &mut CrateGraph, |
477 | pkg: &cargo_workspace::PackageData, | 506 | pkg: &cargo_workspace::PackageData, |
507 | build_data: Option<&BuildData>, | ||
478 | cfg_options: &CfgOptions, | 508 | cfg_options: &CfgOptions, |
479 | proc_macro_loader: &dyn Fn(&Path) -> Vec<ProcMacro>, | 509 | proc_macro_loader: &dyn Fn(&Path) -> Vec<ProcMacro>, |
480 | file_id: FileId, | 510 | file_id: FileId, |
@@ -485,19 +515,22 @@ fn add_target_crate_root( | |||
485 | for feature in pkg.active_features.iter() { | 515 | for feature in pkg.active_features.iter() { |
486 | opts.insert_key_value("feature".into(), feature.into()); | 516 | opts.insert_key_value("feature".into(), feature.into()); |
487 | } | 517 | } |
488 | opts.extend(pkg.build_data.cfgs.iter().cloned()); | 518 | if let Some(cfgs) = build_data.as_ref().map(|it| &it.cfgs) { |
519 | opts.extend(cfgs.iter().cloned()); | ||
520 | } | ||
489 | opts | 521 | opts |
490 | }; | 522 | }; |
491 | 523 | ||
492 | let mut env = Env::default(); | 524 | let mut env = Env::default(); |
493 | for (k, v) in &pkg.build_data.envs { | 525 | if let Some(envs) = build_data.map(|it| &it.envs) { |
494 | env.set(k, v.clone()); | 526 | for (k, v) in envs { |
527 | env.set(k, v.clone()); | ||
528 | } | ||
495 | } | 529 | } |
496 | 530 | ||
497 | let proc_macro = pkg | 531 | let proc_macro = build_data |
498 | .build_data | ||
499 | .proc_macro_dylib_path | ||
500 | .as_ref() | 532 | .as_ref() |
533 | .and_then(|it| it.proc_macro_dylib_path.as_ref()) | ||
501 | .map(|it| proc_macro_loader(&it)) | 534 | .map(|it| proc_macro_loader(&it)) |
502 | .unwrap_or_default(); | 535 | .unwrap_or_default(); |
503 | 536 | ||