Skip to content

Commit 1ca85ac

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

File tree

18 files changed

+109
-18
lines changed

18 files changed

+109
-18
lines changed

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+
pub fn check_atom(&self, cfg: &CfgAtom) -> bool {
53+
self.enabled.contains(cfg)
54+
}
55+
5256
pub fn insert_atom(&mut self, 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
if matches!(
13291333
def.kind,
13301334
MacroDefKind::BuiltInAttr(_, expander)
13311335
if expander.is_test() || expander.is_bench()
13321336
) {
1333-
return recollect_without(self);
1337+
let test_is_active =
1338+
self.cfg_options.check_atom(&CfgAtom::Flag(sym::test.clone()));
1339+
if test_is_active {
1340+
return recollect_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
use crate::{db::ExpandDatabase, name, tt, ExpandResult, MacroCallKind};
66

7+
use super::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
pub fn find_builtin_attr(ident: &name::Name) -> Option<BuiltinAttrExpander> {
@@ -76,6 +78,19 @@ fn dummy_attr_expand(
7678
ExpandResult::ok(tt.clone())
7779
}
7880

81+
fn dummy_gate_test_expand(
82+
_db: &dyn ExpandDatabase,
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
fn test_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
pub invocation_strategy: InvocationStrategy,
101101
/// Optional path to use instead of `target` when building
102102
pub target_dir: Option<Utf8PathBuf>,
103+
pub set_test: bool,
103104
}
104105

105106
pub type Package = 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
if let Some((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
let mut res = (CrateGraph::default(), ProcMacroPaths::default());
@@ -1011,8 +1030,10 @@ fn cargo_to_crate_graph(
10111030
let mut 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
let mut 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
let mut 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
let mut 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 {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ impl Tester {
7070
let cargo_config = CargoConfig {
7171
sysroot: Some(RustLibSource::Discover),
7272
all_targets: true,
73+
set_test: true,
7374
..Default::default()
7475
};
7576

@@ -85,6 +86,7 @@ impl Tester {
8586
file: ManifestPath::try_from(tmp_file).unwrap(),
8687
cargo: None,
8788
cargo_config_extra_env: Default::default(),
89+
set_test: true,
8890
},
8991
sysroot,
9092
rustc_cfg: vec![],

src/tools/rust-analyzer/crates/rust-analyzer/src/cli/scip.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ impl flags::Scip {
2424
let now = Instant::now();
2525

2626
let no_progress = &|s| (eprintln!("rust-analyzer: Loading {s}"));
27-
let load_cargo_config = LoadCargoConfig {
28-
load_out_dirs_from_check: true,
29-
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
30-
prefill_caches: true,
31-
};
3227
let root =
3328
vfs::AbsPathBuf::assert_utf8(std::env::current_dir()?.join(&self.path)).normalize();
3429

@@ -51,6 +46,11 @@ impl flags::Scip {
5146
// FIXME @alibektas : What happens to errors without logging?
5247
error!(?error_sink, "Config Error(s)");
5348
}
49+
let load_cargo_config = LoadCargoConfig {
50+
load_out_dirs_from_check: true,
51+
with_proc_macro_server: ProcMacroServerChoice::Sysroot,
52+
prefill_caches: true,
53+
};
5454
let cargo_config = config.cargo(None);
5555
let (db, vfs, _) = load_workspace_at(
5656
root.as_path().as_ref(),

0 commit comments

Comments
 (0)