@@ -102,6 +102,19 @@ impl LintConfig {
102102            _ => unreachable ! ( "LintConfig can only be called from `clippy` subcommands." ) , 
103103        } 
104104    } 
105+ 
106+     fn  merge ( & self ,  other :  & Self )  -> Self  { 
107+         let  merged = |self_attr :  & [ String ] ,  other_attr :  & [ String ] | -> Vec < String >  { 
108+             self_attr. iter ( ) . cloned ( ) . chain ( other_attr. iter ( ) . cloned ( ) ) . collect ( ) 
109+         } ; 
110+         // This is written this way to ensure we get a compiler error if we add a new field. 
111+         Self  { 
112+             allow :  merged ( & self . allow ,  & other. allow ) , 
113+             warn :  merged ( & self . warn ,  & other. warn ) , 
114+             deny :  merged ( & self . deny ,  & other. deny ) , 
115+             forbid :  merged ( & self . forbid ,  & other. forbid ) , 
116+         } 
117+     } 
105118} 
106119
107120#[ derive( Debug ,  Clone ,  PartialEq ,  Eq ,  Hash ) ]  
@@ -339,3 +352,58 @@ lint_any!(
339352    Tidy ,  "src/tools/tidy" ,  "tidy" ; 
340353    TestFloatParse ,  "src/etc/test-float-parse" ,  "test-float-parse" ; 
341354) ; 
355+ 
356+ #[ derive( Debug ,  Clone ,  PartialEq ,  Eq ,  Hash ) ]  
357+ pub  struct  CI  { 
358+     target :  TargetSelection , 
359+     config :  LintConfig , 
360+ } 
361+ 
362+ impl  Step  for  CI  { 
363+     type  Output  = ( ) ; 
364+     const  DEFAULT :  bool  = false ; 
365+ 
366+     fn  should_run ( run :  ShouldRun < ' _ > )  -> ShouldRun < ' _ >  { 
367+         run. alias ( "ci" ) 
368+     } 
369+ 
370+     fn  make_run ( run :  RunConfig < ' _ > )  { 
371+         let  config = LintConfig :: new ( run. builder ) ; 
372+         run. builder . ensure ( CI  {  target :  run. target ,  config } ) ; 
373+     } 
374+ 
375+     fn  run ( self ,  builder :  & Builder < ' _ > )  -> Self :: Output  { 
376+         builder. ensure ( Bootstrap  { 
377+             target :  self . target , 
378+             config :  self . config . merge ( & LintConfig  { 
379+                 allow :  vec ! [ ] , 
380+                 warn :  vec ! [ ] , 
381+                 deny :  vec ! [ "warnings" . into( ) ] , 
382+                 forbid :  vec ! [ ] , 
383+             } ) , 
384+         } ) ; 
385+         let  library_clippy_cfg = LintConfig  { 
386+             allow :  vec ! [ "clippy::all" . into( ) ] , 
387+             warn :  vec ! [ ] , 
388+             deny :  vec ! [ "clippy::correctness" . into( ) ] , 
389+             forbid :  vec ! [ ] , 
390+         } ; 
391+         let  compiler_clippy_cfg = LintConfig  { 
392+             allow :  vec ! [ "clippy::all" . into( ) ] , 
393+             warn :  vec ! [ ] , 
394+             deny :  vec ! [ "clippy::correctness" . into( ) ,  "clippy::clone_on_ref_ptr" . into( ) ] , 
395+             forbid :  vec ! [ ] , 
396+         } ; 
397+ 
398+         builder. ensure ( Std  { 
399+             target :  self . target , 
400+             config :  self . config . merge ( & library_clippy_cfg) , 
401+             crates :  vec ! [ ] , 
402+         } ) ; 
403+         builder. ensure ( Rustc  { 
404+             target :  self . target , 
405+             config :  self . config . merge ( & compiler_clippy_cfg) , 
406+             crates :  vec ! [ ] , 
407+         } ) ; 
408+     } 
409+ } 
0 commit comments