Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/project-model/src/workspace.rs')
| -rw-r--r-- | crates/project-model/src/workspace.rs | 86 |
1 files changed, 46 insertions, 40 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs index 632e7b7689..95148bb1d0 100644 --- a/crates/project-model/src/workspace.rs +++ b/crates/project-model/src/workspace.rs @@ -305,8 +305,12 @@ impl ProjectWorkspace { &|_| (), ) { Ok((meta, _error)) => { - let workspace = - CargoWorkspace::new(meta, cargo_toml.clone(), Env::default()); + let workspace = CargoWorkspace::new( + meta, + cargo_toml.clone(), + Env::default(), + false, + ); let build_scripts = WorkspaceBuildScripts::rustc_crates( &workspace, workspace_dir, @@ -321,8 +325,8 @@ impl ProjectWorkspace { "Failed to read Cargo metadata from rustc source at {rustc_dir}", ); Err(Some(format!( - "Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}" - ))) + "Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}" + ))) } } }) @@ -379,7 +383,7 @@ impl ProjectWorkspace { "Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}", ) })?; - let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_config_extra_env); + let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_config_extra_env, false); if let Some(loaded_sysroot) = loaded_sysroot { sysroot.set_workspace(loaded_sysroot); } @@ -515,7 +519,7 @@ impl ProjectWorkspace { let cargo_config_extra_env = cargo_config_env(detached_file, &config.extra_env, &sysroot); ( - CargoWorkspace::new(ws, detached_file.clone(), cargo_config_extra_env), + CargoWorkspace::new(ws, detached_file.clone(), cargo_config_extra_env, false), WorkspaceBuildScripts::default(), error.map(Arc::new), ) @@ -866,6 +870,7 @@ impl ProjectWorkspace { extra_env, cfg_overrides, self.set_test, + false, crate_ws_data, ), ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => { @@ -968,6 +973,7 @@ fn project_json_to_crate_graph( extra_env: &FxHashMap<String, String>, override_cfg: &CfgOverrides, set_test: bool, + is_sysroot: bool, crate_ws_data: Arc<CrateWorkspaceData>, ) -> (CrateGraphBuilder, ProcMacroPaths) { let mut res = (CrateGraphBuilder::default(), ProcMacroPaths::default()); @@ -1023,7 +1029,7 @@ fn project_json_to_crate_graph( target_cfgs.iter().chain(cfg.iter()).cloned().collect(); if *is_workspace_member { - if set_test { + if set_test && !is_sysroot { // Add test cfg for local crates cfg_options.insert_atom(sym::test.clone()); } @@ -1045,13 +1051,17 @@ fn project_json_to_crate_graph( *edition, display_name.clone(), version.clone(), - Arc::new(cfg_options), + cfg_options, None, env, if let Some(name) = display_name.clone() { - CrateOrigin::Local { - repo: repository.clone(), - name: Some(name.canonical_name().to_owned()), + if is_sysroot { + CrateOrigin::Lang(LangCrateOrigin::from(name.canonical_name().as_str())) + } else { + CrateOrigin::Local { + repo: repository.clone(), + name: Some(name.canonical_name().to_owned()), + } } } else { CrateOrigin::Local { repo: None, name: None } @@ -1119,7 +1129,6 @@ fn cargo_to_crate_graph( sysroot, rustc_cfg.clone(), load, - // FIXME: This looks incorrect but I don't think this causes problems. crate_ws_data.clone(), ); @@ -1139,7 +1148,7 @@ fn cargo_to_crate_graph( let mut cfg_options = cfg_options.clone(); if cargo[pkg].is_local { - if set_test { + if set_test && !cargo.is_sysroot() { // Add test cfg for local crates cfg_options.insert_atom(sym::test.clone()); } @@ -1152,7 +1161,9 @@ fn cargo_to_crate_graph( let mut lib_tgt = None; for &tgt in cargo[pkg].targets.iter() { - if !matches!(cargo[tgt].kind, TargetKind::Lib { .. }) && !cargo[pkg].is_member { + if !matches!(cargo[tgt].kind, TargetKind::Lib { .. }) + && (!cargo[pkg].is_member || cargo.is_sysroot()) + { // For non-workspace-members, Cargo does not resolve dev-dependencies, so we don't // add any targets except the library target, since those will not work correctly if // they use dev-dependencies. @@ -1177,9 +1188,13 @@ fn cargo_to_crate_graph( name, kind, if pkg_data.is_local { - CrateOrigin::Local { - repo: pkg_data.repository.clone(), - name: Some(Symbol::intern(&pkg_data.name)), + if cargo.is_sysroot() { + CrateOrigin::Lang(LangCrateOrigin::from(&*pkg_data.name)) + } else { + CrateOrigin::Local { + repo: pkg_data.repository.clone(), + name: Some(Symbol::intern(&pkg_data.name)), + } } } else { CrateOrigin::Library { @@ -1326,7 +1341,7 @@ fn detached_file_to_crate_graph( } cfg_options.insert_atom(sym::rust_analyzer.clone()); override_cfg.apply(&mut cfg_options, ""); - let cfg_options = Arc::new(cfg_options); + let cfg_options = cfg_options; let file_id = match load(detached_file) { Some(file_id) => file_id, @@ -1511,15 +1526,13 @@ fn add_target_crate_root( edition, Some(CrateDisplayName::from_canonical_name(cargo_name)), Some(pkg.version.to_string()), - Arc::new(cfg_options), + cfg_options, potential_cfg_options, env, origin, matches!(kind, TargetKind::Lib { is_proc_macro: true }), - Some(if pkg.is_member { - cargo.workspace_root().to_path_buf() - } else { - pkg.manifest.parent().to_path_buf() + matches!(kind, TargetKind::Lib { is_proc_macro: true }).then(|| { + if pkg.is_member { cargo.workspace_root() } else { pkg.manifest.parent() }.to_path_buf() }), crate_ws_data, ); @@ -1561,16 +1574,8 @@ fn extend_crate_graph_with_sysroot( ) -> (SysrootPublicDeps, Option<CrateBuilderId>) { let mut pub_deps = vec![]; let mut libproc_macro = None; - let diff = CfgDiff::new(vec![], vec![CfgAtom::Flag(sym::test.clone())]); - for (cid, c) in sysroot_crate_graph.iter_mut() { - // uninject `test` flag so `core` keeps working. - Arc::make_mut(&mut c.cfg_options).apply_diff(diff.clone()); - // patch the origin - if c.basic.origin.is_local() { - let lang_crate = LangCrateOrigin::from( - c.extra.display_name.as_ref().map_or("", |it| it.canonical_name().as_str()), - ); - c.basic.origin = CrateOrigin::Lang(lang_crate); + for cid in sysroot_crate_graph.iter() { + if let CrateOrigin::Lang(lang_crate) = sysroot_crate_graph[cid].basic.origin { match lang_crate { LangCrateOrigin::Test | LangCrateOrigin::Alloc @@ -1627,7 +1632,7 @@ fn sysroot_to_crate_graph( let _p = tracing::info_span!("sysroot_to_crate_graph").entered(); match sysroot.workspace() { RustLibSrcWorkspace::Workspace(cargo) => { - let (cg, pm) = cargo_to_crate_graph( + let (sysroot_cg, sysroot_pm) = cargo_to_crate_graph( load, None, cargo, @@ -1639,7 +1644,7 @@ fn sysroot_to_crate_graph( CfgAtom::Flag(sym::debug_assertions.clone()), CfgAtom::Flag(sym::miri.clone()), ], - vec![], + vec![CfgAtom::Flag(sym::test.clone())], ), ..Default::default() }, @@ -1648,10 +1653,10 @@ fn sysroot_to_crate_graph( crate_ws_data, ); - extend_crate_graph_with_sysroot(crate_graph, cg, pm) + extend_crate_graph_with_sysroot(crate_graph, sysroot_cg, sysroot_pm) } RustLibSrcWorkspace::Json(project_json) => { - let (cg, pm) = project_json_to_crate_graph( + let (sysroot_cg, sysroot_pm) = project_json_to_crate_graph( rustc_cfg, load, project_json, @@ -1668,19 +1673,20 @@ fn sysroot_to_crate_graph( ..Default::default() }, false, + true, crate_ws_data, ); - extend_crate_graph_with_sysroot(crate_graph, cg, pm) + extend_crate_graph_with_sysroot(crate_graph, sysroot_cg, sysroot_pm) } RustLibSrcWorkspace::Stitched(stitched) => { - let cfg_options = Arc::new({ + let cfg_options = { let mut cfg_options = CfgOptions::default(); cfg_options.extend(rustc_cfg); cfg_options.insert_atom(sym::debug_assertions.clone()); cfg_options.insert_atom(sym::miri.clone()); cfg_options - }); + }; let sysroot_crates: FxHashMap< crate::sysroot::stitched::RustLibSrcCrate, CrateBuilderId, |