From 0d4a19c0d113cde4c6cd6baaf6c48efed0113a58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Fri, 1 Feb 2019 23:28:14 +0100 Subject: [PATCH 1/2] Use the new rustc interface --- src/driver.rs | 116 ++++++++++++++++++++++++++------------------------ 1 file changed, 61 insertions(+), 55 deletions(-) diff --git a/src/driver.rs b/src/driver.rs index 93ed964e04df..1430ba70fbee 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -9,9 +9,10 @@ extern crate rustc_driver; #[allow(unused_extern_crates)] extern crate rustc_plugin; -use self::rustc_driver::{driver::CompileController, Compilation}; +#[allow(unused_extern_crates)] +extern crate rustc_interface; -use std::convert::TryInto; +use rustc_interface::interface; use std::path::Path; use std::process::{exit, Command}; @@ -60,10 +61,58 @@ fn test_arg_value() { } #[allow(clippy::too_many_lines)] + +struct ClippyCallbacks; + +impl rustc_driver::Callbacks for ClippyCallbacks { + fn after_parsing(&mut self, compiler: &interface::Compiler) -> bool { + let sess = compiler.session(); + let mut registry = rustc_plugin::registry::Registry::new( + sess, + compiler.parse().expect( + "at this compilation stage \ + the crate must be parsed", + ).peek().span, + ); + registry.args_hidden = Some(Vec::new()); + + let conf = clippy_lints::read_conf(®istry); + clippy_lints::register_plugins(&mut registry, &conf); + + let rustc_plugin::registry::Registry { + early_lint_passes, + late_lint_passes, + lint_groups, + llvm_passes, + attributes, + .. + } = registry; + let mut ls = sess.lint_store.borrow_mut(); + for pass in early_lint_passes { + ls.register_early_pass(Some(sess), true, false, pass); + } + for pass in late_lint_passes { + ls.register_late_pass(Some(sess), true, pass); + } + + for (name, (to, deprecated_name)) in lint_groups { + ls.register_group(Some(sess), true, name, deprecated_name, to); + } + clippy_lints::register_pre_expansion_lints(sess, &mut ls, &conf); + clippy_lints::register_renamed(&mut ls); + + sess.plugin_llvm_passes.borrow_mut().extend(llvm_passes); + sess.plugin_attributes.borrow_mut().extend(attributes); + + // Continue execution + true + } +} + pub fn main() { rustc_driver::init_rustc_env_logger(); exit( - rustc_driver::run(move || { + rustc_driver::report_ices_to_stderr_if_any(move || { use std::env; if std::env::args().any(|a| a == "--version" || a == "-V") { @@ -144,58 +193,15 @@ pub fn main() { } } - let mut controller = CompileController::basic(); - if clippy_enabled { - controller.after_parse.callback = Box::new(move |state| { - let mut registry = rustc_plugin::registry::Registry::new( - state.session, - state - .krate - .as_ref() - .expect( - "at this compilation stage \ - the crate must be parsed", - ) - .span, - ); - registry.args_hidden = Some(Vec::new()); - - let conf = clippy_lints::read_conf(®istry); - clippy_lints::register_plugins(&mut registry, &conf); - - let rustc_plugin::registry::Registry { - early_lint_passes, - late_lint_passes, - lint_groups, - llvm_passes, - attributes, - .. - } = registry; - let sess = &state.session; - let mut ls = sess.lint_store.borrow_mut(); - for pass in early_lint_passes { - ls.register_early_pass(Some(sess), true, false, pass); - } - for pass in late_lint_passes { - ls.register_late_pass(Some(sess), true, pass); - } - - for (name, (to, deprecated_name)) in lint_groups { - ls.register_group(Some(sess), true, name, deprecated_name, to); - } - clippy_lints::register_pre_expansion_lints(sess, &mut ls, &conf); - clippy_lints::register_renamed(&mut ls); - - sess.plugin_llvm_passes.borrow_mut().extend(llvm_passes); - sess.plugin_attributes.borrow_mut().extend(attributes); - }); - } - controller.compilation_done.stop = Compilation::Stop; - + let mut clippy = ClippyCallbacks; + let mut default = rustc_driver::DefaultCallbacks; + let callbacks: &mut (dyn rustc_driver::Callbacks + Send) = if clippy_enabled { + &mut clippy + } else { + &mut default + }; let args = args; - rustc_driver::run_compiler(&args, Box::new(controller), None, None) - }) - .try_into() - .expect("exit code too large"), + rustc_driver::run_compiler(&args, callbacks, None, None) + }).and_then(|result| result).is_err() as i32 ) } From 1388f2488e09ae30a32eaf40f83d64c766ffa1e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Sun, 10 Mar 2019 12:00:17 +0100 Subject: [PATCH 2/2] rustfmt --- src/driver.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/driver.rs b/src/driver.rs index 1430ba70fbee..e59256536555 100644 --- a/src/driver.rs +++ b/src/driver.rs @@ -8,9 +8,9 @@ #[allow(unused_extern_crates)] extern crate rustc_driver; #[allow(unused_extern_crates)] -extern crate rustc_plugin; -#[allow(unused_extern_crates)] extern crate rustc_interface; +#[allow(unused_extern_crates)] +extern crate rustc_plugin; use rustc_interface::interface; use std::path::Path; @@ -69,10 +69,14 @@ impl rustc_driver::Callbacks for ClippyCallbacks { let sess = compiler.session(); let mut registry = rustc_plugin::registry::Registry::new( sess, - compiler.parse().expect( - "at this compilation stage \ - the crate must be parsed", - ).peek().span, + compiler + .parse() + .expect( + "at this compilation stage \ + the crate must be parsed", + ) + .peek() + .span, ); registry.args_hidden = Some(Vec::new()); @@ -195,13 +199,12 @@ pub fn main() { let mut clippy = ClippyCallbacks; let mut default = rustc_driver::DefaultCallbacks; - let callbacks: &mut (dyn rustc_driver::Callbacks + Send) = if clippy_enabled { - &mut clippy - } else { - &mut default - }; + let callbacks: &mut (dyn rustc_driver::Callbacks + Send) = + if clippy_enabled { &mut clippy } else { &mut default }; let args = args; rustc_driver::run_compiler(&args, callbacks, None, None) - }).and_then(|result| result).is_err() as i32 + }) + .and_then(|result| result) + .is_err() as i32, ) }