Add macros from plugins in libsyntax_ext::register_builtins
.
This commit is contained in:
parent
2df25adbed
commit
09e41b6784
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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)),
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user