@@ -207,7 +207,8 @@ pub fn compile_input(sess: &Session,
207
207
None
208
208
} ;
209
209
210
- phase_3_run_analysis_passes ( sess,
210
+ phase_3_run_analysis_passes ( control,
211
+ sess,
211
212
cstore,
212
213
hir_map,
213
214
analysis,
@@ -348,6 +349,13 @@ pub struct CompileController<'a> {
348
349
pub keep_ast : bool ,
349
350
// -Zcontinue-parse-after-error
350
351
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 > ,
351
359
}
352
360
353
361
impl < ' a > CompileController < ' a > {
@@ -362,6 +370,8 @@ impl<'a> CompileController<'a> {
362
370
make_glob_map : MakeGlobMap :: No ,
363
371
keep_ast : false ,
364
372
continue_parse_after_error : false ,
373
+ provide : box |_| { } ,
374
+ provide_extern : box |_| { } ,
365
375
}
366
376
}
367
377
}
@@ -907,10 +917,33 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session,
907
917
} )
908
918
}
909
919
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
+
910
942
/// Run the resolution, typechecking, region checking and other
911
943
/// miscellaneous analysis passes on the crate. Return various
912
944
/// 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 ,
914
947
cstore : & ' tcx CrateStore ,
915
948
hir_map : hir_map:: Map < ' tcx > ,
916
949
mut analysis : ty:: CrateAnalysis ,
@@ -966,24 +999,12 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
966
999
|| static_recursion:: check_crate ( sess, & hir_map) ) ?;
967
1000
968
1001
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) ;
983
1004
984
1005
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) ;
987
1008
988
1009
// Setup the MIR passes that we want to run.
989
1010
let mut passes = Passes :: new ( ) ;
0 commit comments