From d7ab3c77b3259e25e15d77b6939af4ba8d3be4c0 Mon Sep 17 00:00:00 2001 From: hyd-dev Date: Mon, 15 Mar 2021 17:57:53 +0800 Subject: [PATCH 1/4] Add `rustc_interface::interface::Config::parse_sess_created` --- compiler/rustc_driver/src/lib.rs | 2 ++ compiler/rustc_interface/src/interface.rs | 9 ++++++++- src/librustdoc/core.rs | 1 + src/librustdoc/doctest.rs | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_driver/src/lib.rs b/compiler/rustc_driver/src/lib.rs index 79bb21b29fc..25a78041c00 100644 --- a/compiler/rustc_driver/src/lib.rs +++ b/compiler/rustc_driver/src/lib.rs @@ -215,6 +215,7 @@ fn run_compiler( diagnostic_output, stderr: None, lint_caps: Default::default(), + parse_sess_created: None, register_lints: None, override_queries: None, make_codegen_backend: make_codegen_backend.take().unwrap(), @@ -298,6 +299,7 @@ fn run_compiler( diagnostic_output, stderr: None, lint_caps: Default::default(), + parse_sess_created: None, register_lints: None, override_queries: None, make_codegen_backend: make_codegen_backend.unwrap(), diff --git a/compiler/rustc_interface/src/interface.rs b/compiler/rustc_interface/src/interface.rs index 502e7155c2e..14bffb54e7a 100644 --- a/compiler/rustc_interface/src/interface.rs +++ b/compiler/rustc_interface/src/interface.rs @@ -142,6 +142,9 @@ pub struct Config { pub lint_caps: FxHashMap, + /// This is a callback from the driver that is called when [`ParseSess`] is created. + pub parse_sess_created: Option>, + /// This is a callback from the driver that is called when we're registering lints; /// it is called during plugin registration when we have the LintStore in a non-shared state. /// @@ -166,7 +169,7 @@ pub struct Config { pub fn create_compiler_and_run(config: Config, f: impl FnOnce(&Compiler) -> R) -> R { let registry = &config.registry; - let (sess, codegen_backend) = util::create_session( + let (mut sess, codegen_backend) = util::create_session( config.opts, config.crate_cfg, config.diagnostic_output, @@ -177,6 +180,10 @@ pub fn create_compiler_and_run(config: Config, f: impl FnOnce(&Compiler) -> R registry.clone(), ); + if let Some(parse_sess_created) = config.parse_sess_created { + parse_sess_created(&mut Lrc::get_mut(&mut sess).unwrap().parse_sess); + } + let compiler = Compiler { sess, codegen_backend, diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index e9c32396e84..c5b5ab0f3d0 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -311,6 +311,7 @@ crate fn create_config( diagnostic_output: DiagnosticOutput::Default, stderr: None, lint_caps, + parse_sess_created: None, register_lints: Some(box crate::lint::register_lints), override_queries: Some(|_sess, providers, _external_providers| { // Most lints will require typechecking, so just don't run them. diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs index 64375964e70..80e2e23eadd 100644 --- a/src/librustdoc/doctest.rs +++ b/src/librustdoc/doctest.rs @@ -95,6 +95,7 @@ crate fn run(options: Options) -> Result<(), ErrorReported> { diagnostic_output: DiagnosticOutput::Default, stderr: None, lint_caps, + parse_sess_created: None, register_lints: Some(box crate::lint::register_lints), override_queries: None, make_codegen_backend: None, From 176bb6bd38dc73557dc6947077f7239dda7b64ef Mon Sep 17 00:00:00 2001 From: hyd-dev Date: Mon, 15 Mar 2021 18:24:28 +0800 Subject: [PATCH 2/4] Use `rustc_interface::interface::Config::parse_sess_created` in Clippy --- src/tools/clippy/src/driver.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/tools/clippy/src/driver.rs b/src/tools/clippy/src/driver.rs index 30272c9b800..b6aed862e89 100644 --- a/src/tools/clippy/src/driver.rs +++ b/src/tools/clippy/src/driver.rs @@ -15,7 +15,7 @@ extern crate rustc_session; extern crate rustc_span; use rustc_interface::interface; -use rustc_session::Session; +use rustc_session::parse::ParseSess; use rustc_span::symbol::Symbol; use rustc_tools_util::VersionInfo; @@ -63,8 +63,8 @@ fn test_arg_value() { assert_eq!(arg_value(args, "--foo", |_| true), None); } -fn track_clippy_args(sess: &Session, args_env_var: &Option) { - sess.parse_sess.env_depinfo.borrow_mut().insert(( +fn track_clippy_args(parse_sess: &mut ParseSess, args_env_var: &Option) { + parse_sess.env_depinfo.get_mut().insert(( Symbol::intern("CLIPPY_ARGS"), args_env_var.as_deref().map(Symbol::intern), )); @@ -81,14 +81,9 @@ struct RustcCallbacks { impl rustc_driver::Callbacks for RustcCallbacks { fn config(&mut self, config: &mut interface::Config) { - let previous = config.register_lints.take(); let clippy_args_var = self.clippy_args_var.take(); - config.register_lints = Some(Box::new(move |sess, lint_store| { - if let Some(ref previous) = previous { - (previous)(sess, lint_store); - } - - track_clippy_args(sess, &clippy_args_var); + config.parse_sess_created = Some(Box::new(move |parse_sess| { + track_clippy_args(parse_sess, &clippy_args_var); })); } } @@ -101,6 +96,9 @@ impl rustc_driver::Callbacks for ClippyCallbacks { fn config(&mut self, config: &mut interface::Config) { let previous = config.register_lints.take(); let clippy_args_var = self.clippy_args_var.take(); + config.parse_sess_created = Some(Box::new(move |parse_sess| { + track_clippy_args(parse_sess, &clippy_args_var); + })); config.register_lints = Some(Box::new(move |sess, mut lint_store| { // technically we're ~guaranteed that this is none but might as well call anything that // is there already. Certainly it can't hurt. @@ -108,8 +106,6 @@ impl rustc_driver::Callbacks for ClippyCallbacks { (previous)(sess, lint_store); } - track_clippy_args(sess, &clippy_args_var); - let conf = clippy_lints::read_conf(&[], &sess); clippy_lints::register_plugins(&mut lint_store, &sess, &conf); clippy_lints::register_pre_expansion_lints(&mut lint_store); From 4709dcd476540621f7fb023ae68b4f916d857278 Mon Sep 17 00:00:00 2001 From: hyd-dev Date: Mon, 15 Mar 2021 20:44:48 +0800 Subject: [PATCH 3/4] Change the `.unwrap` to `.expect` with a helpful message --- compiler/rustc_interface/src/interface.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_interface/src/interface.rs b/compiler/rustc_interface/src/interface.rs index 14bffb54e7a..a1090ee316d 100644 --- a/compiler/rustc_interface/src/interface.rs +++ b/compiler/rustc_interface/src/interface.rs @@ -181,7 +181,11 @@ pub fn create_compiler_and_run(config: Config, f: impl FnOnce(&Compiler) -> R ); if let Some(parse_sess_created) = config.parse_sess_created { - parse_sess_created(&mut Lrc::get_mut(&mut sess).unwrap().parse_sess); + parse_sess_created( + &mut Lrc::get_mut(&mut sess) + .expect("create_session() should never share the returned session") + .parse_sess, + ); } let compiler = Compiler { From 0bbfd548ecf48e17c9db43160aa3784caa2fcd47 Mon Sep 17 00:00:00 2001 From: hyd-dev Date: Mon, 15 Mar 2021 21:16:39 +0800 Subject: [PATCH 4/4] Fix `src/test/run-make-fulldeps/issue-19371` --- src/test/run-make-fulldeps/issue-19371/foo.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/run-make-fulldeps/issue-19371/foo.rs b/src/test/run-make-fulldeps/issue-19371/foo.rs index fdd7e8b24c5..4acabbb70ed 100644 --- a/src/test/run-make-fulldeps/issue-19371/foo.rs +++ b/src/test/run-make-fulldeps/issue-19371/foo.rs @@ -57,6 +57,7 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) { diagnostic_output: DiagnosticOutput::Default, stderr: None, lint_caps: Default::default(), + parse_sess_created: None, register_lints: None, override_queries: None, make_codegen_backend: None,