]> git.lizzy.rs Git - rust.git/commitdiff
Refactor `ExtCtxt` to use a `Resolver` instead of a `MacroLoader`.
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Mon, 5 Sep 2016 03:46:05 +0000 (03:46 +0000)
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Tue, 13 Sep 2016 05:31:16 +0000 (05:31 +0000)
src/librustc/middle/cstore.rs
src/librustc_driver/driver.rs
src/librustc_metadata/macro_import.rs
src/librustc_resolve/lib.rs
src/libsyntax/ext/base.rs
src/libsyntax/ext/expand.rs
src/libsyntax/test.rs
src/libsyntax_ext/rustc_macro_registrar.rs
src/test/compile-fail-fulldeps/qquote.rs
src/test/run-fail-fulldeps/qquote.rs
src/test/run-pass-fulldeps/qquote.rs

index b33bc520fe21622407561beccea2dab9e662dc30..5bbc0cd9d907138e5524960f49a85925d9913396 100644 (file)
@@ -39,6 +39,7 @@
 use std::path::PathBuf;
 use syntax::ast;
 use syntax::attr;
+use syntax::ext::base::LoadedMacro;
 use syntax::ptr::P;
 use syntax::parse::token::InternedString;
 use syntax_pos::Span;
@@ -488,6 +489,9 @@ fn encode_metadata<'a>(&self, tcx: TyCtxt<'a, 'tcx, 'tcx>,
     fn metadata_encoding_version(&self) -> &[u8] { bug!("metadata_encoding_version") }
 }
 
+pub trait MacroLoader {
+     fn load_crate(&mut self, extern_crate: &ast::Item, allows_macros: bool) -> Vec<LoadedMacro>;
+}
 
 /// Metadata encoding and decoding can make use of thread-local encoding and
 /// decoding contexts. These allow implementers of serialize::Encodable and
index ba6c4b9b84c37da50462c598f4c81e909a564a8d..0d9bf14f12fb210af506e994fccd0a0ef536b1d9 100644 (file)
@@ -638,6 +638,12 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
     }
     sess.track_errors(|| sess.lint_store.borrow_mut().process_command_line(sess))?;
 
+    let mut macro_loader =
+        macro_import::MacroLoader::new(sess, &cstore, crate_name, krate.config.clone());
+
+    let resolver_arenas = Resolver::arenas();
+    let mut resolver = Resolver::new(sess, make_glob_map, &mut macro_loader, &resolver_arenas);
+
     krate = time(time_passes, "expansion", || {
         // Windows dlls do not have rpaths, so they don't know how to find their
         // dependencies. It's up to us to tell the system where to find all the
@@ -672,14 +678,10 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
             trace_mac: sess.opts.debugging_opts.trace_macros,
             should_test: sess.opts.test,
         };
-        let mut loader = macro_import::MacroLoader::new(sess,
-                                                        &cstore,
-                                                        crate_name,
-                                                        krate.config.clone());
         let mut ecx = syntax::ext::base::ExtCtxt::new(&sess.parse_sess,
                                                       krate.config.clone(),
                                                       cfg,
-                                                      &mut loader);
+                                                      &mut resolver);
         syntax_ext::register_builtins(&mut ecx.syntax_env);
         let ret = syntax::ext::expand::expand_crate(&mut ecx, syntax_exts, krate);
         if cfg!(windows) {
@@ -708,9 +710,6 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
                                                   &sess.features.borrow())
     });
 
