Reexport tests without polluting namespaces

This commit is contained in:
John Renner 2018-07-24 17:51:37 -07:00
parent 487e961c6a
commit f76049cd6a
2 changed files with 52 additions and 1 deletions

View file

@ -15,6 +15,7 @@ use codemap::{ExpnInfo, MacroBang, MacroAttribute, dummy_spanned, respan};
use config::{is_test_or_bench, StripUnconfigured};
use errors::{Applicability, FatalError};
use ext::base::*;
use ext::build::AstBuilder;
use ext::derive::{add_derived_markers, collect_derives};
use ext::hygiene::{self, Mark, SyntaxContext};
use ext::placeholders::{placeholder, PlaceholderExpander};
@ -1354,12 +1355,29 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
// Ensure that test functions are accessible from the test harness.
ast::ItemKind::Fn(..) if self.cx.ecfg.should_test => {
if item.attrs.iter().any(|attr| is_test_or_bench(attr)) {
let orig_vis = item.vis.clone();
// Publicize the item under gensymed name to avoid pollution
item = item.map(|mut item| {
item.vis = respan(item.vis.span, ast::VisibilityKind::Public);
item.ident = Ident::from_interned_str(
item.ident.as_interned_str()).gensym();
item
});
// Use the gensymed name under the item's original visibility
let use_item = self.cx.item_use_simple_(
item.ident.span,
orig_vis,
Some(Ident::from_interned_str(item.ident.as_interned_str())),
self.cx.path(item.ident.span, vec![item.ident]));
SmallVector::many(
noop_fold_item(item, self).into_iter()
.chain(noop_fold_item(use_item, self)))
} else {
noop_fold_item(item, self)
}
noop_fold_item(item, self)
}
_ => noop_fold_item(item, self),
}

View file

@ -0,0 +1,33 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// This test checks for namespace pollution by private tests.
// Tests used to marked as public causing name conflicts with normal
// functions only in test builds.
// compile-flags: --test
mod a {
pub fn foo() -> bool {
true
}
}
mod b {
#[test]
fn foo() {}
}
use a::*;
use b::*;
fn conflict() {
let _: bool = foo();
}