@@ -206,7 +206,8 @@ pub fn compile_input(sess: &Session,
206206 None
207207 } ;
208208
209- phase_3_run_analysis_passes ( sess,
209+ phase_3_run_analysis_passes ( control,
210+ sess,
210211 cstore,
211212 hir_map,
212213 analysis,
@@ -347,6 +348,13 @@ pub struct CompileController<'a> {
347348 pub keep_ast : bool ,
348349 // -Zcontinue-parse-after-error
349350 pub continue_parse_after_error : bool ,
351+
352+ /// Allows overriding default rustc query providers,
353+ /// after `default_provide` has installed them.
354+ pub provide : Box < Fn ( & mut ty:: maps:: Providers ) + ' a > ,
355+ /// Same as `provide`, but only for non-local crates,
356+ /// applied after `default_provide_extern`.
357+ pub provide_extern : Box < Fn ( & mut ty:: maps:: Providers ) + ' a > ,
350358}
351359
352360impl < ' a > CompileController < ' a > {
@@ -361,6 +369,8 @@ impl<'a> CompileController<'a> {
361369 make_glob_map : MakeGlobMap :: No ,
362370 keep_ast : false ,
363371 continue_parse_after_error : false ,
372+ provide : box |_| { } ,
373+ provide_extern : box |_| { } ,
364374 }
365375 }
366376}
@@ -906,10 +916,33 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session,
906916 } )
907917}
908918
919+ pub fn default_provide ( providers : & mut ty:: maps:: Providers ) {
920+ borrowck:: provide ( providers) ;
921+ mir:: provide ( providers) ;
922+ reachable:: provide ( providers) ;
923+ rustc_privacy:: provide ( providers) ;
924+ DefaultTransCrate :: provide ( providers) ;
925+ typeck:: provide ( providers) ;
926+ ty:: provide ( providers) ;
927+ traits:: provide ( providers) ;
928+ reachable:: provide ( providers) ;
929+ rustc_const_eval:: provide ( providers) ;
930+ rustc_passes:: provide ( providers) ;
931+ middle:: region:: provide ( providers) ;
932+ cstore:: provide ( providers) ;
933+ lint:: provide ( providers) ;
934+ }
935+
936+ pub fn default_provide_extern ( providers : & mut ty:: maps:: Providers ) {
937+ cstore:: provide_extern ( providers) ;
938+ DefaultTransCrate :: provide_extern ( providers) ;
939+ }
940+
909941/// Run the resolution, typechecking, region checking and other
910942/// miscellaneous analysis passes on the crate. Return various
911943/// structures carrying the results of the analysis.
912- pub fn phase_3_run_analysis_passes < ' tcx , F , R > ( sess : & ' tcx Session ,
944+ pub fn phase_3_run_analysis_passes < ' tcx , F , R > ( control : & CompileController ,
945+ sess : & ' tcx Session ,
913946 cstore : & ' tcx CrateStore ,
914947 hir_map : hir_map:: Map < ' tcx > ,
915948 mut analysis : ty:: CrateAnalysis ,
@@ -965,28 +998,12 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
965998 || static_recursion:: check_crate ( sess, & hir_map) ) ?;
966999
9671000 let mut local_providers = ty:: maps:: Providers :: default ( ) ;
968- borrowck:: provide ( & mut local_providers) ;
969- mir:: provide ( & mut local_providers) ;
970- reachable:: provide ( & mut local_providers) ;
971- rustc_privacy:: provide ( & mut local_providers) ;
972- DefaultTransCrate :: provide_local ( & mut local_providers) ;
973- typeck:: provide ( & mut local_providers) ;
974- ty:: provide ( & mut local_providers) ;
975- traits:: provide ( & mut local_providers) ;
976- reachable:: provide ( & mut local_providers) ;
977- rustc_const_eval:: provide ( & mut local_providers) ;
978- rustc_passes:: provide ( & mut local_providers) ;
979- middle:: region:: provide ( & mut local_providers) ;
980- cstore:: provide_local ( & mut local_providers) ;
981- lint:: provide ( & mut local_providers) ;
982-
983- let mut extern_providers = ty:: maps:: Providers :: default ( ) ;
984- cstore:: provide ( & mut extern_providers) ;
985- DefaultTransCrate :: provide_extern ( & mut extern_providers) ;
986- ty:: provide_extern ( & mut extern_providers) ;
987- traits:: provide_extern ( & mut extern_providers) ;
988- // FIXME(eddyb) get rid of this once we replace const_eval with miri.
989- rustc_const_eval:: provide ( & mut extern_providers) ;
1001+ default_provide ( & mut local_providers) ;
1002+ ( control. provide ) ( & mut local_providers) ;
1003+
1004+ let mut extern_providers = local_providers;
1005+ default_provide_extern ( & mut extern_providers) ;
1006+ ( control. provide_extern ) ( & mut extern_providers) ;
9901007
9911008 let ( tx, rx) = mpsc:: channel ( ) ;
9921009
0 commit comments