Apply cfg.setTest to json projects

This commit is contained in:
David Richey 2025-02-12 13:16:38 -06:00
parent c661e5e14e
commit a297d438bc
5 changed files with 50 additions and 44 deletions

View File

@ -42,7 +42,6 @@ fn load_workspace_from_metadata(file: &str) -> ProjectWorkspace {
build_scripts: WorkspaceBuildScripts::default(), build_scripts: WorkspaceBuildScripts::default(),
rustc: Err(None), rustc: Err(None),
error: None, error: None,
set_test: true,
}, },
cfg_overrides: Default::default(), cfg_overrides: Default::default(),
sysroot: Sysroot::empty(), sysroot: Sysroot::empty(),
@ -50,6 +49,7 @@ fn load_workspace_from_metadata(file: &str) -> ProjectWorkspace {
toolchain: None, toolchain: None,
target_layout: Err("target_data_layout not loaded".into()), target_layout: Err("target_data_layout not loaded".into()),
extra_includes: Vec::new(), extra_includes: Vec::new(),
set_test: true,
} }
} }
@ -65,6 +65,7 @@ fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
target_layout: Err(Arc::from("test has no data layout")), target_layout: Err(Arc::from("test has no data layout")),
cfg_overrides: Default::default(), cfg_overrides: Default::default(),
extra_includes: Vec::new(), extra_includes: Vec::new(),
set_test: true,
}; };
to_crate_graph(project_workspace, &mut Default::default()) to_crate_graph(project_workspace, &mut Default::default())
} }
@ -285,7 +286,6 @@ fn smoke_test_real_sysroot_cargo() {
build_scripts: WorkspaceBuildScripts::default(), build_scripts: WorkspaceBuildScripts::default(),
rustc: Err(None), rustc: Err(None),
error: None, error: None,
set_test: true,
}, },
sysroot, sysroot,
rustc_cfg: Vec::new(), rustc_cfg: Vec::new(),
@ -293,6 +293,7 @@ fn smoke_test_real_sysroot_cargo() {
toolchain: None, toolchain: None,
target_layout: Err("target_data_layout not loaded".into()), target_layout: Err("target_data_layout not loaded".into()),
extra_includes: Vec::new(), extra_includes: Vec::new(),
set_test: true,
}; };
project_workspace.to_crate_graph( project_workspace.to_crate_graph(
&mut { &mut {

View File

@ -64,6 +64,8 @@ pub struct ProjectWorkspace {
pub cfg_overrides: CfgOverrides, pub cfg_overrides: CfgOverrides,
/// Additional includes to add for the VFS. /// Additional includes to add for the VFS.
pub extra_includes: Vec<AbsPathBuf>, pub extra_includes: Vec<AbsPathBuf>,
/// Set `cfg(test)` for local crates
pub set_test: bool,
} }
#[derive(Clone)] #[derive(Clone)]
@ -79,7 +81,6 @@ pub enum ProjectWorkspaceKind {
/// The rustc workspace loaded for this workspace. An `Err(None)` means loading has been /// The rustc workspace loaded for this workspace. An `Err(None)` means loading has been
/// disabled or was otherwise not requested. /// disabled or was otherwise not requested.
rustc: Result<Box<(CargoWorkspace, WorkspaceBuildScripts)>, Option<String>>, rustc: Result<Box<(CargoWorkspace, WorkspaceBuildScripts)>, Option<String>>,
set_test: bool,
}, },
/// Project workspace was specified using a `rust-project.json` file. /// Project workspace was specified using a `rust-project.json` file.
Json(ProjectJson), Json(ProjectJson),
@ -98,7 +99,6 @@ pub enum ProjectWorkspaceKind {
file: ManifestPath, file: ManifestPath,
/// Is this file a cargo script file? /// Is this file a cargo script file?
cargo: Option<(CargoWorkspace, WorkspaceBuildScripts, Option<Arc<anyhow::Error>>)>, cargo: Option<(CargoWorkspace, WorkspaceBuildScripts, Option<Arc<anyhow::Error>>)>,
set_test: bool,
}, },
} }
@ -113,9 +113,10 @@ impl fmt::Debug for ProjectWorkspace {
target_layout, target_layout,
cfg_overrides, cfg_overrides,
extra_includes, extra_includes,
set_test,
} = self; } = self;
match kind { match kind {
ProjectWorkspaceKind::Cargo { cargo, error: _, build_scripts, rustc, set_test } => f ProjectWorkspaceKind::Cargo { cargo, error: _, build_scripts, rustc } => f
.debug_struct("Cargo") .debug_struct("Cargo")
.field("root", &cargo.workspace_root().file_name()) .field("root", &cargo.workspace_root().file_name())
.field("n_packages", &cargo.packages().len()) .field("n_packages", &cargo.packages().len())
@ -141,11 +142,12 @@ impl fmt::Debug for ProjectWorkspace {
.field("toolchain", &toolchain) .field("toolchain", &toolchain)
.field("data_layout", &target_layout) .field("data_layout", &target_layout)
.field("n_cfg_overrides", &cfg_overrides.len()) .field("n_cfg_overrides", &cfg_overrides.len())
.field("n_extra_includes", &extra_includes.len()); .field("n_extra_includes", &extra_includes.len())
.field("set_test", set_test);
debug_struct.finish() debug_struct.finish()
} }
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, set_test } => f ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script } => f
.debug_struct("DetachedFiles") .debug_struct("DetachedFiles")
.field("file", &file) .field("file", &file)
.field("cargo_script", &cargo_script.is_some()) .field("cargo_script", &cargo_script.is_some())
@ -386,7 +388,6 @@ impl ProjectWorkspace {
build_scripts: WorkspaceBuildScripts::default(), build_scripts: WorkspaceBuildScripts::default(),
rustc, rustc,
error: error.map(Arc::new), error: error.map(Arc::new),
set_test: *set_test,
}, },
sysroot, sysroot,
rustc_cfg, rustc_cfg,
@ -394,6 +395,7 @@ impl ProjectWorkspace {
toolchain, toolchain,
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())), target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
extra_includes: extra_includes.clone(), extra_includes: extra_includes.clone(),
set_test: *set_test,
}) })
} }
@ -449,6 +451,7 @@ impl ProjectWorkspace {
target_layout: target_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())), target_layout: target_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
cfg_overrides: config.cfg_overrides.clone(), cfg_overrides: config.cfg_overrides.clone(),
extra_includes: config.extra_includes.clone(), extra_includes: config.extra_includes.clone(),
set_test: config.set_test,
} }
} }
@ -504,7 +507,6 @@ impl ProjectWorkspace {
kind: ProjectWorkspaceKind::DetachedFile { kind: ProjectWorkspaceKind::DetachedFile {
file: detached_file.to_owned(), file: detached_file.to_owned(),
cargo: cargo_script, cargo: cargo_script,
set_test: config.set_test,
}, },
sysroot, sysroot,
rustc_cfg, rustc_cfg,
@ -512,6 +514,7 @@ impl ProjectWorkspace {
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())), target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
cfg_overrides: config.cfg_overrides.clone(), cfg_overrides: config.cfg_overrides.clone(),
extra_includes: config.extra_includes.clone(), extra_includes: config.extra_includes.clone(),
set_test: config.set_test,
}) })
} }
@ -696,7 +699,7 @@ impl ProjectWorkspace {
.into_iter() .into_iter()
.chain(mk_sysroot()) .chain(mk_sysroot())
.collect::<Vec<_>>(), .collect::<Vec<_>>(),
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _, set_test: _ } => { ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => {
cargo cargo
.packages() .packages()
.map(|pkg| { .map(|pkg| {
@ -831,8 +834,9 @@ impl ProjectWorkspace {
sysroot, sysroot,
extra_env, extra_env,
cfg_overrides, cfg_overrides,
self.set_test,
), ),
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _, set_test } => { ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => {
cargo_to_crate_graph( cargo_to_crate_graph(
load, load,
rustc.as_ref().map(|a| a.as_ref()).ok(), rustc.as_ref().map(|a| a.as_ref()).ok(),
@ -841,10 +845,10 @@ impl ProjectWorkspace {
rustc_cfg.clone(), rustc_cfg.clone(),
cfg_overrides, cfg_overrides,
build_scripts, build_scripts,
*set_test, self.set_test,
) )
} }
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, set_test, .. } => { ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => {
if let Some((cargo, build_scripts, _)) = cargo_script { if let Some((cargo, build_scripts, _)) = cargo_script {
cargo_to_crate_graph( cargo_to_crate_graph(
&mut |path| load(path), &mut |path| load(path),
@ -854,7 +858,7 @@ impl ProjectWorkspace {
rustc_cfg.clone(), rustc_cfg.clone(),
cfg_overrides, cfg_overrides,
build_scripts, build_scripts,
*set_test, self.set_test,
) )
} else { } else {
detached_file_to_crate_graph( detached_file_to_crate_graph(
@ -863,7 +867,7 @@ impl ProjectWorkspace {
file, file,
sysroot, sysroot,
cfg_overrides, cfg_overrides,
*set_test, self.set_test,
) )
} }
} }
@ -885,34 +889,22 @@ impl ProjectWorkspace {
} = other; } = other;
(match (kind, o_kind) { (match (kind, o_kind) {
( (
ProjectWorkspaceKind::Cargo { ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts: _, error: _ },
cargo,
rustc,
build_scripts: _,
error: _,
set_test: _,
},
ProjectWorkspaceKind::Cargo { ProjectWorkspaceKind::Cargo {
cargo: o_cargo, cargo: o_cargo,
rustc: o_rustc, rustc: o_rustc,
build_scripts: _, build_scripts: _,
error: _, error: _,
set_test: _,
}, },
) => cargo == o_cargo && rustc == o_rustc, ) => cargo == o_cargo && rustc == o_rustc,
(ProjectWorkspaceKind::Json(project), ProjectWorkspaceKind::Json(o_project)) => { (ProjectWorkspaceKind::Json(project), ProjectWorkspaceKind::Json(o_project)) => {
project == o_project project == o_project
} }
( (
ProjectWorkspaceKind::DetachedFile { ProjectWorkspaceKind::DetachedFile { file, cargo: Some((cargo_script, _, _)) },
file,
cargo: Some((cargo_script, _, _)),
set_test: _,
},
ProjectWorkspaceKind::DetachedFile { ProjectWorkspaceKind::DetachedFile {
file: o_file, file: o_file,
cargo: Some((o_cargo_script, _, _)), cargo: Some((o_cargo_script, _, _)),
set_test: _,
}, },
) => file == o_file && cargo_script == o_cargo_script, ) => file == o_file && cargo_script == o_cargo_script,
_ => return false, _ => return false,
@ -940,13 +932,13 @@ fn project_json_to_crate_graph(
sysroot: &Sysroot, sysroot: &Sysroot,
extra_env: &FxHashMap<String, String>, extra_env: &FxHashMap<String, String>,
override_cfg: &CfgOverrides, override_cfg: &CfgOverrides,
set_test: bool,
) -> (CrateGraph, ProcMacroPaths) { ) -> (CrateGraph, ProcMacroPaths) {
let mut res = (CrateGraph::default(), ProcMacroPaths::default()); let mut res = (CrateGraph::default(), ProcMacroPaths::default());
let (crate_graph, proc_macros) = &mut res; let (crate_graph, proc_macros) = &mut res;
let (public_deps, libproc_macro) = let (public_deps, libproc_macro) =
sysroot_to_crate_graph(crate_graph, sysroot, rustc_cfg.clone(), load); sysroot_to_crate_graph(crate_graph, sysroot, rustc_cfg.clone(), load);
let r_a_cfg_flag = CfgAtom::Flag(sym::rust_analyzer.clone());
let mut cfg_cache: FxHashMap<&str, Vec<CfgAtom>> = FxHashMap::default(); let mut cfg_cache: FxHashMap<&str, Vec<CfgAtom>> = FxHashMap::default();
let idx_to_crate_id: FxHashMap<CrateArrayIdx, CrateId> = project let idx_to_crate_id: FxHashMap<CrateArrayIdx, CrateId> = project
@ -965,6 +957,7 @@ fn project_json_to_crate_graph(
proc_macro_dylib_path, proc_macro_dylib_path,
is_proc_macro, is_proc_macro,
repository, repository,
is_workspace_member,
.. ..
}, },
file_id, file_id,
@ -982,19 +975,28 @@ fn project_json_to_crate_graph(
None => &rustc_cfg, None => &rustc_cfg,
}; };
let mut cfg_options = target_cfgs let cfg_options = {
.iter() let mut cfg_options: CfgOptions =
.chain(cfg.iter()) target_cfgs.iter().chain(cfg.iter()).cloned().collect();
.chain(iter::once(&r_a_cfg_flag))
.cloned() if *is_workspace_member {
.collect(); if set_test {
override_cfg.apply( // Add test cfg for local crates
&mut cfg_options, cfg_options.insert_atom(sym::test.clone());
display_name }
.as_ref() cfg_options.insert_atom(sym::rust_analyzer.clone());
.map(|it| it.canonical_name().as_str()) }
.unwrap_or_default(),
); override_cfg.apply(
&mut cfg_options,
display_name
.as_ref()
.map(|it| it.canonical_name().as_str())
.unwrap_or_default(),
);
cfg_options
};
let crate_graph_crate_id = crate_graph.add_crate_root( let crate_graph_crate_id = crate_graph.add_crate_root(
file_id, file_id,
*edition, *edition,

View File

@ -420,6 +420,7 @@
"group1_other_cfg=other_config", "group1_other_cfg=other_config",
"group2_cfg=yet_another_config", "group2_cfg=yet_another_config",
"rust_analyzer", "rust_analyzer",
"test",
"true", "true",
], ],
), ),
@ -496,6 +497,7 @@
"group2_cfg=fourth_config", "group2_cfg=fourth_config",
"group2_cfg=yet_another_config", "group2_cfg=yet_another_config",
"rust_analyzer", "rust_analyzer",
"test",
"true", "true",
"unrelated_cfg", "unrelated_cfg",
], ],

View File

@ -417,6 +417,7 @@
cfg_options: CfgOptions( cfg_options: CfgOptions(
[ [
"rust_analyzer", "rust_analyzer",
"test",
"true", "true",
], ],
), ),

View File

@ -90,7 +90,6 @@ impl Tester {
kind: ProjectWorkspaceKind::DetachedFile { kind: ProjectWorkspaceKind::DetachedFile {
file: ManifestPath::try_from(tmp_file).unwrap(), file: ManifestPath::try_from(tmp_file).unwrap(),
cargo: None, cargo: None,
set_test: true,
}, },
sysroot, sysroot,
rustc_cfg: vec![], rustc_cfg: vec![],
@ -98,6 +97,7 @@ impl Tester {
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())), target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
cfg_overrides: Default::default(), cfg_overrides: Default::default(),
extra_includes: vec![], extra_includes: vec![],
set_test: true,
}; };
let load_cargo_config = LoadCargoConfig { let load_cargo_config = LoadCargoConfig {
load_out_dirs_from_check: false, load_out_dirs_from_check: false,