diff options
| author | bors <bors@rust-lang.org> | 2019-07-19 10:38:09 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-07-19 10:38:09 +0000 |
| commit | 527dce7137f7a3c7bf47d9a503abf25f88ea22de (patch) | |
| tree | 1071f5c012fed4c0d1c47971cce00647f11a0f96 | |
| parent | f9477a77c52af8d3dea361b3f4ac3e60653aa529 (diff) | |
| parent | ff63336b65691f4fd0e339bb74a1798d1f96e86e (diff) | |
Auto merge of #62679 - Xanewok:after-expansion, r=Zoxc
Add an `after_expansion` callback in the driver
To format a given file RLS needs to know the Rust edition associated with it. It's not enough to look at the `edition` key in Cargo.toml - each crate target can have a different edition associated with it so the sure way to fetch a correct edition is to scan the input files used to compile a given crate target.
Right now this was done in the `after_analysis` callback of our shim, however this leads to other problems - if a crate cannot be successfully compiled (e.g. it has a type error) then a callback would not be invoked meaning we can't populate the files -> edition mapping.
However, doing this only after parsing is not enough, since expansion can pull in additional source files (e.g. by invoking `macro_rules! include_my_mod { () => { mod some_mod; }; }`).
Without copy-pasting the entire driver setup it's also not possible to expand the crate ourselves in the `after_parsing` callback - to expand crate we'd need to register plugins and initialize session ourselves. However, this is done normally after executing the callback itself, thus triggering the `Once::set` assertions in `Session::init_features`.
r? @Zoxc
cc @RalfJung @oli-obk this affects public driver interface used by Miri and Clippy
| -rw-r--r-- | src/librustc_driver/lib.rs | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index e615f8a4846..2bc79e5080f 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -105,13 +105,20 @@ pub fn abort_on_err<T>(result: Result<T, ErrorReported>, sess: &Session) -> T { pub trait Callbacks { /// Called before creating the compiler instance fn config(&mut self, _config: &mut interface::Config) {} - /// Called after parsing and returns true to continue execution - fn after_parsing(&mut self, _compiler: &interface::Compiler) -> bool { - true + /// Called after parsing. Return value instructs the compiler whether to + /// continue the compilation afterwards (defaults to `Compilation::Continue`) + fn after_parsing(&mut self, _compiler: &interface::Compiler) -> Compilation { + Compilation::Continue + } + /// Called after expansion. Return value instructs the compiler whether to + /// continue the compilation afterwards (defaults to `Compilation::Continue`) + fn after_expansion(&mut self, _compiler: &interface::Compiler) -> Compilation { + Compilation::Continue } - /// Called after analysis and returns true to continue execution - fn after_analysis(&mut self, _compiler: &interface::Compiler) -> bool { - true + /// Called after analysis. Return value instructs the compiler whether to + /// continue the compilation afterwards (defaults to `Compilation::Continue`) + fn after_analysis(&mut self, _compiler: &interface::Compiler) -> Compilation { + Compilation::Continue } } @@ -294,7 +301,7 @@ pub fn run_compiler( } } - if !callbacks.after_parsing(compiler) { + if callbacks.after_parsing(compiler) == Compilation::Stop { return sess.compile_status(); } @@ -312,6 +319,11 @@ pub fn run_compiler( return sess.compile_status(); } + compiler.expansion()?; + if callbacks.after_expansion(compiler) == Compilation::Stop { + return sess.compile_status(); + } + compiler.prepare_outputs()?; if sess.opts.output_types.contains_key(&OutputType::DepInfo) @@ -355,7 +367,7 @@ pub fn run_compiler( compiler.global_ctxt()?.peek_mut().enter(|tcx| tcx.analysis(LOCAL_CRATE))?; - if !callbacks.after_analysis(compiler) { + if callbacks.after_analysis(compiler) == Compilation::Stop { return sess.compile_status(); } |
