about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorJohn Renner <john@jrenner.net>2018-07-24 17:51:37 -0700
committerJohn Renner <john@jrenner.net>2018-07-30 19:23:24 -0700
commitf76049cd6abd1964999764e5cf596748d29792b4 (patch)
treef249f4bd0ebcccbb5c9322862cf8dc2ee99436be /src/libsyntax
parent487e961c6ae072d969e148def0b0856c2367ae00 (diff)
downloadrust-f76049cd6abd1964999764e5cf596748d29792b4.tar.gz
rust-f76049cd6abd1964999764e5cf596748d29792b4.zip
Reexport tests without polluting namespaces
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/expand.rs20
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),
         }