Skip to content

Commit a9821e1

Browse files
committed
Refactor ExtCtxt to use a Resolver instead of a MacroLoader.
1 parent 60440b2 commit a9821e1

File tree

11 files changed

+53
-34
lines changed

11 files changed

+53
-34
lines changed

src/librustc/middle/cstore.rs

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use std::rc::Rc;
3939
use std::path::PathBuf;
4040
use syntax::ast;
4141
use syntax::attr;
42+
use syntax::ext::base::LoadedMacro;
4243
use syntax::ptr::P;
4344
use syntax::parse::token::InternedString;
4445
use syntax_pos::Span;
@@ -488,6 +489,9 @@ impl<'tcx> CrateStore<'tcx> for DummyCrateStore {
488489
fn metadata_encoding_version(&self) -> &[u8] { bug!("metadata_encoding_version") }
489490
}
490491

492+
pub trait MacroLoader {
493+
fn load_crate(&mut self, extern_crate: &ast::Item, allows_macros: bool) -> Vec<LoadedMacro>;
494+
}
491495

492496
/// Metadata encoding and decoding can make use of thread-local encoding and
493497
/// decoding contexts. These allow implementers of serialize::Encodable and

src/librustc_driver/driver.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,12 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
638638
}
639639
sess.track_errors(|| sess.lint_store.borrow_mut().process_command_line(sess))?;
640640

641+
let mut macro_loader =
642+
macro_import::MacroLoader::new(sess, &cstore, crate_name, krate.config.clone());
643+
644+
let resolver_arenas = Resolver::arenas();
645+
let mut resolver = Resolver::new(sess, make_glob_map, &mut macro_loader, &resolver_arenas);
646+
641647
krate = time(time_passes, "expansion", || {
642648
// Windows dlls do not have rpaths, so they don't know how to find their
643649
// 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,
672678
trace_mac: sess.opts.debugging_opts.trace_macros,
673679
should_test: sess.opts.test,
674680
};
675-
let mut loader = macro_import::MacroLoader::new(sess,
676-
&cstore,
677-
crate_name,
678-
krate.config.clone());
679681
let mut ecx = syntax::ext::base::ExtCtxt::new(&sess.parse_sess,
680682
krate.config.clone(),
681683
cfg,
682-
&mut loader);
684+
&mut resolver);
683685
syntax_ext::register_builtins(&mut ecx.syntax_env);
684686
let ret = syntax::ext::expand::expand_crate(&mut ecx, syntax_exts, krate);
685687
if cfg!(windows) {
@@ -708,9 +710,6 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
708710
&sess.features.borrow())
709711
});
710712

711-
let resolver_arenas = Resolver::arenas();
712-
let mut resolver = Resolver::new(sess, make_glob_map, &resolver_arenas);
713-
714713
let krate = time(sess.time_passes(), "assigning node ids", || resolver.assign_node_ids(krate));
715714

