Skip to content

Commit c63ef62

Browse files
authored
Merge pull request #19150 from darichey/set-test-json-project
Apply cfg.setTest to json projects
2 parents c661e5e + a297d43 commit c63ef62

File tree

5 files changed

+50
-44
lines changed

5 files changed

+50
-44
lines changed

crates/project-model/src/tests.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ fn load_workspace_from_metadata(file: &str) -> ProjectWorkspace {
4242
build_scripts: WorkspaceBuildScripts::default(),
4343
rustc: Err(None),
4444
error: None,
45-
set_test: true,
4645
},
4746
cfg_overrides: Default::default(),
4847
sysroot: Sysroot::empty(),
4948
rustc_cfg: Vec::new(),
5049
toolchain: None,
5150
target_layout: Err("target_data_layout not loaded".into()),
5251
extra_includes: Vec::new(),
52+
set_test: true,
5353
}
5454
}
5555

@@ -65,6 +65,7 @@ fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
6565
target_layout: Err(Arc::from("test has no data layout")),
6666
cfg_overrides: Default::default(),
6767
extra_includes: Vec::new(),
68+
set_test: true,
6869
};
6970
to_crate_graph(project_workspace, &mut Default::default())
7071
}
@@ -285,14 +286,14 @@ fn smoke_test_real_sysroot_cargo() {
285286
build_scripts: WorkspaceBuildScripts::default(),
286287
rustc: Err(None),
287288
error: None,
288-
set_test: true,
289289
},
290290
sysroot,
291291
rustc_cfg: Vec::new(),
292292
cfg_overrides: Default::default(),
293293
toolchain: None,
294294
target_layout: Err("target_data_layout not loaded".into()),
295295
extra_includes: Vec::new(),
296+
set_test: true,
296297
};
297298
project_workspace.to_crate_graph(
298299
&mut {

crates/project-model/src/workspace.rs

+43-41
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ pub struct ProjectWorkspace {
6464
pub cfg_overrides: CfgOverrides,
6565
/// Additional includes to add for the VFS.
6666
pub extra_includes: Vec<AbsPathBuf>,
67+
/// Set `cfg(test)` for local crates
68+
pub set_test: bool,
6769
}
6870

6971
#[derive(Clone)]
@@ -79,7 +81,6 @@ pub enum ProjectWorkspaceKind {
7981
/// The rustc workspace loaded for this workspace. An `Err(None)` means loading has been
8082
/// disabled or was otherwise not requested.
8183
rustc: Result<Box<(CargoWorkspace, WorkspaceBuildScripts)>, Option<String>>,
82-
set_test: bool,
8384
},
8485
/// Project workspace was specified using a `rust-project.json` file.
8586
Json(ProjectJson),
@@ -98,7 +99,6 @@ pub enum ProjectWorkspaceKind {
9899
file: ManifestPath,
99100
/// Is this file a cargo script file?
100101
cargo: Option<(CargoWorkspace, WorkspaceBuildScripts, Option<Arc<anyhow::Error>>)>,
101-
set_test: bool,
102102
},
103103
}
104104

@@ -113,9 +113,10 @@ impl fmt::Debug for ProjectWorkspace {
113113
target_layout,
114114
cfg_overrides,
115115
extra_includes,
116+
set_test,
116117
} = self;
117118
match kind {
118-
ProjectWorkspaceKind::Cargo { cargo, error: _, build_scripts, rustc, set_test } => f
119+
ProjectWorkspaceKind::Cargo { cargo, error: _, build_scripts, rustc } => f
119120
.debug_struct("Cargo")
120121
.field("root", &cargo.workspace_root().file_name())
121122
.field("n_packages", &cargo.packages().len())
@@ -141,11 +142,12 @@ impl fmt::Debug for ProjectWorkspace {
141142
.field("toolchain", &toolchain)
142143
.field("data_layout", &target_layout)
143144
.field("n_cfg_overrides", &cfg_overrides.len())
144-
.field("n_extra_includes", &extra_includes.len());
145+
.field("n_extra_includes", &extra_includes.len())
146+
.field("set_test", set_test);
145147

146148
debug_struct.finish()
147149
}
148-
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, set_test } => f
150+
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script } => f
149151
.debug_struct("DetachedFiles")
150152
.field("file", &file)
151153
.field("cargo_script", &cargo_script.is_some())
@@ -386,14 +388,14 @@ impl ProjectWorkspace {
386388
build_scripts: WorkspaceBuildScripts::default(),
387389
rustc,
388390
error: error.map(Arc::new),
389-
set_test: *set_test,
390391
},
391392
sysroot,
392393
rustc_cfg,
393394
cfg_overrides: cfg_overrides.clone(),
394395
toolchain,
395396
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
396397
extra_includes: extra_includes.clone(),
398+
set_test: *set_test,
397399
})
398400
}
399401

