diff --git a/src/librustc/metadata/creader.rs b/src/librustc/metadata/creader.rs index 2acefd5a8a6..3ab5b0a3bc4 100644 --- a/src/librustc/metadata/creader.rs +++ b/src/librustc/metadata/creader.rs @@ -516,7 +516,7 @@ impl<'a> CrateReader<'a> { } } -#[deriving(Copy)] +#[derive(Copy)] pub enum CrateOrString<'a> { Krate(&'a ast::ViewItem), Str(&'a str) diff --git a/src/librustc/plugin/load.rs b/src/librustc/plugin/load.rs index a94ddf61a55..ef8a89c40fb 100644 --- a/src/librustc/plugin/load.rs +++ b/src/librustc/plugin/load.rs @@ -44,11 +44,11 @@ pub struct Plugins { pub registrars: Vec, } -struct PluginLoader<'a> { +pub struct PluginLoader<'a> { sess: &'a Session, span_whitelist: HashSet, reader: CrateReader<'a>, - plugins: Plugins, + pub plugins: Plugins, } impl<'a> PluginLoader<'a> { @@ -67,7 +67,7 @@ impl<'a> PluginLoader<'a> { /// Read plugin metadata and dynamically load registrar functions. pub fn load_plugins(sess: &Session, krate: &ast::Crate, - addl_plugins: Option) -> Plugins { + addl_plugins: Option>) -> Plugins { let mut loader = PluginLoader::new(sess); // We need to error on `#[macro_use] extern crate` when it isn't at the @@ -79,19 +79,14 @@ pub fn load_plugins(sess: &Session, krate: &ast::Crate, visit::walk_crate(&mut loader, krate); - let mut plugins = loader.plugins; - - match addl_plugins { - Some(addl_plugins) => { - // Add in the additional plugins requested by the frontend - let Plugins { macros: addl_macros, registrars: addl_registrars } = addl_plugins; - plugins.macros.extend(addl_macros.into_iter()); - plugins.registrars.extend(addl_registrars.into_iter()); + if let Some(plugins) = addl_plugins { + for plugin in plugins.iter() { + loader.load_plugin(CrateOrString::Str(plugin.as_slice()), + None, None, None) } - None => () } - return plugins; + return loader.plugins; } // note that macros aren't expanded yet, and therefore macros can't add plugins. @@ -160,7 +155,7 @@ impl<'a, 'v> Visitor<'v> for PluginLoader<'a> { } } - self.load_plugin(CrateOrString::Krate(vi), plugin_attr, macro_selection, reexport) + self.load_plugin(CrateOrString::Krate(vi), plugin_attr, macro_selection, Some(reexport)) } fn visit_mac(&mut self, _: &ast::Mac) { @@ -174,13 +169,13 @@ impl<'a> PluginLoader<'a> { c: CrateOrString<'b>, plugin_attr: Option>, macro_selection: Option>, - reexport: HashSet) { + reexport: Option>) { let mut macros = vec![]; let mut registrar = None; - let load_macros = match macro_selection.as_ref() { - Some(sel) => sel.len() != 0 || reexport.len() != 0, - None => true, + let load_macros = match (macro_selection.as_ref(), reexport.as_ref()) { + (Some(sel), Some(re)) => sel.len() != 0 || re.len() != 0, + _ => true, }; let load_registrar = plugin_attr.is_some(); @@ -207,7 +202,11 @@ impl<'a> PluginLoader<'a> { None => true, Some(sel) => sel.contains(&name), }; - def.export = reexport.contains(&name); + def.export = if let Some(ref re) = reexport { + re.contains(&name) + } else { + false // Don't reexport macros from crates loaded from the command line + }; self.plugins.macros.push(def); } diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index ca24c1f56a0..c506d32fc94 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -574,6 +574,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "Run all passes except translation; no output"), no_analysis: bool = (false, parse_bool, "Parse and expand the source, but run no analysis"), + extra_plugins: Vec = (Vec::new(), parse_list, + "load extra plugins"), unstable_options: bool = (false, parse_bool, "Adds unstable command line options to rustc interface"), print_enum_sizes: bool = (false, parse_bool, diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index c5ade686dfb..c2af4315b06 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -47,7 +47,7 @@ pub fn compile_input(sess: Session, input: &Input, outdir: &Option, output: &Option, - addl_plugins: Option) { + addl_plugins: Option>) { // We need nested scopes here, because the intermediate results can keep // large chunks of memory alive and we want to free them as soon as // possible to keep the peak memory usage low @@ -166,7 +166,7 @@ pub fn phase_1_parse_input(sess: &Session, cfg: ast::CrateConfig, input: &Input) pub fn phase_2_configure_and_expand(sess: &Session, mut krate: ast::Crate, crate_name: &str, - addl_plugins: Option) + addl_plugins: Option>) -> Option { let time_passes = sess.time_passes(); diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index c4ecb6b7b06..da2ec948cc9 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -53,6 +53,7 @@ use rustc::session::config::{Input, PrintRequest, UnstableFeatures}; use rustc::lint::Lint; use rustc::lint; use rustc::metadata; +use rustc::metadata::creader::CrateOrString::Str; use rustc::DIAGNOSTICS; use std::cmp::Ordering::Equal; @@ -185,7 +186,8 @@ fn run_compiler(args: &[String]) { return; } - driver::compile_input(sess, cfg, &input, &odir, &ofile, None); + let plugins = sess.opts.debugging_opts.extra_plugins.clone(); + driver::compile_input(sess, cfg, &input, &odir, &ofile, Some(plugins)); } pub fn get_unstable_features_setting() -> UnstableFeatures {