]> git.lizzy.rs Git - rust.git/commitdiff
Move #[macro_reexport] to extern crate
authorKeegan McAllister <kmcallister@mozilla.com>
Fri, 2 Jan 2015 00:37:47 +0000 (16:37 -0800)
committerKeegan McAllister <kmcallister@mozilla.com>
Tue, 6 Jan 2015 02:21:13 +0000 (18:21 -0800)
13 files changed:
src/librustc/metadata/creader.rs
src/librustc/plugin/load.rs
src/librustc_driver/driver.rs
src/libstd/lib.rs
src/libsyntax/ast.rs
src/libsyntax/ext/base.rs
src/libsyntax/ext/expand.rs
src/libsyntax/ext/tt/reexport.rs [deleted file]
src/libsyntax/lib.rs
src/test/auxiliary/macro_reexport_2.rs
src/test/compile-fail/macro-reexport-malformed-1.rs
src/test/compile-fail/macro-reexport-malformed-2.rs
src/test/compile-fail/macro-reexport-malformed-3.rs

index c7a8457c6d24a428b962e9f011589f5f85a6cea3..d83bd8b9223951cf7661754f6bec1bcea879e787 100644 (file)
@@ -552,6 +552,7 @@ pub fn exported_macros(&self) -> Vec<ast::MacroDef> {
                     id: ast::DUMMY_NODE_ID,
                     span: span,
                     imported_from: imported_from,
+                    export: false,  // overridden in plugin/load.rs
                     body: body,
                 });
                 true
index d17ef199aa1bd32dacc57c76fd57f8be9a8058b3..93c97f6caa66a6aab5d8cb35287384d7eb5cf87e 100644 (file)
 use std::mem;
 use std::os;
 use std::dynamic_lib::DynamicLibrary;
+use std::collections::HashSet;
 use syntax::ast;
 use syntax::attr;
+use syntax::parse::token;
 use syntax::visit;
 use syntax::visit::Visitor;
 use syntax::attr::AttrMetaMethods;
@@ -87,6 +89,7 @@ fn visit_view_item(&mut self, vi: &ast::ViewItem) {
         // Parse the attributes relating to macro / plugin loading.
         let mut load_macros = false;
         let mut load_registrar = false;
+        let mut reexport = HashSet::new();
         for attr in vi.attrs.iter() {
             let mut used = true;
             match attr.name().get() {
@@ -96,6 +99,23 @@ fn visit_view_item(&mut self, vi: &ast::ViewItem) {
                 }
                 "plugin" => load_registrar = true,
                 "macro_use" => load_macros = true,
+                "macro_reexport" => {
+                    let names = match attr.meta_item_list() {
+                        Some(names) => names,
+                        None => {
+                            self.sess.span_err(attr.span, "bad macro reexport");
+                            continue;
+                        }
+                    };
+
+                    for name in names.iter() {
+                        if let ast::MetaWord(ref name) = name.node {
+                            reexport.insert(name.clone());
+                        } else {
+                            self.sess.span_err(name.span, "bad macro reexport");
+                        }
+                    }
+                }
                 _ => used = false,
             }
             if used {
@@ -116,7 +136,13 @@ fn visit_view_item(&mut self, vi: &ast::ViewItem) {
             }
         }
 
-        self.plugins.macros.extend(macros.into_iter());
+        for mut def in macros.into_iter() {
+            if reexport.contains(&token::get_ident(def.ident)) {
+                def.export = true;
+            }
+            self.plugins.macros.push(def);
+        }
+
         if let Some((lib, symbol)) = registrar {
             self.dylink_registrar(vi, lib, symbol);
         }
index f23cddf833cc94d2d5c09ea29fc75ecba1eb7621..261d73b5bf07ac42af9dcd635c4b8b93460606a3 100644 (file)
@@ -275,8 +275,6 @@ 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,
index 3eda6d3374ed989b37fd584517d74f590081b6f1..65c36d813f478d1a64608f006d412a7e86e6c9c3 100644 (file)
 
 #![reexport_test_harness_main = "test_main"]
 
-#![macro_reexport(assert, assert_eq, debug_assert, debug_assert_eq,
-    unreachable, unimplemented, write, writeln, vec)]
-
 #[cfg(all(test, stage0))]
 #[phase(plugin, link)]
 extern crate log;
 
 #[cfg(not(stage0))]
 #[macro_use]
+#[macro_reexport(assert, assert_eq, debug_assert, debug_assert_eq,
+    unreachable, unimplemented, write, writeln)]
 extern crate core;
 
 #[cfg(stage0)]
 
 #[cfg(not(stage0))]
 #[macro_use]
+#[macro_reexport(vec)]
 extern crate "collections" as core_collections;
 
 extern crate "rand" as core_rand;
index 36fc8a691dc30e94f6cddca70a24fb383ed572a7..e34060a73c1542e96498d6757e6f4f975e006770 100644 (file)
@@ -1708,6 +1708,7 @@ pub struct MacroDef {
     pub id: NodeId,
     pub span: Span,
     pub imported_from: Option<Ident>,
+    pub export: bool,
     pub body: Vec<TokenTree>,
 }
 
index 9a06745967f0d34ce57096355497069d413a9b77..815159e94c82a74790316ecc40563b13e2ad6787 100644 (file)
@@ -16,6 +16,7 @@
 use codemap::{CodeMap, Span, ExpnId, ExpnInfo, NO_EXPANSION};
 use ext;
 use ext::expand;
