From 538288176a22b4d3755df085783f84d476386019 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Mon, 15 Sep 2014 19:02:14 -0700 Subject: Implement macro re-export Fixes #17103. --- src/libsyntax/ext/expand.rs | 9 ++++++++- src/libsyntax/ext/tt/reexport.rs | 41 ++++++++++++++++++++++++++++++++++++++++ src/libsyntax/lib.rs | 1 + 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/libsyntax/ext/tt/reexport.rs (limited to 'src/libsyntax') 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, 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, } 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 or the MIT license +// , 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 { + let usage = "malformed macro_reexport attribute, expected \ + #![macro_reexport(ident, ident, ...)]"; + + let mut reexported: Vec = 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; } } -- cgit 1.4.1-3-g733a5