Skip to content

Commit 2816c11

Browse files
authored
Rollup merge of rust-lang#83144 - hyd-dev:parse-sess-created, r=oli-obk
Introduce `rustc_interface::interface::Config::parse_sess_created` callback Resolves rust-lang#82900. cc `@oli-obk`
2 parents 13eac5b + 0bbfd54 commit 2816c11

File tree

6 files changed

+25
-13
lines changed

6 files changed

+25
-13
lines changed

compiler/rustc_driver/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ fn run_compiler(
215215
diagnostic_output,
216216
stderr: None,
217217
lint_caps: Default::default(),
218+
parse_sess_created: None,
218219
register_lints: None,
219220
override_queries: None,
220221
make_codegen_backend: make_codegen_backend.take().unwrap(),
@@ -298,6 +299,7 @@ fn run_compiler(
298299
diagnostic_output,
299300
stderr: None,
300301
lint_caps: Default::default(),
302+
parse_sess_created: None,
301303
register_lints: None,
302304
override_queries: None,
303305
make_codegen_backend: make_codegen_backend.unwrap(),

compiler/rustc_interface/src/interface.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,9 @@ pub struct Config {
142142

143143
pub lint_caps: FxHashMap<lint::LintId, lint::Level>,
144144

145+
/// This is a callback from the driver that is called when [`ParseSess`] is created.
146+
pub parse_sess_created: Option<Box<dyn FnOnce(&mut ParseSess) + Send>>,
147+
145148
/// This is a callback from the driver that is called when we're registering lints;
146149
/// it is called during plugin registration when we have the LintStore in a non-shared state.
147150
///
@@ -166,7 +169,7 @@ pub struct Config {
166169

167170
pub fn create_compiler_and_run<R>(config: Config, f: impl FnOnce(&Compiler) -> R) -> R {
168171
let registry = &config.registry;
169-
let (sess, codegen_backend) = util::create_session(
172+
let (mut sess, codegen_backend) = util::create_session(
170173
config.opts,
171174
config.crate_cfg,
172175
config.diagnostic_output,
@@ -177,6 +180,14 @@ pub fn create_compiler_and_run<R>(config: Config, f: impl FnOnce(&Compiler) -> R
177180
registry.clone(),
178181
);
179182

183+
if let Some(parse_sess_created) = config.parse_sess_created {
184+
parse_sess_created(
185+
&mut Lrc::get_mut(&mut sess)
186+
.expect("create_session() should never share the returned session")
187+
.parse_sess,
188+
);
189+
}
190+
180191
let compiler = Compiler {
181192
sess,
182193
codegen_backend,

src/librustdoc/core.rs

+1
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ crate fn create_config(
311311
diagnostic_output: DiagnosticOutput::Default,
312312
stderr: None,
313313
lint_caps,
314+
parse_sess_created: None,
314315
register_lints: Some(box crate::lint::register_lints),
315316
override_queries: Some(|_sess, providers, _external_providers| {
316317
// Most lints will require typechecking, so just don't run them.

src/librustdoc/doctest.rs

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ crate fn run(options: Options) -> Result<(), ErrorReported> {
9595
diagnostic_output: DiagnosticOutput::Default,
9696
stderr: None,
9797
lint_caps,
98+
parse_sess_created: None,
9899
register_lints: Some(box crate::lint::register_lints),
99100
override_queries: None,
100101
make_codegen_backend: None,

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

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) {
5757
diagnostic_output: DiagnosticOutput::Default,
5858
stderr: None,
5959
lint_caps: Default::default(),
60+
parse_sess_created: None,
6061
register_lints: None,
6162
override_queries: None,
6263
make_codegen_backend: None,

src/tools/clippy/src/driver.rs

+8-12
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ extern crate rustc_session;
1515
extern crate rustc_span;
1616

1717
use rustc_interface::interface;
18-
use rustc_session::Session;
18+
use rustc_session::parse::ParseSess;
1919
use rustc_span::symbol::Symbol;
2020
use rustc_tools_util::VersionInfo;
2121

@@ -63,8 +63,8 @@ fn test_arg_value() {
6363
assert_eq!(arg_value(args, "--foo", |_| true), None);
6464
}
6565

66-
fn track_clippy_args(sess: &Session, args_env_var: &Option<String>) {
67-
sess.parse_sess.env_depinfo.borrow_mut().insert((
66+
fn track_clippy_args(parse_sess: &mut ParseSess, args_env_var: &Option<String>) {
67+
parse_sess.env_depinfo.get_mut().insert((
6868
Symbol::intern("CLIPPY_ARGS"),
6969
args_env_var.as_deref().map(Symbol::intern),
7070
));
@@ -81,14 +81,9 @@ struct RustcCallbacks {
8181

8282
impl rustc_driver::Callbacks for RustcCallbacks {
8383
fn config(&mut self, config: &mut interface::Config) {
84-
let previous = config.register_lints.take();
8584
let clippy_args_var = self.clippy_args_var.take();
86-
config.register_lints = Some(Box::new(move |sess, lint_store| {
87-
if let Some(ref previous) = previous {
88-
(previous)(sess, lint_store);
89-
}
90-
91-
track_clippy_args(sess, &clippy_args_var);
85+
config.parse_sess_created = Some(Box::new(move |parse_sess| {
86+
track_clippy_args(parse_sess, &clippy_args_var);
9287
}));
9388
}
9489
}
@@ -101,15 +96,16 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
10196
fn config(&mut self, config: &mut interface::Config) {
10297
let previous = config.register_lints.take();
10398
let clippy_args_var = self.clippy_args_var.take();
99+
config.parse_sess_created = Some(Box::new(move |parse_sess| {
100+
track_clippy_args(parse_sess, &clippy_args_var);
101+
}));
104102
config.register_lints = Some(Box::new(move |sess, mut lint_store| {
105103
// technically we're ~guaranteed that this is none but might as well call anything that
106104
// is there already. Certainly it can't hurt.
107105
if let Some(previous) = &previous {
108106
(previous)(sess, lint_store);
109107
}
110108

111-
track_clippy_args(sess, &clippy_args_var);
112-
113109
let conf = clippy_lints::read_conf(&[], &sess);
114110
clippy_lints::register_plugins(&mut lint_store, &sess, &conf);
115111
clippy_lints::register_pre_expansion_lints(&mut lint_store);

0 commit comments

Comments
 (0)