-    let resolver_arenas = Resolver::arenas();
-    let mut resolver = Resolver::new(sess, make_glob_map, &resolver_arenas);
-
     let krate = time(sess.time_passes(), "assigning node ids", || resolver.assign_node_ids(krate));
 
     if sess.opts.debugging_opts.input_stats {
index 22691975050e5f8750416b2d44f926e3e00e85d2..e41f076d64a80bea5abc8e227509d937d3fe05b1 100644 (file)
@@ -18,6 +18,7 @@
 use cstore::CStore;
 
 use rustc::hir::def_id::DefIndex;
+use rustc::middle;
 use rustc::session::Session;
 use rustc::util::nodemap::FnvHashMap;
 use rustc_back::dynamic_lib::DynamicLibrary;
@@ -26,7 +27,6 @@
 use syntax::ast;
 use syntax::attr;
 use syntax::ext::base::LoadedMacro;
-use syntax::ext;
 use syntax::parse::token;
 use syntax_ext::deriving::custom::CustomDerive;
 use syntax_pos::Span;
@@ -55,7 +55,7 @@ pub fn call_bad_macro_reexport(a: &Session, b: Span) {
 
 pub type MacroSelection = FnvHashMap<token::InternedString, Span>;
 
-impl<'a> ext::base::MacroLoader for MacroLoader<'a> {
+impl<'a> middle::cstore::MacroLoader for MacroLoader<'a> {
     fn load_crate(&mut self,
                   extern_crate: &ast::Item,
                   allows_macros: bool) -> Vec<LoadedMacro> {
index c5b505fba38e9669c76f2f1f60f89a50587a0e28..c1e6d93a970e5f350e1b8d6ec2f8d3b491a88121 100644 (file)
@@ -45,6 +45,7 @@
 
 use rustc::hir::map::Definitions;
 use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
+use rustc::middle::cstore::MacroLoader;
 use rustc::session::Session;
 use rustc::lint;
 use rustc::hir::def::*;
@@ -53,6 +54,8 @@
 use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
 use rustc::util::nodemap::{NodeMap, NodeSet, FnvHashMap, FnvHashSet};
 
+use syntax::ext;
+use syntax::ext::base::LoadedMacro;
 use syntax::ext::hygiene::Mark;
 use syntax::ast::{self, FloatTy};
 use syntax::ast::{CRATE_NODE_ID, Name, NodeId, CrateNum, IntTy, UintTy};
@@ -1068,6 +1071,8 @@ pub struct Resolver<'a> {
     arenas: &'a ResolverArenas<'a>,
     dummy_binding: &'a NameBinding<'a>,
     new_import_semantics: bool, // true if `#![feature(item_like_imports)]`
+
+    macro_loader: &'a mut MacroLoader,
 }
 
 pub struct ResolverArenas<'a> {
@@ -1149,6 +1154,12 @@ fn definitions(&mut self) -> Option<&mut Definitions> {
     }
 }
 
+impl<'a> ext::base::Resolver for Resolver<'a> {
+    fn load_crate(&mut self, extern_crate: &ast::Item, allows_macros: bool) -> Vec<LoadedMacro> {
+        self.macro_loader.load_crate(extern_crate, allows_macros)
+    }
+}
+
 trait Named {
     fn name(&self) -> Name;
 }
@@ -1166,7 +1177,10 @@ fn name(&self) -> Name {
 }
 
 impl<'a> Resolver<'a> {
-    pub fn new(session: &'a Session, make_glob_map: MakeGlobMap, arenas: &'a ResolverArenas<'a>)
+    pub fn new(session: &'a Session,
+               make_glob_map: MakeGlobMap,
+               macro_loader: &'a mut MacroLoader,
+               arenas: &'a ResolverArenas<'a>)
                -> Resolver<'a> {
         let root_def_id = DefId::local(CRATE_DEF_INDEX);
         let graph_root =
@@ -1227,6 +1241,8 @@ pub fn new(session: &'a Session, make_glob_map: MakeGlobMap, arenas: &'a Resolve
                 vis: ty::Visibility::Public,
             }),
             new_import_semantics: session.features.borrow().item_like_imports,
+
+            macro_loader: macro_loader,
         }
     }
 
index f6eb6f1da4f19f069b38d29a657cd99394ccb024..d0e11643c64c137f77616ca85911071f674f188b 100644 (file)
@@ -546,7 +546,7 @@ fn builtin_normal_expander(f: MacroExpanderFn) -> SyntaxExtension {
     syntax_expanders
 }
 
-pub trait MacroLoader {
+pub trait Resolver {
     fn load_crate(&mut self, extern_crate: &ast::Item, allows_macros: bool)
                   -> Vec<LoadedMacro>;
 }
@@ -556,8 +556,8 @@ pub enum LoadedMacro {
     CustomDerive(String, Box<MultiItemModifier>),
 }
 
-pub struct DummyMacroLoader;
-impl MacroLoader for DummyMacroLoader {
+pub struct DummyResolver;
+impl Resolver for DummyResolver {
     fn load_crate(&mut self, _: &ast::Item, _: bool) -> Vec<LoadedMacro> {
         Vec::new()
     }
@@ -572,7 +572,7 @@ pub struct ExtCtxt<'a> {
     pub backtrace: ExpnId,
     pub ecfg: expand::ExpansionConfig<'a>,
     pub crate_root: Option<&'static str>,
-    pub loader: &'a mut MacroLoader,
+    pub resolver: &'a mut Resolver,
 
     pub exported_macros: Vec<ast::MacroDef>,
 
@@ -584,7 +584,7 @@ pub struct ExtCtxt<'a> {
 impl<'a> ExtCtxt<'a> {
     pub fn new(parse_sess: &'a parse::ParseSess, cfg: ast::CrateConfig,
                ecfg: expand::ExpansionConfig<'a>,
-               loader: &'a mut MacroLoader)
+               resolver: &'a mut Resolver)
                -> ExtCtxt<'a> {
         ExtCtxt {
             syntax_env: initial_syntax_expander_table(&ecfg),
@@ -594,7 +594,7 @@ pub fn new(parse_sess: &'a parse::ParseSess, cfg: ast::CrateConfig,
             ecfg: ecfg,
             crate_root: None,
             exported_macros: Vec::new(),
-            loader: loader,
+            resolver: resolver,
             derive_modes: HashMap::new(),
             recursion_count: 0,
         }
index 4715eda8374900fb488ea6d6e5522b44a7d0d4ee..44db1dd17ae6a96dca27ea940afdd63c70c36fc0 100644 (file)
@@ -644,7 +644,7 @@ fn fold_item(&mut self, item: P<ast::Item>) -> SmallVector<P<ast::Item>> {
                 // We need to error on `#[macro_use] extern crate` when it isn't at the
                 // crate root, because `$crate` won't work properly.
                 let is_crate_root = self.cx.syntax_env.is_crate_root();
-                for def in self.cx.loader.load_crate(&*item, is_crate_root) {
+                for def in self.cx.resolver.load_crate(&*item, is_crate_root) {
                     match def {
                         LoadedMacro::Def(def) => self.cx.insert_macro(def),
                         LoadedMacro::CustomDerive(name, ext) => {
@@ -809,7 +809,7 @@ fn mark_tts(tts: &[TokenTree], m: Mark) -> Vec<TokenTree> {
 mod tests {
     use super::{expand_crate, ExpansionConfig};
     use ast;
-    use ext::base::{ExtCtxt, DummyMacroLoader};
+    use ext::base::{ExtCtxt, DummyResolver};
     use parse;
     use util::parser_testing::{string_to_parser};
     use visit;
@@ -850,7 +850,7 @@ fn test_ecfg() -> ExpansionConfig<'static> {
             src,
             Vec::new(), &sess).unwrap();
         // should fail:
-        let mut loader = DummyMacroLoader;
+        let mut loader = DummyResolver;
         let mut ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut loader);
         expand_crate(&mut ecx, vec![], crate_ast);
     }
@@ -865,7 +865,7 @@ fn test_ecfg() -> ExpansionConfig<'static> {
             "<test>".to_string(),
             src,
             Vec::new(), &sess).unwrap();
-        let mut loader = DummyMacroLoader;
+        let mut loader = DummyResolver;
         let mut ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut loader);
         expand_crate(&mut ecx, vec![], crate_ast);
     }
@@ -879,7 +879,7 @@ fn test_ecfg() -> ExpansionConfig<'static> {
             "<test>".to_string(),
             src,
             Vec::new(), &sess).unwrap();
-        let mut loader = DummyMacroLoader;
+        let mut loader = DummyResolver;
         let mut ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut loader);
         expand_crate(&mut ecx, vec![], crate_ast);
     }
@@ -888,7 +888,7 @@ fn expand_crate_str(crate_str: String) -> ast::Crate {
         let ps = parse::ParseSess::new();
         let crate_ast = panictry!(string_to_parser(&ps, crate_str).parse_crate_mod());
         // the cfg argument actually does matter, here...
-        let mut loader = DummyMacroLoader;
+        let mut loader = DummyResolver;
         let mut ecx = ExtCtxt::new(&ps, vec![], test_ecfg(), &mut loader);
         expand_crate(&mut ecx, vec![], crate_ast)
     }
index 3108296e778a2d9421e99713620513ac0e8a139e..dde8a8d271f62c97820bcc35898f6aca511c92e2 100644 (file)
@@ -28,7 +28,7 @@
 use errors::snippet::{SnippetData};
 use config;
 use entry::{self, EntryPointType};
-use ext::base::{ExtCtxt, DummyMacroLoader};
+use ext::base::{ExtCtxt, DummyResolver};
 use ext::build::AstBuilder;
 use ext::expand::ExpansionConfig;
 use fold::Folder;
@@ -276,13 +276,13 @@ fn generate_test_harness(sess: &ParseSess,
     let mut cleaner = EntryPointCleaner { depth: 0 };
     let krate = cleaner.fold_crate(krate);
 
-    let mut loader = DummyMacroLoader;
+    let mut resolver = DummyResolver;
     let mut cx: TestCtxt = TestCtxt {
         sess: sess,
         span_diagnostic: sd,
         ext_cx: ExtCtxt::new(sess, vec![],
                              ExpansionConfig::default("test".to_string()),
-                             &mut loader),
+                             &mut resolver),
         path: Vec::new(),
         testfns: Vec::new(),
         reexport_test_harness_main: reexport_test_harness_main,
index 7693e2416f4b0b883476d9975dfde608d0bfcbc0..78fed9d33dd8282a63bd7f268e340645ce1494d5 100644 (file)
@@ -13,7 +13,7 @@
 use errors;
 use syntax::ast::{self, Ident, NodeId};
 use syntax::codemap::{ExpnInfo, NameAndSpan, MacroAttribute};
-use syntax::ext::base::{ExtCtxt, DummyMacroLoader};
+use syntax::ext::base::{ExtCtxt, DummyResolver};
 use syntax::ext::build::AstBuilder;
 use syntax::ext::expand::ExpansionConfig;
 use syntax::parse::ParseSess;
@@ -44,7 +44,7 @@ pub fn modify(sess: &ParseSess,
               num_crate_types: usize,
               handler: &errors::Handler,
               features: &Features) -> ast::Crate {
-    let mut loader = DummyMacroLoader;
+    let mut loader = DummyResolver;
     let mut cx = ExtCtxt::new(sess,
                               Vec::new(),
                               ExpansionConfig::default("rustc_macro".to_string()),
index e29ded8a052c6f73b16462e0a89b0ddd26e7f714..3e5d17e2ffb17a582a96507019964331a7c4e6e3 100644 (file)
 
 fn main() {
     let ps = syntax::parse::ParseSess::new();
-    let mut loader = syntax::ext::base::DummyMacroLoader;
+    let mut resolver = syntax::ext::base::DummyResolver;
     let mut cx = syntax::ext::base::ExtCtxt::new(
         &ps, vec![],
         syntax::ext::expand::ExpansionConfig::default("qquote".to_string()),
-        &mut loader);
+        &mut resolver);
     cx.bt_push(syntax::codemap::ExpnInfo {
         call_site: DUMMY_SP,
         callee: syntax::codemap::NameAndSpan {
index 47e97abbbaa47ef441ed1344e170279f0412f236..1458583ff58303a50dba9d82cf12122e54f8ce90 100644 (file)
 
 fn main() {
     let ps = syntax::parse::ParseSess::new();
-    let mut loader = syntax::ext::base::DummyMacroLoader;
+    let mut resolver = syntax::ext::base::DummyResolver;
     let mut cx = syntax::ext::base::ExtCtxt::new(
         &ps, vec![],
         syntax::ext::expand::ExpansionConfig::default("qquote".to_string()),
-        &mut loader);
+        &mut resolver);
     cx.bt_push(syntax::codemap::ExpnInfo {
         call_site: DUMMY_SP,
         callee: syntax::codemap::NameAndSpan {
index a4f0e35cc5ac70792ef2da6cfc047c3ed3681b93..2a53a62a5ab60d5757b7da4c0b25f9ddfb2e732e 100644 (file)
 
 fn main() {
     let ps = syntax::parse::ParseSess::new();
-    let mut loader = syntax::ext::base::DummyMacroLoader;
+    let mut resolver = syntax::ext::base::DummyResolver;
     let mut cx = syntax::ext::base::ExtCtxt::new(
         &ps, vec![],
         syntax::ext::expand::ExpansionConfig::default("qquote".to_string()),
-        &mut loader);
+        &mut resolver);
     cx.bt_push(syntax::codemap::ExpnInfo {
         call_site: DUMMY_SP,
         callee: syntax::codemap::NameAndSpan {