summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorKeegan McAllister <kmcallister@mozilla.com>2014-09-15 19:02:14 -0700
committerKeegan McAllister <kmcallister@mozilla.com>2015-01-05 11:38:12 -0800
commit538288176a22b4d3755df085783f84d476386019 (patch)
tree231a4cd0d91a8cdf4b4d9d315465e06c79a8a319 /src/libsyntax
parente2a9c04e192926fde1a8e886b55e4c2b6e0e56cb (diff)
downloadrust-538288176a22b4d3755df085783f84d476386019.tar.gz
rust-538288176a22b4d3755df085783f84d476386019.zip
Implement macro re-export
Fixes #17103.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/expand.rs9
-rw-r--r--src/libsyntax/ext/tt/reexport.rs41
-rw-r--r--src/libsyntax/lib.rs1
3 files changed, 50 insertions, 1 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs
index 325d8aa594a..d4be46d025e 100644
--- a/src/libsyntax/ext/expand.rs
+++ b/src/libsyntax/ext/expand.rs
@@ -616,7 +616,12 @@ pub fn expand_item_mac(it: P<ast::Item>,
                                                          imported_from, tts);
 
                     fld.cx.syntax_env.insert(intern(name.as_slice()), ext);
-                    if attr::contains_name(it.attrs.as_slice(), "macro_export") {
+
+                    if match imported_from {
+                        None => attr::contains_name(it.attrs.as_slice(), "macro_export"),
+                        Some(_) => fld.cx.ecfg.reexported_macros.iter()
+                                       .any(|e| e.as_slice() == name.as_slice()),
+                    } {
                         fld.cx.exported_macros.push(it);
                     }
 
@@ -1156,6 +1161,7 @@ pub struct ExpansionConfig {
     pub deriving_hash_type_parameter: bool,
     pub enable_quotes: bool,
     pub recursion_limit: uint,
+    pub reexported_macros: Vec<String>,
 }
 
 impl ExpansionConfig {
@@ -1165,6 +1171,7 @@ impl ExpansionConfig {
             deriving_hash_type_parameter: false,
             enable_quotes: false,
             recursion_limit: 64,
+            reexported_macros: vec![],
         }
     }
 }
diff --git a/src/libsyntax/ext/tt/reexport.rs b/src/libsyntax/ext/tt/reexport.rs
new file mode 100644
index 00000000000..104f3787253
--- /dev/null
+++ b/src/libsyntax/ext/tt/reexport.rs
@@ -0,0 +1,41 @@
+// Copyright 2014 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.
+
+//! Defines the crate attribute syntax for macro re-export.
+
+use ast;
+use attr::AttrMetaMethods;
+use diagnostic::SpanHandler;
+
+/// Return a vector of the names of all macros re-exported from the crate.
+pub fn gather(diag: &SpanHandler, krate: &ast::Crate) -> Vec<String> {
+    let usage = "malformed macro_reexport attribute, expected \
+                 #![macro_reexport(ident, ident, ...)]";
+
+    let mut reexported: Vec<String> = vec!();
+    for attr in krate.attrs.iter() {
+        if !attr.check_name("macro_reexport") {
+            continue;
+        }
+
+        match attr.meta_item_list() {
+            None => diag.span_err(attr.span, usage),
+            Some(list) => for mi in list.iter() {
+                match mi.node {
+                    ast::MetaWord(ref word)
+                        => reexported.push(word.to_string()),
+                    _ => diag.span_err(mi.span, usage),
+                }
+            }
+        }
+    }
+
+    reexported
+}
diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs
index 18cdb3fc647..0503d88cca2 100644
--- a/src/libsyntax/lib.rs
+++ b/src/libsyntax/lib.rs
@@ -104,5 +104,6 @@ pub mod ext {
         pub mod transcribe;
         pub mod macro_parser;
         pub mod macro_rules;
+        pub mod reexport;
     }
 }