Skip to content

Commit 0ac6c3a

Browse files
committed
rustc_driver: expose a way to override query providers in CompileController.
1 parent 18b3a9a commit 0ac6c3a

File tree

3 files changed

+50
-24
lines changed

3 files changed

+50
-24
lines changed

src/librustc_driver/driver.rs

+39-18
Original file line numberDiff line numberDiff line change
@@ -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

353361
impl<'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();

src/librustc_driver/pretty.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,9 @@ impl PpSourceMode {
227227
f(&annotation, hir_map.forest.krate())
228228
}
229229
PpmTyped => {
230-
abort_on_err(driver::phase_3_run_analysis_passes(sess,
230+
let control = &driver::CompileController::basic();
231+
abort_on_err(driver::phase_3_run_analysis_passes(control,
232+
sess,
231233
cstore,
232234
hir_map.clone(),
233235
analysis.clone(),
@@ -1036,7 +1038,9 @@ fn print_with_analysis<'tcx, 'a: 'tcx>(sess: &'a Session,
10361038

10371039
let mut out = Vec::new();
10381040

1039-
abort_on_err(driver::phase_3_run_analysis_passes(sess,
1041+
let control = &driver::CompileController::basic();
1042+
abort_on_err(driver::phase_3_run_analysis_passes(control,
1043+
sess,
10401044
cstore,
10411045
hir_map.clone(),
10421046
analysis.clone(),

src/librustdoc/core.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ pub fn run_core(search_paths: SearchPaths,
154154
target_features::add_configuration(&mut cfg, &sess);
155155
sess.parse_sess.config = cfg;
156156

157-
let krate = panictry!(driver::phase_1_parse_input(&driver::CompileController::basic(),
158-
&sess,
159-
&input));
157+
let control = &driver::CompileController::basic();
158+
159+
let krate = panictry!(driver::phase_1_parse_input(control, &sess, &input));
160160
let krate = ReplaceBodyWithLoop::new().fold_crate(krate);
161161

162162
let name = link::find_crate_name(Some(&sess), &krate.attrs, &input);
@@ -182,7 +182,8 @@ pub fn run_core(search_paths: SearchPaths,
182182
&[],
183183
&sess);
184184

185-
abort_on_err(driver::phase_3_run_analysis_passes(&sess,
185+
abort_on_err(driver::phase_3_run_analysis_passes(control,
186+
&sess,
186187
&*cstore,
187188
hir_map,
188189
analysis,

0 commit comments

Comments
 (0)