+use ext::tt::macro_rules;
 use parse;
 use parse::parser;
 use parse::token;
@@ -568,6 +569,15 @@ pub fn bt_pop(&mut self) {
             }
         }
     }
+
+    pub fn insert_macro(&mut self, def: ast::MacroDef) {
+        if def.export {
+            self.exported_macros.push(def.clone());
+        }
+        let ext = macro_rules::compile(self, &def);
+        self.syntax_env.insert(def.ident.name, ext);
+    }
+
     /// Emit `msg` attached to `sp`, and stop compilation immediately.
     ///
     /// `span_err` should be strongly preferred where-ever possible:
index d56df2d7fb4e0f2af09980e28f3add1e5be576ec..6c2b0610fa037200eebf8df1d4949e70a811da05 100644 (file)
@@ -17,7 +17,6 @@
 use ast_util::path_to_ident;
 use ext::mtwt;
 use ext::build::AstBuilder;
-use ext::tt::macro_rules;
 use attr;
 use attr::AttrMetaMethods;
 use codemap;
@@ -636,14 +635,10 @@ pub fn expand_item_mac(it: P<ast::Item>,
                         id: ast::DUMMY_NODE_ID,
                         span: it.span,
                         imported_from: None,
+                        export: attr::contains_name(it.attrs.as_slice(), "macro_export"),
                         body: tts,
                     };
-                    let ext = macro_rules::compile(fld.cx, &def);
-                    fld.cx.syntax_env.insert(def.ident.name, ext);
-
-                    if attr::contains_name(def.attrs.as_slice(), "macro_export") {
-                        fld.cx.exported_macros.push(def);
-                    }
+                    fld.cx.insert_macro(def);
 
                     // macro_rules! has a side effect but expands to nothing.
                     fld.cx.bt_pop();
@@ -1178,7 +1173,6 @@ pub struct ExpansionConfig {
     pub deriving_hash_type_parameter: bool,
     pub enable_quotes: bool,
     pub recursion_limit: uint,
-    pub reexported_macros: Vec<String>,
 }
 
 impl ExpansionConfig {
@@ -1188,7 +1182,6 @@ pub fn default(crate_name: String) -> ExpansionConfig {
             deriving_hash_type_parameter: false,
             enable_quotes: false,
             recursion_limit: 64,
-            reexported_macros: vec![],
         }
     }
 }
@@ -1202,15 +1195,8 @@ pub fn expand_crate(parse_sess: &parse::ParseSess,
     let mut cx = ExtCtxt::new(parse_sess, c.config.clone(), cfg);
     let mut expander = MacroExpander::new(&mut cx);
 
-    for def in imported_macros.iter() {
-        let ext = macro_rules::compile(expander.cx, def);
-        expander.cx.syntax_env.insert(def.ident.name, ext);
-
-        if expander.cx.ecfg.reexported_macros.iter()
-            .any(|e| e[] == token::get_ident(def.ident).get()) {
-
-            expander.cx.exported_macros.push(def.clone());
-        }
+    for def in imported_macros.into_iter() {
+        expander.cx.insert_macro(def);
     }
 
     for (name, extension) in user_exts.into_iter() {
diff --git a/src/libsyntax/ext/tt/reexport.rs b/src/libsyntax/ext/tt/reexport.rs
deleted file mode 100644 (file)
index 104f378..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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
-}
index 774a9f61cf9af92c8667abc7327f7902dd1238d5..b7bfd346d506b96fffdfbbb0e535d273a0969255 100644 (file)
@@ -111,6 +111,5 @@ pub mod tt {
         pub mod transcribe;
         pub mod macro_parser;
         pub mod macro_rules;
-        pub mod reexport;
     }
 }
index f54e5e5c4e122984aeeaa9a36e3b64725062c564..15d9f9cc9146d0a2c5e88fd1e2e762b1cc2b1fe1 100644 (file)
@@ -10,7 +10,6 @@
 
 #![crate_type = "dylib"]
 
-#![macro_reexport(reexported)]
-
+#[macro_reexport(reexported)]
 #[macro_use] #[no_link]
 extern crate macro_reexport_1;
index ea3074db124d67344085c5e515867734ccf55834..b9f754b2778bc653e8c196ec620f5494cb0e5549 100644 (file)
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![macro_reexport]  //~ ERROR malformed macro_reexport attribute
+#[macro_reexport]  //~ ERROR bad macro reexport
+extern crate std;
 
 fn main() { }
index 3daa089d2c677363b9f2361e30996d6c81ba4a66..9ced5be8479baf0c226d32169c30b11c05f1bd2e 100644 (file)
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![macro_reexport="foo"]  //~ ERROR malformed macro_reexport attribute
+#[macro_reexport="foo"]  //~ ERROR bad macro reexport
+extern crate std;
 
 fn main() { }
index b3c0bf95ce981d7dc43a34a9ed079e1a75a98ab1..c8bd0a0509cdcfa81e9ea375c96d407e66504160 100644 (file)
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-#![macro_reexport(foo="bar")]  //~ ERROR malformed macro_reexport attribute
+#[macro_reexport(foo="bar")]  //~ ERROR bad macro reexport
+extern crate std;
 
 fn main() { }