diff options
| author | John Renner <john@jrenner.net> | 2018-07-24 17:51:37 -0700 |
|---|---|---|
| committer | John Renner <john@jrenner.net> | 2018-07-30 19:23:24 -0700 |
| commit | f76049cd6abd1964999764e5cf596748d29792b4 (patch) | |
| tree | f249f4bd0ebcccbb5c9322862cf8dc2ee99436be /src/libsyntax | |
| parent | 487e961c6ae072d969e148def0b0856c2367ae00 (diff) | |
| download | rust-f76049cd6abd1964999764e5cf596748d29792b4.tar.gz rust-f76049cd6abd1964999764e5cf596748d29792b4.zip | |
Reexport tests without polluting namespaces
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index b84046d1050..4b17ca87d87 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -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), } |
