@@ -207,7 +207,8 @@ pub fn compile_input(sess: &Session,
207207 None
208208 } ;
209209
210- phase_3_run_analysis_passes ( sess,
210+ phase_3_run_analysis_passes ( control,
211+ sess,
211212 cstore,
212213 hir_map,
213214 analysis,
@@ -348,6 +349,13 @@ pub struct CompileController<'a> {
348349 pub keep_ast : bool ,
349350 // -Zcontinue-parse-after-error
350351 pub continue_parse_after_error : bool ,
352+
353+ /// Allows overriding default rustc query providers,
354+ /// after `default_provide` has installed them.
355+ pub provide : Box < Fn ( & mut ty:: maps:: Providers ) + ' a > ,
356+ /// Same as `provide`, but only for non-local crates,
357+ /// applied after `default_provide_extern`.
358+ pub provide_extern : Box < Fn ( & mut ty:: maps:: Providers ) + ' a > ,
351359}
352360
353361impl < ' a > CompileController < ' a > {
@@ -362,6 +370,8 @@ impl<'a> CompileController<'a> {
362370 make_glob_map : MakeGlobMap :: No ,
363371 keep_ast : false ,
364372 continue_parse_after_error : false ,
373+ provide : box |_| { } ,
374+ provide_extern : box |_| { } ,
365375 }
366376 }
367377}
@@ -907,10 +917,33 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session,
907917 } )
908918}
909919
920+ pub fn default_provide ( providers : & mut ty:: maps:: Providers ) {
921+ borrowck:: provide ( providers) ;
922+ mir:: provide ( providers) ;
923+ reachable:: provide ( providers) ;
924+ rustc_privacy:: provide ( providers) ;
925+ DefaultTransCrate :: provide ( providers) ;
926+ typeck:: provide ( providers) ;
927+ ty:: provide ( providers) ;
928+ traits:: provide ( providers) ;
929+ reachable:: provide ( providers) ;
930+ rustc_const_eval:: provide ( providers) ;
931+ rustc_passes:: provide ( providers) ;
932+ middle:: region:: provide ( providers) ;
933+ cstore:: provide ( providers) ;
934+ lint:: provide ( providers) ;
935+ }
936+
937+ pub fn default_provide_extern ( providers : & mut ty:: maps:: Providers ) {
938+ cstore:: provide_extern ( providers) ;
939+ DefaultTransCrate :: provide_extern ( providers) ;
940+ }
941+
910942/// Run the resolution, typechecking, region checking and other
911943/// miscellaneous analysis passes on the crate. Return various
912944/// structures carrying the results of the analysis.
913- pub fn phase_3_run_analysis_passes < ' tcx , F , R > ( sess : & ' tcx Session ,
945+ pub fn phase_3_run_analysis_passes < ' tcx , F , R > ( control : & CompileController ,
946+ sess : & ' tcx Session ,
914947 cstore : & ' tcx CrateStore ,
915948 hir_map : hir_map:: Map < ' tcx > ,
916949 mut analysis : ty:: CrateAnalysis ,
@@ -966,24 +999,12 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
966999 || static_recursion:: check_crate ( sess, & hir_map) ) ?;
9671000
9681001 let mut local_providers = ty:: maps:: Providers :: default ( ) ;
969- borrowck:: provide ( & mut local_providers) ;
970- mir:: provide ( & mut local_providers) ;
971- reachable:: provide ( & mut local_providers) ;
972- rustc_privacy:: provide ( & mut local_providers) ;
973- DefaultTransCrate :: provide ( & mut local_providers) ;
974- typeck:: provide ( & mut local_providers) ;
975- ty:: provide ( & mut local_providers) ;
976- traits:: provide ( & mut local_providers) ;
977- reachable:: provide ( & mut local_providers) ;
978- rustc_const_eval:: provide ( & mut local_providers) ;
979- rustc_passes:: provide ( & mut local_providers) ;
980- middle:: region:: provide ( & mut local_providers) ;
981- cstore:: provide ( & mut local_providers) ;
982- lint:: provide ( & mut local_providers) ;
1002+ default_provide ( & mut local_providers) ;
1003+ ( control. provide ) ( & mut local_providers) ;
9831004
9841005 let mut extern_providers = local_providers;
985- cstore :: provide_extern ( & mut extern_providers) ;
986- DefaultTransCrate :: provide_extern ( & mut extern_providers) ;
1006+ default_provide_extern ( & mut extern_providers) ;
1007+ ( control . provide_extern ) ( & mut extern_providers) ;
9871008
9881009 // Setup the MIR passes that we want to run.
9891010 let mut passes = Passes :: new ( ) ;
0 commit comments