Reexport tests without polluting namespaces
This commit is contained in:
parent
487e961c6a
commit
f76049cd6a
2 changed files with 52 additions and 1 deletions
|
|
@ -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),
|
||||
}
|
||||
|
|
|
|||
33
src/test/run-pass/issue-52557.rs
Normal file
33
src/test/run-pass/issue-52557.rs
Normal 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();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue