11#![ feature( rustc_private) ]
22#![ feature( once_cell) ]
3+ #![ feature( bool_to_option) ]
34#![ cfg_attr( feature = "deny-warnings" , deny( warnings) ) ]
45// warn on lints, that are included in `rust-lang/rust`s bootstrap
56#![ warn( rust_2018_idioms, unused_lifetimes) ]
@@ -19,6 +20,7 @@ use rustc_tools_util::VersionInfo;
1920
2021use std:: borrow:: Cow ;
2122use std:: env;
23+ use std:: iter;
2224use std:: lazy:: SyncLazy ;
2325use std:: ops:: Deref ;
2426use std:: panic;
@@ -47,20 +49,6 @@ fn arg_value<'a, T: Deref<Target = str>>(
4749 None
4850}
4951
50- #[ test]
51- fn test_arg_value ( ) {
52- let args = & [ "--bar=bar" , "--foobar" , "123" , "--foo" ] ;
53-
54- assert_eq ! ( arg_value( & [ ] as & [ & str ] , "--foobar" , |_| true ) , None ) ;
55- assert_eq ! ( arg_value( args, "--bar" , |_| false ) , None ) ;
56- assert_eq ! ( arg_value( args, "--bar" , |_| true ) , Some ( "bar" ) ) ;
57- assert_eq ! ( arg_value( args, "--bar" , |p| p == "bar" ) , Some ( "bar" ) ) ;
58- assert_eq ! ( arg_value( args, "--bar" , |p| p == "foo" ) , None ) ;
59- assert_eq ! ( arg_value( args, "--foobar" , |p| p == "foo" ) , None ) ;
60- assert_eq ! ( arg_value( args, "--foobar" , |p| p == "123" ) , Some ( "123" ) ) ;
61- assert_eq ! ( arg_value( args, "--foo" , |_| true ) , None ) ;
62- }
63-
6452struct DefaultCallbacks ;
6553impl rustc_driver:: Callbacks for DefaultCallbacks { }
6654
@@ -182,6 +170,28 @@ fn toolchain_path(home: Option<String>, toolchain: Option<String>) -> Option<Pat
182170 } )
183171}
184172
173+ fn remove_clippy_args < ' a , T , U , I > ( args : & mut Vec < T > , clippy_args : I )
174+ where
175+ T : AsRef < str > ,
176+ U : AsRef < str > + ?Sized + ' a ,
177+ I : Iterator < Item = & ' a U > + Clone ,
178+ {
179+ let args_iter = clippy_args. map ( AsRef :: as_ref) ;
180+ let args_count = args_iter. clone ( ) . count ( ) ;
181+
182+ if args_count > 0 {
183+ if let Some ( start) = args. windows ( args_count) . enumerate ( ) . find_map ( |( current, window) | {
184+ window
185+ . iter ( )
186+ . map ( AsRef :: as_ref)
187+ . eq ( args_iter. clone ( ) )
188+ . then_some ( current)
189+ } ) {
190+ args. drain ( start..start + args_count) ;
191+ }
192+ }
193+ }
194+
185195#[ allow( clippy:: too_many_lines) ]
186196pub fn main ( ) {
187197 rustc_driver:: init_rustc_env_logger ( ) ;
@@ -278,20 +288,9 @@ pub fn main() {
278288 args. extend ( vec ! [ "--sysroot" . into( ) , sys_root] ) ;
279289 } ;
280290
281- let mut no_deps = false ;
282- let clippy_args = env:: var ( "CLIPPY_ARGS" )
283- . unwrap_or_default ( )
284- . split ( "__CLIPPY_HACKERY__" )
285- . filter_map ( |s| match s {
286- "" => None ,
287- "--no-deps" => {
288- no_deps = true ;
289- None
290- } ,
291- _ => Some ( s. to_string ( ) ) ,
292- } )
293- . chain ( vec ! [ "--cfg" . into( ) , r#"feature="cargo-clippy""# . into( ) ] )
294- . collect :: < Vec < String > > ( ) ;
291+ let clippy_args = env:: var ( "CLIPPY_ARGS" ) . unwrap_or_default ( ) ;
292+ let clippy_args = clippy_args. split_whitespace ( ) ;
293+ let no_deps = clippy_args. clone ( ) . any ( |flag| flag == "--no-deps" ) ;
295294
296295 // We enable Clippy if one of the following conditions is met
297296 // - IF Clippy is run on its test suite OR
@@ -304,7 +303,11 @@ pub fn main() {
304303
305304 let clippy_enabled = clippy_tests_set || ( !cap_lints_allow && ( !no_deps || in_primary_package) ) ;
306305 if clippy_enabled {
307- args. extend ( clippy_args) ;
306+ remove_clippy_args ( & mut args, iter:: once ( "--no-deps" ) ) ;
307+ args. extend ( vec ! [ "--cfg" . into( ) , r#"feature="cargo-clippy""# . into( ) ] ) ;
308+ } else {
309+ // Remove all flags passed through RUSTFLAGS if Clippy is not enabled.
310+ remove_clippy_args ( & mut args, clippy_args) ;
308311 }
309312
310313 let mut clippy = ClippyCallbacks ;
@@ -315,3 +318,58 @@ pub fn main() {
315318 rustc_driver:: RunCompiler :: new ( & args, callbacks) . run ( )
316319 } ) )
317320}
321+
322+ #[ cfg( test) ]
323+ mod tests {
324+ use super :: * ;
325+
326+ #[ test]
327+ fn test_arg_value ( ) {
328+ let args = & [ "--bar=bar" , "--foobar" , "123" , "--foo" ] ;
329+
330+ assert_eq ! ( arg_value( & [ ] as & [ & str ] , "--foobar" , |_| true ) , None ) ;
331+ assert_eq ! ( arg_value( args, "--bar" , |_| false ) , None ) ;
332+ assert_eq ! ( arg_value( args, "--bar" , |_| true ) , Some ( "bar" ) ) ;
333+ assert_eq ! ( arg_value( args, "--bar" , |p| p == "bar" ) , Some ( "bar" ) ) ;
334+ assert_eq ! ( arg_value( args, "--bar" , |p| p == "foo" ) , None ) ;
335+ assert_eq ! ( arg_value( args, "--foobar" , |p| p == "foo" ) , None ) ;
336+ assert_eq ! ( arg_value( args, "--foobar" , |p| p == "123" ) , Some ( "123" ) ) ;
337+ assert_eq ! ( arg_value( args, "--foo" , |_| true ) , None ) ;
338+ }
339+
340+ #[ test]
341+ fn removes_clippy_args_from_start ( ) {
342+ let mut args = vec ! [ "-D" , "clippy::await_holding_lock" , "--cfg" , r#"feature="some_feat""# ] ;
343+ let clippy_args = [ "-D" , "clippy::await_holding_lock" ] . iter ( ) ;
344+
345+ remove_clippy_args ( & mut args, clippy_args) ;
346+ assert_eq ! ( args, & [ "--cfg" , r#"feature="some_feat""# ] ) ;
347+ }
348+
349+ #[ test]
350+ fn removes_clippy_args_from_end ( ) {
351+ let mut args = vec ! [ "-Zui-testing" , "-A" , "clippy::empty_loop" , "--no-deps" ] ;
352+ let clippy_args = [ "-A" , "clippy::empty_loop" , "--no-deps" ] . iter ( ) ;
353+
354+ remove_clippy_args ( & mut args, clippy_args) ;
355+ assert_eq ! ( args, & [ "-Zui-testing" ] ) ;
356+ }
357+
358+ #[ test]
359+ fn removes_clippy_args_from_middle ( ) {
360+ let mut args = vec ! [ "-Zui-testing" , "-W" , "clippy::filter_map" , "-L" , "serde" ] ;
361+ let clippy_args = [ "-W" , "clippy::filter_map" ] . iter ( ) ;
362+
363+ remove_clippy_args ( & mut args, clippy_args) ;
364+ assert_eq ! ( args, & [ "-Zui-testing" , "-L" , "serde" ] ) ;
365+ }
366+
367+ #[ test]
368+ fn no_clippy_args_to_remove ( ) {
369+ let mut args = vec ! [ "-Zui-testing" , "-L" , "serde" ] ;
370+ let clippy_args: [ & str ; 0 ] = [ ] ;
371+
372+ remove_clippy_args ( & mut args, clippy_args. iter ( ) ) ;
373+ assert_eq ! ( args, & [ "-Zui-testing" , "-L" , "serde" ] ) ;
374+ }
375+ }
0 commit comments