diff options
Diffstat (limited to 'crates/ra_project_model')
-rw-r--r-- | crates/ra_project_model/src/lib.rs | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs index 7ad941279..fe03b509e 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs | |||
@@ -250,7 +250,7 @@ impl ProjectWorkspace { | |||
250 | 250 | ||
251 | pub fn to_crate_graph( | 251 | pub fn to_crate_graph( |
252 | &self, | 252 | &self, |
253 | default_cfg_options: &CfgOptions, | 253 | target: Option<&str>, |
254 | extern_source_roots: &FxHashMap<PathBuf, ExternSourceId>, | 254 | extern_source_roots: &FxHashMap<PathBuf, ExternSourceId>, |
255 | proc_macro_client: &ProcMacroClient, | 255 | proc_macro_client: &ProcMacroClient, |
256 | load: &mut dyn FnMut(&Path) -> Option<FileId>, | 256 | load: &mut dyn FnMut(&Path) -> Option<FileId>, |
@@ -269,7 +269,7 @@ impl ProjectWorkspace { | |||
269 | json_project::Edition::Edition2018 => Edition::Edition2018, | 269 | json_project::Edition::Edition2018 => Edition::Edition2018, |
270 | }; | 270 | }; |
271 | let cfg_options = { | 271 | let cfg_options = { |
272 | let mut opts = default_cfg_options.clone(); | 272 | let mut opts = CfgOptions::default(); |
273 | for cfg in &krate.cfg { | 273 | for cfg in &krate.cfg { |
274 | match cfg.find('=') { | 274 | match cfg.find('=') { |
275 | None => opts.insert_atom(cfg.into()), | 275 | None => opts.insert_atom(cfg.into()), |
@@ -343,18 +343,13 @@ impl ProjectWorkspace { | |||
343 | } | 343 | } |
344 | } | 344 | } |
345 | ProjectWorkspace::Cargo { cargo, sysroot } => { | 345 | ProjectWorkspace::Cargo { cargo, sysroot } => { |
346 | let mut cfg_options = get_rustc_cfg_options(target); | ||
347 | |||
346 | let sysroot_crates: FxHashMap<_, _> = sysroot | 348 | let sysroot_crates: FxHashMap<_, _> = sysroot |
347 | .crates() | 349 | .crates() |
348 | .filter_map(|krate| { | 350 | .filter_map(|krate| { |
349 | let file_id = load(&sysroot[krate].root)?; | 351 | let file_id = load(&sysroot[krate].root)?; |
350 | 352 | ||
351 | // Crates from sysroot have `cfg(test)` disabled | ||
352 | let cfg_options = { | ||
353 | let mut opts = default_cfg_options.clone(); | ||
354 | opts.remove_atom("test"); | ||
355 | opts | ||
356 | }; | ||
357 | |||
358 | let env = Env::default(); | 353 | let env = Env::default(); |
359 | let extern_source = ExternSource::default(); | 354 | let extern_source = ExternSource::default(); |
360 | let proc_macro = vec![]; | 355 | let proc_macro = vec![]; |
@@ -365,7 +360,7 @@ impl ProjectWorkspace { | |||
365 | file_id, | 360 | file_id, |
366 | Edition::Edition2018, | 361 | Edition::Edition2018, |
367 | Some(crate_name), | 362 | Some(crate_name), |
368 | cfg_options, | 363 | cfg_options.clone(), |
369 | env, | 364 | env, |
370 | extern_source, | 365 | extern_source, |
371 | proc_macro, | 366 | proc_macro, |
@@ -396,6 +391,10 @@ impl ProjectWorkspace { | |||
396 | 391 | ||
397 | let mut pkg_to_lib_crate = FxHashMap::default(); | 392 | let mut pkg_to_lib_crate = FxHashMap::default(); |
398 | let mut pkg_crates = FxHashMap::default(); | 393 | let mut pkg_crates = FxHashMap::default(); |
394 | |||
395 | // Add test cfg for non-sysroot crates | ||
396 | cfg_options.insert_atom("test".into()); | ||
397 | |||
399 | // Next, create crates for each package, target pair | 398 | // Next, create crates for each package, target pair |
400 | for pkg in cargo.packages() { | 399 | for pkg in cargo.packages() { |
401 | let mut lib_tgt = None; | 400 | let mut lib_tgt = None; |
@@ -404,7 +403,7 @@ impl ProjectWorkspace { | |||
404 | if let Some(file_id) = load(root) { | 403 | if let Some(file_id) = load(root) { |
405 | let edition = cargo[pkg].edition; | 404 | let edition = cargo[pkg].edition; |
406 | let cfg_options = { | 405 | let cfg_options = { |
407 | let mut opts = default_cfg_options.clone(); | 406 | let mut opts = cfg_options.clone(); |
408 | for feature in cargo[pkg].features.iter() { | 407 | for feature in cargo[pkg].features.iter() { |
409 | opts.insert_key_value("feature".into(), feature.into()); | 408 | opts.insert_key_value("feature".into(), feature.into()); |
410 | } | 409 | } |
@@ -561,7 +560,7 @@ impl ProjectWorkspace { | |||
561 | } | 560 | } |
562 | } | 561 | } |
563 | 562 | ||
564 | pub fn get_rustc_cfg_options(target: Option<&String>) -> CfgOptions { | 563 | fn get_rustc_cfg_options(target: Option<&str>) -> CfgOptions { |
565 | let mut cfg_options = CfgOptions::default(); | 564 | let mut cfg_options = CfgOptions::default(); |
566 | 565 | ||
567 | // Some nightly-only cfgs, which are required for stdlib | 566 | // Some nightly-only cfgs, which are required for stdlib |
@@ -579,7 +578,7 @@ pub fn get_rustc_cfg_options(target: Option<&String>) -> CfgOptions { | |||
579 | let mut cmd = Command::new(ra_toolchain::rustc()); | 578 | let mut cmd = Command::new(ra_toolchain::rustc()); |
580 | cmd.args(&["--print", "cfg", "-O"]); | 579 | cmd.args(&["--print", "cfg", "-O"]); |
581 | if let Some(target) = target { | 580 | if let Some(target) = target { |
582 | cmd.args(&["--target", target.as_str()]); | 581 | cmd.args(&["--target", target]); |
583 | } | 582 | } |
584 | let output = output(cmd)?; | 583 | let output = output(cmd)?; |
585 | Ok(String::from_utf8(output.stdout)?) | 584 | Ok(String::from_utf8(output.stdout)?) |
@@ -601,6 +600,8 @@ pub fn get_rustc_cfg_options(target: Option<&String>) -> CfgOptions { | |||
601 | Err(e) => log::error!("failed to get rustc cfgs: {:#}", e), | 600 | Err(e) => log::error!("failed to get rustc cfgs: {:#}", e), |
602 | } | 601 | } |
603 | 602 | ||
603 | cfg_options.insert_atom("debug_assertion".into()); | ||
604 | |||
604 | cfg_options | 605 | cfg_options |
605 | } | 606 | } |
606 | 607 | ||