@@ -206,7 +206,8 @@ pub fn compile_input(sess: &Session,
206
206
None
207
207
} ;
208
208
209
- phase_3_run_analysis_passes ( sess,
209
+ phase_3_run_analysis_passes ( control,
210
+ sess,
210
211
cstore,
211
212
hir_map,
212
213
analysis,
@@ -347,6 +348,13 @@ pub struct CompileController<'a> {
347
348
pub keep_ast : bool ,
348
349
// -Zcontinue-parse-after-error
349
350
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 > ,
350
358
}
351
359
352
360
impl < ' a > CompileController < ' a > {
@@ -361,6 +369,8 @@ impl<'a> CompileController<'a> {
361
369
make_glob_map : MakeGlobMap :: No ,
362
370
keep_ast : false ,
363
371
continue_parse_after_error : false ,
372
+ provide : box |_| { } ,
373
+ provide_extern : box |_| { } ,
364
374
}
365
375
}
366
376
}
@@ -906,10 +916,33 @@ pub fn phase_2_configure_and_expand<F>(sess: &Session,
906
916
} )
907
917
}
908
918
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
+
909
941
/// Run the resolution, typechecking, region checking and other
910
942
/// miscellaneous analysis passes on the crate. Return various
911
943
/// 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 ,
913
946
cstore : & ' tcx CrateStore ,
914
947
hir_map : hir_map:: Map < ' tcx > ,
915
948
mut analysis : ty:: CrateAnalysis ,
@@ -965,28 +998,12 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
965
998
|| static_recursion:: check_crate ( sess, & hir_map) ) ?;
966
999
967
1000
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) ;
990
1007
991
1008
let ( tx, rx) = mpsc:: channel ( ) ;
992
1009
0 commit comments