Add macros from plugins in libsyntax_ext::register_builtins.

This commit is contained in:
Jeffrey Seyfried 2016-09-28 22:48:55 +00:00
parent 2df25adbed
commit 09e41b6784
4 changed files with 21 additions and 23 deletions

View File

@ -649,7 +649,7 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
let resolver_arenas = Resolver::arenas(); let resolver_arenas = Resolver::arenas();
let mut resolver = let mut resolver =
Resolver::new(sess, &krate, make_glob_map, &mut crate_loader, &resolver_arenas); Resolver::new(sess, &krate, make_glob_map, &mut crate_loader, &resolver_arenas);
syntax_ext::register_builtins(&mut resolver, sess.features.borrow().quote); syntax_ext::register_builtins(&mut resolver, syntax_exts, sess.features.borrow().quote);
krate = time(time_passes, "expansion", || { krate = time(time_passes, "expansion", || {
// Windows dlls do not have rpaths, so they don't know how to find their // Windows dlls do not have rpaths, so they don't know how to find their
@ -686,7 +686,7 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
..syntax::ext::expand::ExpansionConfig::default(crate_name.to_string()) ..syntax::ext::expand::ExpansionConfig::default(crate_name.to_string())
}; };
let mut ecx = ExtCtxt::new(&sess.parse_sess, krate.config.clone(), cfg, &mut resolver); let mut ecx = ExtCtxt::new(&sess.parse_sess, krate.config.clone(), cfg, &mut resolver);
let ret = syntax::ext::expand::expand_crate(&mut ecx, syntax_exts, krate); let ret = syntax::ext::expand::expand_crate(&mut ecx, krate);
if cfg!(windows) { if cfg!(windows) {
env::set_var("PATH", &old_path); env::set_var("PATH", &old_path);
} }

View File

@ -738,14 +738,9 @@ impl<'a> ExtCtxt<'a> {
token::intern(st) token::intern(st)
} }
pub fn initialize(&mut self, user_exts: Vec<NamedSyntaxExtension>, krate: &ast::Crate) { pub fn initialize(&mut self, krate: &ast::Crate) {
self.crate_root = std_inject::injected_crate_name(krate); self.crate_root = std_inject::injected_crate_name(krate);
for (name, extension) in user_exts {
let ident = ast::Ident::with_empty_ctxt(name);
self.resolver.add_ext(ident, Rc::new(extension));
}
let mut module = ModuleData { let mut module = ModuleData {
mod_path: vec![token::str_to_ident(&self.ecfg.crate_name)], mod_path: vec![token::str_to_ident(&self.ecfg.crate_name)],
directory: PathBuf::from(self.parse_sess.codemap().span_to_filename(krate.span)), directory: PathBuf::from(self.parse_sess.codemap().span_to_filename(krate.span)),

View File

@ -866,19 +866,15 @@ impl<'feat> ExpansionConfig<'feat> {
} }
} }
pub fn expand_crate(cx: &mut ExtCtxt, pub fn expand_crate(cx: &mut ExtCtxt, c: Crate) -> Crate {
user_exts: Vec<NamedSyntaxExtension>, cx.initialize(&c);
c: Crate) -> Crate {
cx.initialize(user_exts, &c);
cx.monotonic_expander().expand_crate(c) cx.monotonic_expander().expand_crate(c)
} }
// Expands crate using supplied MacroExpander - allows for // Expands crate using supplied MacroExpander - allows for
// non-standard expansion behaviour (e.g. step-wise). // non-standard expansion behaviour (e.g. step-wise).
pub fn expand_crate_with_expander(expander: &mut MacroExpander, pub fn expand_crate_with_expander(expander: &mut MacroExpander, c: Crate) -> Crate {
user_exts: Vec<NamedSyntaxExtension>, expander.cx.initialize(&c);
c: Crate) -> Crate {
expander.cx.initialize(user_exts, &c);
expander.expand_crate(c) expander.expand_crate(c)
} }

View File

@ -50,20 +50,23 @@ pub mod deriving;
use std::rc::Rc; use std::rc::Rc;
use syntax::ast; use syntax::ast;
use syntax::ext::base::{MacroExpanderFn, NormalTT, IdentTT, MultiModifier}; use syntax::ext::base::{MacroExpanderFn, NormalTT, IdentTT, MultiModifier, NamedSyntaxExtension};
use syntax::ext::tt::macro_rules::MacroRulesExpander; use syntax::ext::tt::macro_rules::MacroRulesExpander;
use syntax::parse::token::intern; use syntax::parse::token::intern;
pub fn register_builtins(resolver: &mut syntax::ext::base::Resolver, enable_quotes: bool) { pub fn register_builtins(resolver: &mut syntax::ext::base::Resolver,
user_exts: Vec<NamedSyntaxExtension>,
enable_quotes: bool) {
let mut register = |name, ext| { let mut register = |name, ext| {
resolver.add_ext(ast::Ident::with_empty_ctxt(intern(name)), Rc::new(ext)); resolver.add_ext(ast::Ident::with_empty_ctxt(name), Rc::new(ext));
}; };
register("macro_rules", IdentTT(Box::new(MacroRulesExpander), None, false)); register(intern("macro_rules"), IdentTT(Box::new(MacroRulesExpander), None, false));
macro_rules! register { macro_rules! register {
($( $name:ident: $f:expr, )*) => { $( ($( $name:ident: $f:expr, )*) => { $(
register(stringify!($name), NormalTT(Box::new($f as MacroExpanderFn), None, false)); register(intern(stringify!($name)),
NormalTT(Box::new($f as MacroExpanderFn), None, false));
)* } )* }
} }
@ -108,7 +111,11 @@ pub fn register_builtins(resolver: &mut syntax::ext::base::Resolver, enable_quot
} }
// format_args uses `unstable` things internally. // format_args uses `unstable` things internally.
register("format_args", NormalTT(Box::new(format::expand_format_args), None, true)); register(intern("format_args"), NormalTT(Box::new(format::expand_format_args), None, true));
register("derive", MultiModifier(Box::new(deriving::expand_derive))); register(intern("derive"), MultiModifier(Box::new(deriving::expand_derive)));
for (name, ext) in user_exts {
register(name, ext);
}
} }