diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2017-11-12 18:20:38 +0200 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2017-11-12 18:20:38 +0200 |
| commit | 0ac6c3aacbf70d24a5e13b648e650dffec699952 (patch) | |
| tree | 5dd572f2bfa8f17f183ba7a24fedc7195eefb750 | |
| parent | 18b3a9a09916da9efc64af0b265ea576d9113ae9 (diff) | |
| download | rust-0ac6c3aacbf70d24a5e13b648e650dffec699952.tar.gz rust-0ac6c3aacbf70d24a5e13b648e650dffec699952.zip | |
rustc_driver: expose a way to override query providers in CompileController.
| -rw-r--r-- | src/librustc_driver/driver.rs | 57 | ||||
| -rw-r--r-- | src/librustc_driver/pretty.rs | 8 | ||||
| -rw-r--r-- | src/librustdoc/core.rs | 9 |
3 files changed, 50 insertions, 24 deletions
diff --git a/src/librustc_driver/driver.rs b/src/librustc_driver/driver.rs index 640e80c04b9..ba1c6f2b15f 100644 --- a/src/librustc_driver/driver.rs +++ b/src/librustc_driver/driver.rs @@ -207,7 +207,8 @@ pub fn compile_input(sess: &Session, None }; - phase_3_run_analysis_passes(sess, + phase_3_run_analysis_passes(control, + sess, cstore, hir_map, analysis, @@ -348,6 +349,13 @@ pub struct CompileController<'a> { pub keep_ast: bool, // -Zcontinue-parse-after-error pub continue_parse_after_error: bool, + + /// Allows overriding default rustc query providers, + /// after `default_provide` has installed them. + pub provide: Box<Fn(&mut ty::maps::Providers) + 'a>, + /// Same as `provide`, but only for non-local crates, + /// applied after `default_provide_extern`. + pub provide_extern: Box<Fn(&mut ty::maps::Providers) + 'a>, } impl<'a> CompileController<'a> { @@ -362,6 +370,8 @@ impl<'a> CompileController<'a> { make_glob_map: MakeGlobMap::No, keep_ast: false, continue_parse_after_error: false, + provide: box |_| {}, + provide_extern: box |_| {}, } } } @@ -907,10 +917,33 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session, }) } +pub fn default_provide(providers: &mut ty::maps::Providers) { + borrowck::provide(providers); + mir::provide(providers); + reachable::provide(providers); + rustc_privacy::provide(providers); + DefaultTransCrate::provide(providers); + typeck::provide(providers); + ty::provide(providers); + traits::provide(providers); + reachable::provide(providers); + rustc_const_eval::provide(providers); + rustc_passes::provide(providers); + middle::region::provide(providers); + cstore::provide(providers); + lint::provide(providers); +} + +pub fn default_provide_extern(providers: &mut ty::maps::Providers) { + cstore::provide_extern(providers); + DefaultTransCrate::provide_extern(providers); +} + /// Run the resolution, typechecking, region checking and other /// miscellaneous analysis passes on the crate. Return various /// structures carrying the results of the analysis. -pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session, +pub fn phase_3_run_analysis_passes<'tcx, F, R>(control: &CompileController, + sess: &'tcx Session, cstore: &'tcx CrateStore, hir_map: hir_map::Map<'tcx>, mut analysis: ty::CrateAnalysis, @@ -966,24 +999,12 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session, || static_recursion::check_crate(sess, &hir_map))?; let mut local_providers = ty::maps::Providers::default(); - borrowck::provide(&mut local_providers); - mir::provide(&mut local_providers); - reachable::provide(&mut local_providers); - rustc_privacy::provide(&mut local_providers); - DefaultTransCrate::provide(&mut local_providers); - typeck::provide(&mut local_providers); - ty::provide(&mut local_providers); - traits::provide(&mut local_providers); - reachable::provide(&mut local_providers); - rustc_const_eval::provide(&mut local_providers); - rustc_passes::provide(&mut local_providers); - middle::region::provide(&mut local_providers); - cstore::provide(&mut local_providers); - lint::provide(&mut local_providers); + default_provide(&mut local_providers); + (control.provide)(&mut local_providers); let mut extern_providers = local_providers; - cstore::provide_extern(&mut extern_providers); - DefaultTransCrate::provide_extern(&mut extern_providers); + default_provide_extern(&mut extern_providers); + (control.provide_extern)(&mut extern_providers); // Setup the MIR passes that we want to run. let mut passes = Passes::new(); diff --git a/src/librustc_driver/pretty.rs b/src/librustc_driver/pretty.rs index e6d89f77f21..85ccacb43fb 100644 --- a/src/librustc_driver/pretty.rs +++ b/src/librustc_driver/pretty.rs @@ -227,7 +227,9 @@ impl PpSourceMode { f(&annotation, hir_map.forest.krate()) } PpmTyped => { - abort_on_err(driver::phase_3_run_analysis_passes(sess, + let control = &driver::CompileController::basic(); + abort_on_err(driver::phase_3_run_analysis_passes(control, + sess, cstore, hir_map.clone(), analysis.clone(), @@ -1036,7 +1038,9 @@ fn print_with_analysis<'tcx, 'a: 'tcx>(sess: &'a Session, let mut out = Vec::new(); - abort_on_err(driver::phase_3_run_analysis_passes(sess, + let control = &driver::CompileController::basic(); + abort_on_err(driver::phase_3_run_analysis_passes(control, + sess, cstore, hir_map.clone(), analysis.clone(), diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 2ecb7b546fc..9172bfcde3f 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -154,9 +154,9 @@ pub fn run_core(search_paths: SearchPaths, target_features::add_configuration(&mut cfg, &sess); sess.parse_sess.config = cfg; - let krate = panictry!(driver::phase_1_parse_input(&driver::CompileController::basic(), - &sess, - &input)); + let control = &driver::CompileController::basic(); + + let krate = panictry!(driver::phase_1_parse_input(control, &sess, &input)); let krate = ReplaceBodyWithLoop::new().fold_crate(krate); let name = link::find_crate_name(Some(&sess), &krate.attrs, &input); @@ -182,7 +182,8 @@ pub fn run_core(search_paths: SearchPaths, &[], &sess); - abort_on_err(driver::phase_3_run_analysis_passes(&sess, + abort_on_err(driver::phase_3_run_analysis_passes(control, + &sess, &*cstore, hir_map, analysis, |
