mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
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
@ -53,7 +53,7 @@ pub fn inject(krate: &mut ast::Crate, sess: &Session, resolver: &mut dyn Resolve
|
||||
// even in non-test builds
|
||||
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) {
|
||||
(PanicStrategy::Abort, true) => PanicStrategy::Abort,
|
||||
(PanicStrategy::Abort, false) => {
|
||||
|
@ -2301,7 +2301,7 @@ fn add_native_libs_from_crate(
|
||||
|| (whole_archive == None
|
||||
&& bundle
|
||||
&& cnum == LOCAL_CRATE
|
||||
&& sess.opts.test);
|
||||
&& sess.is_test_crate());
|
||||
|
||||
if bundle && cnum != LOCAL_CRATE {
|
||||
if let Some(filename) = lib.filename {
|
||||
|
@ -230,7 +230,7 @@ fn configure_and_expand(
|
||||
features: Some(features),
|
||||
recursion_limit,
|
||||
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,
|
||||
proc_macro_backtrace: sess.opts.unstable_opts.proc_macro_backtrace,
|
||||
..rustc_expand::expand::ExpansionConfig::default(crate_name.to_string())
|
||||
@ -292,7 +292,7 @@ fn configure_and_expand(
|
||||
}
|
||||
|
||||
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(
|
||||
&mut krate,
|
||||
sess,
|
||||
|
@ -530,7 +530,7 @@ struct MissingStabilityAnnotations<'tcx> {
|
||||
impl<'tcx> MissingStabilityAnnotations<'tcx> {
|
||||
fn check_missing_stability(&self, def_id: LocalDefId, span: Span) {
|
||||
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()
|
||||
&& 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)]`
|
||||
// attribute; however, if not, suggest adding the attribute. There is no way to
|
||||
// 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
|
||||
} else {
|
||||
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.
|
||||
let default_cfg = default_configuration(sess);
|
||||
// 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.extend(default_cfg.iter().cloned());
|
||||
|
@ -294,6 +294,11 @@ impl Session {
|
||||
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 {
|
||||
// Why is the crate hash needed for these configurations?
|
||||
// - debug_assertions: for the "fingerprint the result" check in
|
||||
|
Loading…
Reference in New Issue
Block a user