mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-21 17:52:12 +03:00
@@ -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,
|
||||
|
||||
@@ -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![],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -104,5 +104,6 @@ pub mod tt {
|
||||
pub mod transcribe;
|
||||
pub mod macro_parser;
|
||||
pub mod macro_rules;
|
||||
pub mod reexport;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 )
|
||||
}
|
||||
@@ -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() { }
|
||||
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user