Implement macro re-export

Fixes #17103.
This commit is contained in:
Keegan McAllister
2014-09-15 19:02:14 -07:00
parent e2a9c04e19
commit 538288176a
10 changed files with 147 additions and 1 deletions
+2
View File
@@ -275,6 +275,8 @@ pub fn phase_2_configure_and_expand(sess: &Session,
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,
+8 -1
View File
@@ -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 @@ pub fn default(crate_name: String) -> ExpansionConfig {
deriving_hash_type_parameter: false,
enable_quotes: false,
recursion_limit: 64,
reexported_macros: vec![],
}
}
}
+41
View File
@@ -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
}
+1
View File
@@ -104,5 +104,6 @@ pub mod tt {
pub mod transcribe;
pub mod macro_parser;
pub mod macro_rules;
pub mod reexport;
}
}
+17
View File
@@ -0,0 +1,17 @@
// 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 )
}
+17
View File
@@ -0,0 +1,17 @@
// 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;
@@ -0,0 +1,13 @@
// 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() { }
@@ -0,0 +1,13 @@
// 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() { }
@@ -0,0 +1,13 @@
// 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() { }
+22
View File
@@ -0,0 +1,22 @@
// 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);
}