Fixes #17103.
deriving_hash_type_parameter: sess.features.borrow().default_type_params,
enable_quotes: sess.features.borrow().quote,
recursion_limit: sess.recursion_limit.get(),
+ reexported_macros: syntax::ext::tt::reexport::gather(sess.diagnostic(),
+ &krate),
};
let ret = syntax::ext::expand::expand_crate(&sess.parse_sess,
cfg,
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);
}
pub deriving_hash_type_parameter: bool,
pub enable_quotes: bool,
pub recursion_limit: uint,
+ pub reexported_macros: Vec<String>,
}
impl ExpansionConfig {
deriving_hash_type_parameter: false,
enable_quotes: false,
recursion_limit: 64,
+ reexported_macros: vec![],
}
}
}
--- /dev/null
+// 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
+}
pub mod transcribe;
pub mod macro_parser;
pub mod macro_rules;
+ pub mod reexport;
}
}
--- /dev/null
+// 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.
+
+#![crate_type = "dylib"]
+#![feature(macro_rules)]
+
+#[macro_export]
+macro_rules! reexported {
+ () => ( 3u )
+}
--- /dev/null
+// 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.
+
+#![crate_type = "dylib"]
+#![feature(phase)]
+
+#![macro_reexport(reexported)]
+
+#[phase(plugin)]
+extern crate macro_reexport_1;
--- /dev/null
+// 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.
+
+#![macro_reexport] //~ ERROR malformed macro_reexport attribute
+
+fn main() { }
--- /dev/null
+// 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.
+
+#![macro_reexport="foo"] //~ ERROR malformed macro_reexport attribute
+
+fn main() { }
--- /dev/null
+// 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.
+
+#![macro_reexport(foo="bar")] //~ ERROR malformed macro_reexport attribute
+
+fn main() { }
--- /dev/null
+// 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.
+
+// aux-build:macro_reexport_1.rs
+// aux-build:macro_reexport_2.rs
+// ignore-stage1
+
+#![feature(phase)]
+
+#[phase(plugin)]
+extern crate macro_reexport_2;
+
+fn main() {
+ assert_eq!(reexported!(), 3u);
+}