716715
if sess.opts.debugging_opts.input_stats {

src/librustc_metadata/macro_import.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use creader::{CrateReader, Macros};
1818
use cstore::CStore;
1919

2020
use rustc::hir::def_id::DefIndex;
21+
use rustc::middle;
2122
use rustc::session::Session;
2223
use rustc::util::nodemap::FnvHashMap;
2324
use rustc_back::dynamic_lib::DynamicLibrary;
@@ -26,7 +27,6 @@ use rustc_macro::__internal::Registry;
2627
use syntax::ast;
2728
use syntax::attr;
2829
use syntax::ext::base::LoadedMacro;
29-
use syntax::ext;
3030
use syntax::parse::token;
3131
use syntax_ext::deriving::custom::CustomDerive;
3232
use syntax_pos::Span;
@@ -55,7 +55,7 @@ pub fn call_bad_macro_reexport(a: &Session, b: Span) {
5555

5656
pub type MacroSelection = FnvHashMap<token::InternedString, Span>;
5757

58-
impl<'a> ext::base::MacroLoader for MacroLoader<'a> {
58+
impl<'a> middle::cstore::MacroLoader for MacroLoader<'a> {
5959
fn load_crate(&mut self,
6060
extern_crate: &ast::Item,
6161
allows_macros: bool) -> Vec<LoadedMacro> {

src/librustc_resolve/lib.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ use self::ParentLink::*;
4545

4646
use rustc::hir::map::Definitions;
4747
use rustc::hir::{self, PrimTy, TyBool, TyChar, TyFloat, TyInt, TyUint, TyStr};
48+
use rustc::middle::cstore::MacroLoader;
4849
use rustc::session::Session;
4950
use rustc::lint;
5051
use rustc::hir::def::*;
@@ -53,6 +54,8 @@ use rustc::ty;
5354
use rustc::hir::{Freevar, FreevarMap, TraitCandidate, TraitMap, GlobMap};
5455
use rustc::util::nodemap::{NodeMap, NodeSet, FnvHashMap, FnvHashSet};
5556

57+
use syntax::ext;
58+
use syntax::ext::base::LoadedMacro;
5659
use syntax::ext::hygiene::Mark;
5760
use syntax::ast::{self, FloatTy};
5861
use syntax::ast::{CRATE_NODE_ID, Name, NodeId, CrateNum, IntTy, UintTy};
@@ -1068,6 +1071,8 @@ pub struct Resolver<'a> {
10681071
arenas: &'a ResolverArenas<'a>,
10691072
dummy_binding: &'a NameBinding<'a>,
10701073
new_import_semantics: bool, // true if `#![feature(item_like_imports)]`
1074+
1075+
macro_loader: &'a mut MacroLoader,
10711076
}
10721077

10731078
pub struct ResolverArenas<'a> {
@@ -1149,6 +1154,12 @@ impl<'a> hir::lowering::Resolver for Resolver<'a> {
11491154
}
11501155
}
11511156

1157+
impl<'a> ext::base::Resolver for Resolver<'a> {
1158+
fn load_crate(&mut self, extern_crate: &ast::Item, allows_macros: bool) -> Vec<LoadedMacro> {
1159+
self.macro_loader.load_crate(extern_crate, allows_macros)
1160+
}
1161+
}
1162+
11521163
trait Named {
11531164
fn name(&self) -> Name;
11541165
}
@@ -1166,7 +1177,10 @@ impl Named for hir::PathSegment {
11661177
}
11671178

11681179
impl<'a> Resolver<'a> {
1169-
pub fn new(session: &'a Session, make_glob_map: MakeGlobMap, arenas: &'a ResolverArenas<'a>)
1180+
pub fn new(session: &'a Session,
1181+
make_glob_map: MakeGlobMap,
1182+
macro_loader: &'a mut MacroLoader,
1183+
arenas: &'a ResolverArenas<'a>)
11701184
-> Resolver<'a> {
11711185
let root_def_id = DefId::local(CRATE_DEF_INDEX);
11721186
let graph_root =
@@ -1227,6 +1241,8 @@ impl<'a> Resolver<'a> {
12271241
vis: ty::Visibility::Public,
12281242
}),
12291243
new_import_semantics: session.features.borrow().item_like_imports,
1244+
1245+
macro_loader: macro_loader,
12301246
}
12311247
}
12321248

src/libsyntax/ext/base.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ fn initial_syntax_expander_table<'feat>(ecfg: &expand::ExpansionConfig<'feat>)
546546
syntax_expanders
547547
}
548548

