Skip to content

Commit 1ca85ac

Browse files
committed
Auto merge of #18085 - ChayimFriedman2:gate-test, r=Veykril
feat: Provide an config option to not set `cfg(test)` Fixes#17957.
2 parents e50339a + 91834ec commit 1ca85ac

18 files changed

Lines changed: 109 additions & 18 deletions

File tree

‎src/tools/rust-analyzer/crates/cfg/src/lib.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ impl CfgOptions {
4949
cfg.fold(&|atom| self.enabled.contains(atom))
5050
}
5151

52+
pubfncheck_atom(&self,cfg:&CfgAtom) -> bool{
53+
self.enabled.contains(cfg)
54+
}
55+
5256
pubfninsert_atom(&mutself,key:Symbol){
5357
self.enabled.insert(CfgAtom::Flag(key));
5458
}

‎src/tools/rust-analyzer/crates/hir-def/src/nameres/collector.rs‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use std::{cmp::Ordering, iter, mem, ops::Not};
77

88
use base_db::{CrateId,CrateOrigin,Dependency,LangCrateOrigin};
9-
use cfg::{CfgExpr,CfgOptions};
9+
use cfg::{CfgAtom,CfgExpr,CfgOptions};
1010
use either::Either;
1111
use hir_expand::{
1212
attrs::{Attr,AttrId},
@@ -1324,13 +1324,21 @@ impl DefCollector<'_> {
13241324
};
13251325

13261326
// Skip #[test]/#[bench] expansion, which would merely result in more memory usage
1327-
// due to duplicating functions into macro expansions
1327+
// due to duplicating functions into macro expansions, but only if `cfg(test)` is active,
1328+
// otherwise they are expanded to nothing and this can impact e.g. diagnostics (due to things
1329+
// being cfg'ed out).
1330+
// Ideally we will just expand them to nothing here. But we are only collecting macro calls,
1331+
// not expanding them, so we have no way to do that.
13281332
ifmatches!(
13291333
def.kind,
13301334
MacroDefKind::BuiltInAttr(_, expander)
13311335
if expander.is_test() || expander.is_bench()
13321336
){
1333-
returnrecollect_without(self);
1337+
let test_is_active =
1338+
self.cfg_options.check_atom(&CfgAtom::Flag(sym::test.clone()));
1339+
if test_is_active {
1340+
returnrecollect_without(self);
1341+
}
13341342
}
13351343

