1
1
#![ feature( rustc_private) ]
2
2
#![ feature( once_cell) ]
3
+ #![ feature( bool_to_option) ]
3
4
#![ cfg_attr( feature = "deny-warnings" , deny( warnings) ) ]
4
5
// warn on lints, that are included in `rust-lang/rust`s bootstrap
5
6
#![ warn( rust_2018_idioms, unused_lifetimes) ]
@@ -19,6 +20,7 @@ use rustc_tools_util::VersionInfo;
19
20
20
21
use std:: borrow:: Cow ;
21
22
use std:: env;
23
+ use std:: iter;
22
24
use std:: lazy:: SyncLazy ;
23
25
use std:: ops:: Deref ;
24
26
use std:: panic;
@@ -47,20 +49,6 @@ fn arg_value<'a, T: Deref<Target = str>>(
47
49
None
48
50
}
49
51
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
-
64
52
struct DefaultCallbacks ;
65
53
impl rustc_driver:: Callbacks for DefaultCallbacks { }
66
54
@@ -182,6 +170,28 @@ fn toolchain_path(home: Option<String>, toolchain: Option<String>) -> Option<Pat
182
170
} )
183
171
}
184
172
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
+
185
195
#[ allow( clippy:: too_many_lines) ]
186
196
pub fn main ( ) {
187
197
rustc_driver:: init_rustc_env_logger ( ) ;
@@ -278,20 +288,9 @@ pub fn main() {
278
288
args. extend ( vec ! [ "--sysroot" . into( ) , sys_root] ) ;
279
289
} ;
280
290
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" ) ;
295
294
296
295
// We enable Clippy if one of the following conditions is met
297
296
// - IF Clippy is run on its test suite OR
@@ -304,7 +303,11 @@ pub fn main() {
304
303
305
304
let clippy_enabled = clippy_tests_set || ( !cap_lints_allow && ( !no_deps || in_primary_package) ) ;
306
305
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) ;
308
311
}
309
312
310
313
let mut clippy = ClippyCallbacks ;
@@ -315,3 +318,58 @@ pub fn main() {
315
318
rustc_driver:: RunCompiler :: new ( & args, callbacks) . run ( )
316
319
} ) )
317
320
}
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