549-
pub trait MacroLoader {
549+
pub trait Resolver {
550550
fn load_crate(&mut self, extern_crate: &ast::Item, allows_macros: bool)
551551
-> Vec<LoadedMacro>;
552552
}
@@ -556,8 +556,8 @@ pub enum LoadedMacro {
556556
CustomDerive(String, Box<MultiItemModifier>),
557557
}
558558

559-
pub struct DummyMacroLoader;
560-
impl MacroLoader for DummyMacroLoader {
559+
pub struct DummyResolver;
560+
impl Resolver for DummyResolver {
561561
fn load_crate(&mut self, _: &ast::Item, _: bool) -> Vec<LoadedMacro> {
562562
Vec::new()
563563
}
@@ -572,7 +572,7 @@ pub struct ExtCtxt<'a> {
572572
pub backtrace: ExpnId,
573573
pub ecfg: expand::ExpansionConfig<'a>,
574574
pub crate_root: Option<&'static str>,
575-
pub loader: &'a mut MacroLoader,
575+
pub resolver: &'a mut Resolver,
576576

577577
pub exported_macros: Vec<ast::MacroDef>,
578578

@@ -584,7 +584,7 @@ pub struct ExtCtxt<'a> {
584584
impl<'a> ExtCtxt<'a> {
585585
pub fn new(parse_sess: &'a parse::ParseSess, cfg: ast::CrateConfig,
586586
ecfg: expand::ExpansionConfig<'a>,
587-
loader: &'a mut MacroLoader)
587+
resolver: &'a mut Resolver)
588588
-> ExtCtxt<'a> {
589589
ExtCtxt {
590590
syntax_env: initial_syntax_expander_table(&ecfg),
@@ -594,7 +594,7 @@ impl<'a> ExtCtxt<'a> {
594594
ecfg: ecfg,
595595
crate_root: None,
596596
exported_macros: Vec::new(),
597-
loader: loader,
597+
resolver: resolver,
598598
derive_modes: HashMap::new(),
599599
recursion_count: 0,
600600
}

src/libsyntax/ext/expand.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
644644
// We need to error on `#[macro_use] extern crate` when it isn't at the
645645
// crate root, because `$crate` won't work properly.
646646
let is_crate_root = self.cx.syntax_env.is_crate_root();
647-
for def in self.cx.loader.load_crate(&*item, is_crate_root) {
647+
for def in self.cx.resolver.load_crate(&*item, is_crate_root) {
648648
match def {
649649
LoadedMacro::Def(def) => self.cx.insert_macro(def),
650650
LoadedMacro::CustomDerive(name, ext) => {
@@ -809,7 +809,7 @@ fn mark_tts(tts: &[TokenTree], m: Mark) -> Vec<TokenTree> {
809809
mod tests {
810810
use super::{expand_crate, ExpansionConfig};
811811
use ast;
812-
use ext::base::{ExtCtxt, DummyMacroLoader};
812+
use ext::base::{ExtCtxt, DummyResolver};
813813
use parse;
814814
use util::parser_testing::{string_to_parser};
815815
use visit;
@@ -850,7 +850,7 @@ mod tests {
850850
src,
851851
Vec::new(), &sess).unwrap();
852852
// should fail:
853-
let mut loader = DummyMacroLoader;
853+
let mut loader = DummyResolver;
854854
let mut ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut loader);
855855
expand_crate(&mut ecx, vec![], crate_ast);
856856
}
@@ -865,7 +865,7 @@ mod tests {
865865
"<test>".to_string(),
866866
src,
867867
Vec::new(), &sess).unwrap();
868-
let mut loader = DummyMacroLoader;
868+
let mut loader = DummyResolver;
869869
let mut ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut loader);
870870
expand_crate(&mut ecx, vec![], crate_ast);
871871
}
@@ -879,7 +879,7 @@ mod tests {
879879
"<test>".to_string(),
880880
src,
881881
Vec::new(), &sess).unwrap();
882-
let mut loader = DummyMacroLoader;
882+
let mut loader = DummyResolver;
883883
let mut ecx = ExtCtxt::new(&sess, vec![], test_ecfg(), &mut loader);
884884
expand_crate(&mut ecx, vec![], crate_ast);
885885
}
@@ -888,7 +888,7 @@ mod tests {
888888
let ps = parse::ParseSess::new();
889889
let crate_ast = panictry!(string_to_parser(&ps, crate_str).parse_crate_mod());
890890
// the cfg argument actually does matter, here...
891-
let mut loader = DummyMacroLoader;
891+
let mut loader = DummyResolver;
892892
let mut ecx = ExtCtxt::new(&ps, vec![], test_ecfg(), &mut loader);
893893
expand_crate(&mut ecx, vec![], crate_ast)
894894
}

src/libsyntax/test.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use errors;
2828
use errors::snippet::{SnippetData};
2929
use config;
3030
use entry::{self, EntryPointType};
31-
use ext::base::{ExtCtxt, DummyMacroLoader};
31+
use ext::base::{ExtCtxt, DummyResolver};
3232
use ext::build::AstBuilder;
3333
use ext::expand::ExpansionConfig;
3434
use fold::Folder;
@@ -276,13 +276,13 @@ fn generate_test_harness(sess: &ParseSess,
276276
let mut cleaner = EntryPointCleaner { depth: 0 };
277277
let krate = cleaner.fold_crate(krate);
278278

279-
let mut loader = DummyMacroLoader;
279+
let mut resolver = DummyResolver;
280280
let mut cx: TestCtxt = TestCtxt {
281281
sess: sess,
282282
span_diagnostic: sd,
283283
ext_cx: ExtCtxt::new(sess, vec![],
284284
ExpansionConfig::default("test".to_string()),
285-
&mut loader),
285+
&mut resolver),
286286
path: Vec::new(),
287287
testfns: Vec::new(),
288288
reexport_test_harness_main: reexport_test_harness_main,

src/libsyntax_ext/rustc_macro_registrar.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::mem;
1313
use errors;
1414
use syntax::ast::{self, Ident, NodeId};
1515
use syntax::codemap::{ExpnInfo, NameAndSpan, MacroAttribute};
16-
use syntax::ext::base::{ExtCtxt, DummyMacroLoader};
16+
use syntax::ext::base::{ExtCtxt, DummyResolver};
1717
use syntax::ext::build::AstBuilder;
1818
use syntax::ext::expand::ExpansionConfig;
1919
use syntax::parse::ParseSess;
@@ -44,7 +44,7 @@ pub fn modify(sess: &ParseSess,
4444
num_crate_types: usize,
4545
handler: &errors::Handler,
4646
features: &Features) -> ast::Crate {
47-
let mut loader = DummyMacroLoader;
47+
let mut loader = DummyResolver;
4848
let mut cx = ExtCtxt::new(sess,
4949
Vec::new(),
5050
ExpansionConfig::default("rustc_macro".to_string()),

src/test/compile-fail-fulldeps/qquote.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ use syntax_pos::DUMMY_SP;
2222

2323
fn main() {
2424
let ps = syntax::parse::ParseSess::new();
25-
let mut loader = syntax::ext::base::DummyMacroLoader;
25+
let mut resolver = syntax::ext::base::DummyResolver;
2626
let mut cx = syntax::ext::base::ExtCtxt::new(
2727
&ps, vec![],
2828
syntax::ext::expand::ExpansionConfig::default("qquote".to_string()),
29-
&mut loader);
29+
&mut resolver);
3030
cx.bt_push(syntax::codemap::ExpnInfo {
3131
call_site: DUMMY_SP,
3232
callee: syntax::codemap::NameAndSpan {

src/test/run-fail-fulldeps/qquote.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ use syntax_pos::DUMMY_SP;
2525

2626
fn main() {
2727
let ps = syntax::parse::ParseSess::new();
28-
let mut loader = syntax::ext::base::DummyMacroLoader;
28+
let mut resolver = syntax::ext::base::DummyResolver;
2929
let mut cx = syntax::ext::base::ExtCtxt::new(
3030
&ps, vec![],
3131
syntax::ext::expand::ExpansionConfig::default("qquote".to_string()),
32-
&mut loader);
32+
&mut resolver);
3333
cx.bt_push(syntax::codemap::ExpnInfo {
3434
call_site: DUMMY_SP,
3535
callee: syntax::codemap::NameAndSpan {

src/test/run-pass-fulldeps/qquote.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ use syntax_pos::DUMMY_SP;
2121

2222
fn main() {
2323
let ps = syntax::parse::ParseSess::new();
24-
let mut loader = syntax::ext::base::DummyMacroLoader;
24+
let mut resolver = syntax::ext::base::DummyResolver;
2525
let mut cx = syntax::ext::base::ExtCtxt::new(
2626
&ps, vec![],
2727
syntax::ext::expand::ExpansionConfig::default("qquote".to_string()),
28-
&mut loader);
28+
&mut resolver);
2929
cx.bt_push(syntax::codemap::ExpnInfo {
3030
call_site: DUMMY_SP,
3131
callee: syntax::codemap::NameAndSpan {

0 commit comments

Comments
 (0)