@@ -449,6 +451,7 @@ impl ProjectWorkspace {
449451
target_layout: target_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
450452
cfg_overrides: config.cfg_overrides.clone(),
451453
extra_includes: config.extra_includes.clone(),
454+
set_test: config.set_test,
452455
}
453456
}
454457

@@ -504,14 +507,14 @@ impl ProjectWorkspace {
504507
kind: ProjectWorkspaceKind::DetachedFile {
505508
file: detached_file.to_owned(),
506509
cargo: cargo_script,
507-
set_test: config.set_test,
508510
},
509511
sysroot,
510512
rustc_cfg,
511513
toolchain,
512514
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
513515
cfg_overrides: config.cfg_overrides.clone(),
514516
extra_includes: config.extra_includes.clone(),
517+
set_test: config.set_test,
515518
})
516519
}
517520

@@ -696,7 +699,7 @@ impl ProjectWorkspace {
696699
.into_iter()
697700
.chain(mk_sysroot())
698701
.collect::<Vec<_>>(),
699-
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _, set_test: _ } => {
702+
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => {
700703
cargo
701704
.packages()
702705
.map(|pkg| {
@@ -831,8 +834,9 @@ impl ProjectWorkspace {
831834
sysroot,
832835
extra_env,
833836
cfg_overrides,
837+
self.set_test,
834838
),
835-
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _, set_test } => {
839+
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts, error: _ } => {
836840
cargo_to_crate_graph(
837841
load,
838842
rustc.as_ref().map(|a| a.as_ref()).ok(),
@@ -841,10 +845,10 @@ impl ProjectWorkspace {
841845
rustc_cfg.clone(),
842846
cfg_overrides,
843847
build_scripts,
844-
*set_test,
848+
self.set_test,
845849
)
846850
}
847-
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, set_test, .. } => {
851+
ProjectWorkspaceKind::DetachedFile { file, cargo: cargo_script, .. } => {
848852
if let Some((cargo, build_scripts, _)) = cargo_script {
849853
cargo_to_crate_graph(
850854
&mut |path| load(path),
@@ -854,7 +858,7 @@ impl ProjectWorkspace {
854858
rustc_cfg.clone(),
855859
cfg_overrides,
856860
build_scripts,
857-
*set_test,
861+
self.set_test,
858862
)
859863
} else {
860864
detached_file_to_crate_graph(
@@ -863,7 +867,7 @@ impl ProjectWorkspace {
863867
file,
864868
sysroot,
865869
cfg_overrides,
866-
*set_test,
870+
self.set_test,
867871
)
868872
}
869873
}
@@ -885,34 +889,22 @@ impl ProjectWorkspace {
885889
} = other;
886890
(match (kind, o_kind) {
887891
(
888-
ProjectWorkspaceKind::Cargo {
889-
cargo,
890-
rustc,
891-
build_scripts: _,
892-
error: _,
893-
set_test: _,
894-
},
892+
ProjectWorkspaceKind::Cargo { cargo, rustc, build_scripts: _, error: _ },
895893
ProjectWorkspaceKind::Cargo {
896894
cargo: o_cargo,
897895
rustc: o_rustc,
898896
build_scripts: _,
899897
error: _,
900-
set_test: _,
901898
},
902899
) => cargo == o_cargo && rustc == o_rustc,
903900
(ProjectWorkspaceKind::Json(project), ProjectWorkspaceKind::Json(o_project)) => {
904901
project == o_project
905902
}
906903
(
907-
ProjectWorkspaceKind::DetachedFile {
908-
file,
909-
cargo: Some((cargo_script, _, _)),
910-
set_test: _,
911-
},
904+
ProjectWorkspaceKind::DetachedFile { file, cargo: Some((cargo_script, _, _)) },
912905
ProjectWorkspaceKind::DetachedFile {
913906
file: o_file,
914907
cargo: Some((o_cargo_script, _, _)),
915-
set_test: _,
916908
},
917909
) => file == o_file && cargo_script == o_cargo_script,
918910
_ => return false,
@@ -940,13 +932,13 @@ fn project_json_to_crate_graph(
940932
sysroot: &Sysroot,
941933
extra_env: &FxHashMap<String, String>,
942934
override_cfg: &CfgOverrides,
935+
set_test: bool,
943936
) -> (CrateGraph, ProcMacroPaths) {
944937
let mut res = (CrateGraph::default(), ProcMacroPaths::default());
945938
let (crate_graph, proc_macros) = &mut res;
946939
let (public_deps, libproc_macro) =
947940
sysroot_to_crate_graph(crate_graph, sysroot, rustc_cfg.clone(), load);
948941

949-
let r_a_cfg_flag = CfgAtom::Flag(sym::rust_analyzer.clone());
950942
let mut cfg_cache: FxHashMap<&str, Vec<CfgAtom>> = FxHashMap::default();
951943

952944
let idx_to_crate_id: FxHashMap<CrateArrayIdx, CrateId> = project
@@ -965,6 +957,7 @@ fn project_json_to_crate_graph(
965957
proc_macro_dylib_path,
966958
is_proc_macro,
967959
repository,
960+
is_workspace_member,
968961
..
969962
},
970963
file_id,
@@ -982,19 +975,28 @@ fn project_json_to_crate_graph(
982975
None => &rustc_cfg,
983976
};
984977

985-
let mut cfg_options = target_cfgs
986-
.iter()
987-
.chain(cfg.iter())
988-
.chain(iter::once(&r_a_cfg_flag))
989-
.cloned()
990-
.collect();
991-
override_cfg.apply(
992-
&mut cfg_options,
993-
display_name
994-
.as_ref()
995-
.map(|it| it.canonical_name().as_str())
996-
.unwrap_or_default(),
997-
);
978+
let cfg_options = {
979+
let mut cfg_options: CfgOptions =
980+
target_cfgs.iter().chain(cfg.iter()).cloned().collect();
981+
982+
if *is_workspace_member {
983+
if set_test {
984+
// Add test cfg for local crates
985+
cfg_options.insert_atom(sym::test.clone());
986+
}
987+
cfg_options.insert_atom(sym::rust_analyzer.clone());
988+
}
989+
990+
override_cfg.apply(
991+
&mut cfg_options,
992+
display_name
993+
.as_ref()
994+
.map(|it| it.canonical_name().as_str())
995+
.unwrap_or_default(),
996+
);
997+
cfg_options
998+
};
999+
9981000
let crate_graph_crate_id = crate_graph.add_crate_root(
9991001
file_id,
10001002
*edition,

crates/project-model/test_data/output/rust_project_cfg_groups.txt

+2
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@
420420
"group1_other_cfg=other_config",
421421
"group2_cfg=yet_another_config",
422422
"rust_analyzer",
423+
"test",
423424
"true",
424425
],
425426
),
@@ -496,6 +497,7 @@
496497
"group2_cfg=fourth_config",
497498
"group2_cfg=yet_another_config",
498499
"rust_analyzer",
500+
"test",
499501
"true",
500502
"unrelated_cfg",
501503
],

crates/project-model/test_data/output/rust_project_hello_world_project_model.txt

+1
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@
417417
cfg_options: CfgOptions(
418418
[
419419
"rust_analyzer",
420+
"test",
420421
"true",
421422
],
422423
),

crates/rust-analyzer/src/cli/rustc_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,14 @@ impl Tester {
9090
kind: ProjectWorkspaceKind::DetachedFile {
9191
file: ManifestPath::try_from(tmp_file).unwrap(),
9292
cargo: None,
93-
set_test: true,
9493
},
9594
sysroot,
9695
rustc_cfg: vec![],
9796
toolchain: None,
9897
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
9998
cfg_overrides: Default::default(),
10099
extra_includes: vec![],
100+
set_test: true,
101101
};
102102
let load_cargo_config = LoadCargoConfig {
103103
load_out_dirs_from_check: false,

0 commit comments

Comments
 (0)