Rollup merge of #109985 - blyxyas:is_test_crate, r=compiler-errors
Add little `is_test_crate` function
Ok, this is quite a story.
I'm mainly a Clippy contributor, so I was fixing [this Clippy issue](https://github.com/rust-lang/rust-clippy/pull/10584) about a lint having to ignore test modules but that wasn't ignoring test files (integration test, `test/` dirs and such).
As test **files** don't tend to have an inner `#[cfg(test)]` module inside them, I tried everything, looking for filenames, looking for item's parents in the HIR Map, doing black magic...
I even asked [on Zulip](https://rust-lang.zulipchat.com/#narrow/stream/122651-general/topic/.E2.9C.94.20Checking.20if.20file.20is.20integration.20test), and jyn answered something about `--cfg test`. Aha! That's something that I might be looking for, so I started looking at `rustc_driver_impl` flag parsing and configuration and all that.
Then, I stumbled on [this function right here](2e486be8d2/compiler/rustc_driver_impl/src/lib.rs (L174-L181)
), and noticed the argument `config: Config`. That's a hint.
So [Config](https://doc.rust-lang.org/beta/nightly-rustc/rustc_interface/interface/struct.Config.html) has the field `opts: Options`, and [`Options`](https://doc.rust-lang.org/beta/nightly-rustc/rustc_session/options/struct.Options.html) has the field `test`.
This journey has been ~7 or 8 hours in 3 days, it's a very hard thing to find, so this PR adds a mini-function to check if the current crate is a testing one. So that no one has to travel through the same as me, and can just search for `is_test_crate` in the documentation.
This commit is contained in:
commit
3dfda2c72f
7 changed files with 12 additions and 7 deletions
|
@ -53,7 +53,7 @@ pub fn inject(krate: &mut ast::Crate, sess: &Session, resolver: &mut dyn Resolve
|
||||||
// even in non-test builds
|
// even in non-test builds
|
||||||
let test_runner = get_test_runner(span_diagnostic, &krate);
|
let test_runner = get_test_runner(span_diagnostic, &krate);
|
||||||
|
|
||||||
if sess.opts.test {
|
if sess.is_test_crate() {
|
||||||
let panic_strategy = match (panic_strategy, sess.opts.unstable_opts.panic_abort_tests) {
|
let panic_strategy = match (panic_strategy, sess.opts.unstable_opts.panic_abort_tests) {
|
||||||
(PanicStrategy::Abort, true) => PanicStrategy::Abort,
|
(PanicStrategy::Abort, true) => PanicStrategy::Abort,
|
||||||
(PanicStrategy::Abort, false) => {
|
(PanicStrategy::Abort, false) => {
|
||||||
|
|
|
@ -2301,7 +2301,7 @@ fn add_native_libs_from_crate(
|
||||||
|| (whole_archive == None
|
|| (whole_archive == None
|
||||||
&& bundle
|
&& bundle
|
||||||
&& cnum == LOCAL_CRATE
|
&& cnum == LOCAL_CRATE
|
||||||
&& sess.opts.test);
|
&& sess.is_test_crate());
|
||||||
|
|
||||||
if bundle && cnum != LOCAL_CRATE {
|
if bundle && cnum != LOCAL_CRATE {
|
||||||
if let Some(filename) = lib.filename {
|
if let Some(filename) = lib.filename {
|
||||||
|
|
|
@ -230,7 +230,7 @@ fn configure_and_expand(
|
||||||
features: Some(features),
|
features: Some(features),
|
||||||
recursion_limit,
|
recursion_limit,
|
||||||
trace_mac: sess.opts.unstable_opts.trace_macros,
|
trace_mac: sess.opts.unstable_opts.trace_macros,
|
||||||
should_test: sess.opts.test,
|
should_test: sess.is_test_crate(),
|
||||||
span_debug: sess.opts.unstable_opts.span_debug,
|
span_debug: sess.opts.unstable_opts.span_debug,
|
||||||
proc_macro_backtrace: sess.opts.unstable_opts.proc_macro_backtrace,
|
proc_macro_backtrace: sess.opts.unstable_opts.proc_macro_backtrace,
|
||||||
..rustc_expand::expand::ExpansionConfig::default(crate_name.to_string())
|
..rustc_expand::expand::ExpansionConfig::default(crate_name.to_string())
|
||||||
|
@ -292,7 +292,7 @@ fn configure_and_expand(
|
||||||
}
|
}
|
||||||
|
|
||||||
sess.time("maybe_create_a_macro_crate", || {
|
sess.time("maybe_create_a_macro_crate", || {
|
||||||
let is_test_crate = sess.opts.test;
|
let is_test_crate = sess.is_test_crate();
|
||||||
rustc_builtin_macros::proc_macro_harness::inject(
|
rustc_builtin_macros::proc_macro_harness::inject(
|
||||||
&mut krate,
|
&mut krate,
|
||||||
sess,
|
sess,
|
||||||
|
|
|
@ -530,7 +530,7 @@ struct MissingStabilityAnnotations<'tcx> {
|
||||||
impl<'tcx> MissingStabilityAnnotations<'tcx> {
|
impl<'tcx> MissingStabilityAnnotations<'tcx> {
|
||||||
fn check_missing_stability(&self, def_id: LocalDefId, span: Span) {
|
fn check_missing_stability(&self, def_id: LocalDefId, span: Span) {
|
||||||
let stab = self.tcx.stability().local_stability(def_id);
|
let stab = self.tcx.stability().local_stability(def_id);
|
||||||
if !self.tcx.sess.opts.test
|
if !self.tcx.sess.is_test_crate()
|
||||||
&& stab.is_none()
|
&& stab.is_none()
|
||||||
&& self.effective_visibilities.is_reachable(def_id)
|
&& self.effective_visibilities.is_reachable(def_id)
|
||||||
{
|
{
|
||||||
|
|
|
@ -393,7 +393,7 @@ impl Resolver<'_, '_> {
|
||||||
// If we are in the `--test` mode, suppress a help that adds the `#[cfg(test)]`
|
// If we are in the `--test` mode, suppress a help that adds the `#[cfg(test)]`
|
||||||
// attribute; however, if not, suggest adding the attribute. There is no way to
|
// attribute; however, if not, suggest adding the attribute. There is no way to
|
||||||
// retrieve attributes here because we do not have a `TyCtxt` yet.
|
// retrieve attributes here because we do not have a `TyCtxt` yet.
|
||||||
let test_module_span = if tcx.sess.opts.test {
|
let test_module_span = if tcx.sess.is_test_crate() {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
let parent_module = visitor.r.get_nearest_non_block_module(
|
let parent_module = visitor.r.get_nearest_non_block_module(
|
||||||
|
|
|
@ -1258,7 +1258,7 @@ pub fn build_configuration(sess: &Session, mut user_cfg: CrateConfig) -> CrateCo
|
||||||
// some default and generated configuration items.
|
// some default and generated configuration items.
|
||||||
let default_cfg = default_configuration(sess);
|
let default_cfg = default_configuration(sess);
|
||||||
// If the user wants a test runner, then add the test cfg.
|
// If the user wants a test runner, then add the test cfg.
|
||||||
if sess.opts.test {
|
if sess.is_test_crate() {
|
||||||
user_cfg.insert((sym::test, None));
|
user_cfg.insert((sym::test, None));
|
||||||
}
|
}
|
||||||
user_cfg.extend(default_cfg.iter().cloned());
|
user_cfg.extend(default_cfg.iter().cloned());
|
||||||
|
|
|
@ -294,6 +294,11 @@ impl Session {
|
||||||
self.crate_types.get().unwrap().as_slice()
|
self.crate_types.get().unwrap().as_slice()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if the crate is a testing one.
|
||||||
|
pub fn is_test_crate(&self) -> bool {
|
||||||
|
self.opts.test
|
||||||
|
}
|
||||||
|
|
||||||
pub fn needs_crate_hash(&self) -> bool {
|
pub fn needs_crate_hash(&self) -> bool {
|
||||||
// Why is the crate hash needed for these configurations?
|
// Why is the crate hash needed for these configurations?
|
||||||
// - debug_assertions: for the "fingerprint the result" check in
|
// - debug_assertions: for the "fingerprint the result" check in
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue