Skip to content

Commit f9f5a88

Browse files
committed
Add a callback that allows compiler consumers to override queries.
1 parent 2a9be46 commit f9f5a88

File tree

6 files changed

+21
-0
lines changed

6 files changed

+21
-0
lines changed

src/librustc_driver/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ pub fn run_compiler(
181181
crate_name: None,
182182
lint_caps: Default::default(),
183183
register_lints: None,
184+
override_queries: None,
184185
};
185186
callbacks.config(&mut config);
186187
config
@@ -259,6 +260,7 @@ pub fn run_compiler(
259260
crate_name: None,
260261
lint_caps: Default::default(),
261262
register_lints: None,
263+
override_queries: None,
262264
};
263265

264266
callbacks.config(&mut config);

src/librustc_interface/interface.rs

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rustc_data_structures::OnDrop;
1212
use rustc_data_structures::sync::Lrc;
1313
use rustc_data_structures::fx::{FxHashSet, FxHashMap};
1414
use rustc_parse::new_parser_from_source_str;
15+
use rustc::ty;
1516
use std::path::PathBuf;
1617
use std::result;
1718
use std::sync::{Arc, Mutex};
@@ -38,6 +39,8 @@ pub struct Compiler {
3839
pub(crate) queries: Queries,
3940
pub(crate) crate_name: Option<String>,
4041
pub(crate) register_lints: Option<Box<dyn Fn(&Session, &mut lint::LintStore) + Send + Sync>>,
42+
pub(crate) override_queries:
43+
Option<fn(&Session, &mut ty::query::Providers<'_>, &mut ty::query::Providers<'_>)>,
4144
}
4245

4346
impl Compiler {
@@ -131,6 +134,13 @@ pub struct Config {
131134
/// Note that if you find a Some here you probably want to call that function in the new
132135
/// function being registered.
133136
pub register_lints: Option<Box<dyn Fn(&Session, &mut lint::LintStore) + Send + Sync>>,
137+
138+
/// This is a callback from the driver that is called just after we have populated
139+
/// the list of queries.
140+
///
141+
/// The second parameter is local providers and the third parameter is external providers.
142+
pub override_queries:
143+
Option<fn(&Session, &mut ty::query::Providers<'_>, &mut ty::query::Providers<'_>)>,
134144
}
135145

136146
pub fn run_compiler_in_existing_thread_pool<F, R>(config: Config, f: F) -> R
@@ -157,6 +167,7 @@ where
157167
queries: Default::default(),
158168
crate_name: config.crate_name,
159169
register_lints: config.register_lints,
170+
override_queries: config.override_queries,
160171
};
161172

162173
let _sess_abort_error = OnDrop(|| {

src/librustc_interface/passes.rs

+5
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,7 @@ pub fn create_global_ctxt(
786786
let codegen_backend = compiler.codegen_backend().clone();
787787
let crate_name = crate_name.to_string();
788788
let defs = mem::take(&mut resolver_outputs.definitions);
789+
let override_queries = compiler.override_queries;
789790

790791
let ((), result) = BoxedGlobalCtxt::new(static move || {
791792
let sess = &*sess;
@@ -810,6 +811,10 @@ pub fn create_global_ctxt(
810811
default_provide_extern(&mut extern_providers);
811812
codegen_backend.provide_extern(&mut extern_providers);
812813

814+
if let Some(callback) = override_queries {
815+
callback(sess, &mut local_providers, &mut extern_providers);
816+
}
817+
813818
let gcx = TyCtxt::create_global_ctxt(
814819
sess,
815820
lint_store,

src/librustdoc/core.rs

+1
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt
335335
crate_name,
336336
lint_caps,
337337
register_lints: None,
338+
override_queries: None,
338339
};
339340

340341
interface::run_compiler_in_existing_thread_pool(config, |compiler| {

src/librustdoc/test.rs

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ pub fn run(options: Options) -> i32 {
7979
crate_name: options.crate_name.clone(),
8080
lint_caps: Default::default(),
8181
register_lints: None,
82+
override_queries: None,
8283
};
8384

8485
let mut test_args = options.test_args.clone();

src/test/run-make-fulldeps/issue-19371/foo.rs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
6060
crate_name: None,
6161
lint_caps: Default::default(),
6262
register_lints: None,
63+
override_queries: None,
6364
};
6465

6566
interface::run_compiler(config, |compiler| {

0 commit comments

Comments
 (0)