13361344
let call_id = || {

‎src/tools/rust-analyzer/crates/hir-expand/src/builtin/attr_macro.rs‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use span::{MacroCallId, Span};
44

55
usecrate::{db::ExpandDatabase, name, tt,ExpandResult,MacroCallKind};
66

7+
usesuper::quote;
8+
79
macro_rules! register_builtin {
810
($(($name:ident, $variant:ident) => $expand:ident),*) => {
911
#[derive(Debug,Clone,Copy,PartialEq,Eq,Hash)]
@@ -52,15 +54,15 @@ impl BuiltinAttrExpander {
5254
}
5355

5456
register_builtin!{
55-
(bench,Bench) => dummy_attr_expand,
57+
(bench,Bench) => dummy_gate_test_expand,
5658
(cfg_accessible,CfgAccessible) => dummy_attr_expand,
5759
(cfg_eval,CfgEval) => dummy_attr_expand,
5860
(derive,Derive) => derive_expand,
5961
// derive const is equivalent to derive for our proposes.
6062
(derive_const,DeriveConst) => derive_expand,
6163
(global_allocator,GlobalAllocator) => dummy_attr_expand,
62-
(test,Test) => dummy_attr_expand,
63-
(test_case,TestCase) => dummy_attr_expand
64+
(test,Test) => dummy_gate_test_expand,
65+
(test_case,TestCase) => dummy_gate_test_expand
6466
}
6567

6668
pubfnfind_builtin_attr(ident:&name::Name) -> Option<BuiltinAttrExpander>{
@@ -76,6 +78,19 @@ fn dummy_attr_expand(
7678
ExpandResult::ok(tt.clone())
7779
}
7880

81+
fndummy_gate_test_expand(
82+
_db:&dynExpandDatabase,
83+
_id:MacroCallId,
84+
tt:&tt::Subtree,
85+
span:Span,
86+
) -> ExpandResult<tt::Subtree>{
87+
let result = quote::quote! { span=>
88+
#[cfg(test)]
89+
#tt
90+
};
91+
ExpandResult::ok(result)
92+
}
93+
7994
/// We generate a very specific expansion here, as we do not actually expand the `#[derive]` attribute
8095
/// itself in name res, but we do want to expand it to something for the IDE layer, so that the input
8196
/// derive attributes can be downmapped, and resolved as proper paths.

‎src/tools/rust-analyzer/crates/load-cargo/src/lib.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ mod tests {
526526
#[test]
527527
fntest_loading_rust_analyzer(){
528528
let path = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap().parent().unwrap();
529-
let cargo_config = CargoConfig::default();
529+
let cargo_config = CargoConfig{set_test:true, ..CargoConfig::default()};
530530
let load_cargo_config = LoadCargoConfig{
531531
load_out_dirs_from_check:false,
532532
with_proc_macro_server:ProcMacroServerChoice::None,

‎src/tools/rust-analyzer/crates/project-model/src/cargo_workspace.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ pub struct CargoConfig {
100100
pubinvocation_strategy:InvocationStrategy,
101101
/// Optional path to use instead of `target` when building
102102
pubtarget_dir:Option<Utf8PathBuf>,
103+
pubset_test:bool,
103104
}
104105

105106
pubtypePackage = Idx<PackageData>;

‎src/tools/rust-analyzer/crates/project-model/src/tests.rs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ fn load_cargo_with_overrides(
3535
rustc:Err(None),
3636
cargo_config_extra_env:Default::default(),
3737
error:None,
38+
set_test:true,
3839
},
3940
cfg_overrides,
4041
sysroot:Sysroot::empty(),
@@ -242,6 +243,7 @@ fn smoke_test_real_sysroot_cargo() {
242243
rustc:Err(None),
243244
cargo_config_extra_env:Default::default(),
244245
error:None,
246+
set_test:true,
245247
},
246248
sysroot,
247249
rustc_cfg:Vec::new(),

‎src/tools/rust-analyzer/crates/project-model/src/workspace.rs‎

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ pub enum ProjectWorkspaceKind {
7878
rustc:Result<Box<(CargoWorkspace,WorkspaceBuildScripts)>,Option<String>>,
7979
/// Environment variables set in the `.cargo/config` file.
8080
cargo_config_extra_env:FxHashMap<String,String>,
81+
set_test:bool,
8182
},
8283
/// Project workspace was specified using a `rust-project.json` file.
8384
Json(ProjectJson),
@@ -98,6 +99,7 @@ pub enum ProjectWorkspaceKind {
9899
cargo:Option<(CargoWorkspace,WorkspaceBuildScripts,Option<Arc<anyhow::Error>>)>,
99100
/// Environment variables set in the `.cargo/config` file.
100101
cargo_config_extra_env:FxHashMap<String,String>,
102+
set_test:bool,
101103
},
102104
}
103105

@@ -112,6 +114,7 @@ impl fmt::Debug for ProjectWorkspace {
112114
build_scripts,
113115
rustc,
114116
cargo_config_extra_env,
117+
set_test,
115118
} => f
116119
.debug_struct("Cargo")
117120
.field("root",&cargo.workspace_root().file_name())
@@ -126,6 +129,7 @@ impl fmt::Debug for ProjectWorkspace {
126129
.field("toolchain",&toolchain)
127130
.field("data_layout",&target_layout)
128131
.field("cargo_config_extra_env",&cargo_config_extra_env)
132+
.field("set_test", set_test)
129133
.field("build_scripts",&build_scripts.error().unwrap_or("ok"))
130134
.finish(),
131135
ProjectWorkspaceKind::Json(project) => {
@@ -137,12 +141,14 @@ impl fmt::Debug for ProjectWorkspace {
137141
.field("toolchain",&toolchain)
138142
.field("data_layout",&target_layout)
139143
.field("n_cfg_overrides",&cfg_overrides.len());
144+
140145
debug_struct.finish()
141146
}
142147
ProjectWorkspaceKind::DetachedFile{
143148
file,
144149
cargo: cargo_script,
145150
cargo_config_extra_env,
151+
set_test,
146152
} => f
147153
.debug_struct("DetachedFiles")
148154
.field("file",&file)
@@ -154,6 +160,7 @@ impl fmt::Debug for ProjectWorkspace {
154160
.field("data_layout",&target_layout)
155161
.field("n_cfg_overrides",&cfg_overrides.len())
156162
.field("cargo_config_extra_env",&cargo_config_extra_env)
163+
.field("set_test", set_test)
157164
.finish(),
158165
}
159166
}
@@ -329,6 +336,7 @@ impl ProjectWorkspace {
329336
rustc,
330337
cargo_config_extra_env,
331338
error: error.map(Arc::new),
339+
set_test: config.set_test,
332340
},
333341
sysroot,
334342
rustc_cfg,
@@ -423,6 +431,7 @@ impl ProjectWorkspace {
423431
file: detached_file.to_owned(),
424432
cargo: cargo_script,
425433
cargo_config_extra_env,
434+
set_test: config.set_test,
426435
},
427436
sysroot,
428437
rustc_cfg,
@@ -609,6 +618,7 @@ impl ProjectWorkspace {
609618
build_scripts,
610619
cargo_config_extra_env: _,
611620
error: _,
621+
set_test: _,
612622
} => {
613623
cargo
614624
.packages()
@@ -750,6 +760,7 @@ impl ProjectWorkspace {
750760
build_scripts,
751761
cargo_config_extra_env: _,
752762
error: _,
763+
set_test,
753764
} => (
754765
cargo_to_crate_graph(
755766
load,
@@ -759,10 +770,11 @@ impl ProjectWorkspace {
759770
rustc_cfg.clone(),
760771
cfg_overrides,
761772
build_scripts,
773+
*set_test,
762774
),
763775
sysroot,
764776
),
765-
ProjectWorkspaceKind::DetachedFile{ file,cargo: cargo_script, .. } => (
777+
ProjectWorkspaceKind::DetachedFile{ file,cargo: cargo_script,set_test,.. } => (
766778
ifletSome((cargo, build_scripts, _)) = cargo_script {
767779
cargo_to_crate_graph(
768780
&mut |path| load(path),
@@ -772,6 +784,7 @@ impl ProjectWorkspace {
772784
rustc_cfg.clone(),
773785
cfg_overrides,
774786
build_scripts,
787+
*set_test,
775788
)
776789
}else{
777790
detached_file_to_crate_graph(
@@ -780,6 +793,7 @@ impl ProjectWorkspace {
780793
file,
781794
sysroot,
782795
cfg_overrides,
796+
*set_test,
783797
)
784798
},
785799
sysroot,
@@ -813,13 +827,15 @@ impl ProjectWorkspace {
813827
cargo_config_extra_env,
814828
build_scripts: _,
815829
error: _,
830+
set_test: _,
816831
},
817832
ProjectWorkspaceKind::Cargo{
818833
cargo: o_cargo,
819834
rustc: o_rustc,
820835
cargo_config_extra_env: o_cargo_config_extra_env,
821836
build_scripts: _,
822837
error: _,
838+
set_test: _,
823839
},
824840
) => {
825841
cargo == o_cargo
@@ -834,11 +850,13 @@ impl ProjectWorkspace {
834850
file,
835851
cargo:Some((cargo_script, _, _)),
836852
cargo_config_extra_env,
853+
set_test: _,
837854
},
838855
ProjectWorkspaceKind::DetachedFile{
839856
file: o_file,
840857
cargo:Some((o_cargo_script, _, _)),
841858
cargo_config_extra_env: o_cargo_config_extra_env,
859+
set_test: _,
842860
},
843861
) => {
844862
file == o_file
@@ -987,6 +1005,7 @@ fn cargo_to_crate_graph(
9871005
rustc_cfg:Vec<CfgAtom>,
9881006
override_cfg:&CfgOverrides,
9891007
build_scripts:&WorkspaceBuildScripts,
1008+
set_test:bool,
9901009
) -> (CrateGraph,ProcMacroPaths){
9911010
let _p = tracing::info_span!("cargo_to_crate_graph").entered();
9921011
letmut res = (CrateGraph::default(),ProcMacroPaths::default());
@@ -1011,8 +1030,10 @@ fn cargo_to_crate_graph(
10111030
letmut cfg_options = cfg_options.clone();
10121031

10131032
if cargo[pkg].is_local{
1014-
// Add test cfg for local crates
1015-
cfg_options.insert_atom(sym::test.clone());
1033+
if set_test {
1034+
// Add test cfg for local crates
1035+
cfg_options.insert_atom(sym::test.clone());
1036+
}
10161037
cfg_options.insert_atom(sym::rust_analyzer.clone());
10171038
}
10181039

@@ -1173,14 +1194,17 @@ fn detached_file_to_crate_graph(
11731194
detached_file:&ManifestPath,
11741195
sysroot:&Sysroot,
11751196
override_cfg:&CfgOverrides,
1197+
set_test:bool,
11761198
) -> (CrateGraph,ProcMacroPaths){
11771199
let _p = tracing::info_span!("detached_file_to_crate_graph").entered();
11781200
letmut crate_graph = CrateGraph::default();
11791201
let(public_deps, _libproc_macro) =
11801202
sysroot_to_crate_graph(&mut crate_graph, sysroot, rustc_cfg.clone(), load);
11811203

11821204
letmut cfg_options = CfgOptions::from_iter(rustc_cfg);
1183-
cfg_options.insert_atom(sym::test.clone());
1205+
if set_test {
1206+
cfg_options.insert_atom(sym::test.clone());
1207+
}
11841208
cfg_options.insert_atom(sym::rust_analyzer.clone());
11851209
override_cfg.apply(&mut cfg_options,"");
11861210
let cfg_options = Arc::new(cfg_options);
@@ -1426,6 +1450,7 @@ fn sysroot_to_crate_graph(
14261450
..Default::default()
14271451
},
14281452
&WorkspaceBuildScripts::default(),
1453+
false,
14291454
);
14301455

14311456
letmut pub_deps = vec![];

‎src/tools/rust-analyzer/crates/rust-analyzer/src/cli/analysis_stats.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ impl flags::AnalysisStats {
6565
false => Some(RustLibSource::Discover),
6666
},
6767
all_targets:true,
68+
set_test:true,
6869
..Default::default()
6970
};
7071
let no_progress = &|_| ();

‎src/tools/rust-analyzer/crates/rust-analyzer/src/cli/lsif.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ impl flags::Lsif {
277277
let cargo_config = &CargoConfig{
278278
sysroot:Some(RustLibSource::Discover),
279279
all_targets:true,
280+
set_test:true,
280281
..Default::default()
281282
};
282283
let no_progress = &|_| ();

‎src/tools/rust-analyzer/crates/rust-analyzer/src/cli/run_tests.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ impl flags::RunTests {
1616
let cargo_config = CargoConfig{
1717
sysroot:Some(RustLibSource::Discover),
1818
all_targets:true,
19+
set_test:true,
1920
..Default::default()
2021
};
2122
let load_cargo_config = LoadCargoConfig{

0 commit comments

Comments
 (0)