@@ -20,14 +20,12 @@ const IGNORED_RULES_FOR_STD_AND_RUSTC: &[&str] = &[
20
20
"wrong_self_convention" ,
21
21
] ;
22
22
23
- fn lint_args ( builder : & Builder < ' _ > , ignored_rules : & [ & str ] ) -> Vec < String > {
23
+ fn lint_args ( builder : & Builder < ' _ > , config : & LintConfig , ignored_rules : & [ & str ] ) -> Vec < String > {
24
24
fn strings < ' a > ( arr : & ' a [ & str ] ) -> impl Iterator < Item = String > + ' a {
25
25
arr. iter ( ) . copied ( ) . map ( String :: from)
26
26
}
27
27
28
- let Subcommand :: Clippy { fix, allow_dirty, allow_staged, allow, deny, warn, forbid } =
29
- & builder. config . cmd
30
- else {
28
+ let Subcommand :: Clippy { fix, allow_dirty, allow_staged, .. } = & builder. config . cmd else {
31
29
unreachable ! ( "clippy::lint_args can only be called from `clippy` subcommands." ) ;
32
30
} ;
33
31
@@ -53,12 +51,12 @@ fn lint_args(builder: &Builder<'_>, ignored_rules: &[&str]) -> Vec<String> {
53
51
54
52
args. extend ( strings ( & [ "--" ] ) ) ;
55
53
56
- if deny. is_empty ( ) && forbid. is_empty ( ) {
54
+ if config . deny . is_empty ( ) && config . forbid . is_empty ( ) {
57
55
args. extend ( strings ( & [ "--cap-lints" , "warn" ] ) ) ;
58
56
}
59
57
60
58
let all_args = std:: env:: args ( ) . collect :: < Vec < _ > > ( ) ;
61
- args. extend ( get_clippy_rules_in_order ( & all_args, allow , deny , warn , forbid ) ) ;
59
+ args. extend ( get_clippy_rules_in_order ( & all_args, config ) ) ;
62
60
63
61
args. extend ( ignored_rules. iter ( ) . map ( |lint| format ! ( "-Aclippy::{}" , lint) ) ) ;
64
62
args. extend ( builder. config . free_args . clone ( ) ) ;
@@ -68,21 +66,17 @@ fn lint_args(builder: &Builder<'_>, ignored_rules: &[&str]) -> Vec<String> {
68
66
/// We need to keep the order of the given clippy lint rules before passing them.
69
67
/// Since clap doesn't offer any useful interface for this purpose out of the box,
70
68
/// we have to handle it manually.
71
- pub ( crate ) fn get_clippy_rules_in_order (
72
- all_args : & [ String ] ,
73
- allow_rules : & [ String ] ,
74
- deny_rules : & [ String ] ,
75
- warn_rules : & [ String ] ,
76
- forbid_rules : & [ String ] ,
77
- ) -> Vec < String > {
69
+ fn get_clippy_rules_in_order ( all_args : & [ String ] , config : & LintConfig ) -> Vec < String > {
78
70
let mut result = vec ! [ ] ;
79
71
80
72
for ( prefix, item) in
81
- [ ( "-A" , allow_rules ) , ( "-D" , deny_rules ) , ( "-W" , warn_rules ) , ( "-F" , forbid_rules ) ]
73
+ [ ( "-A" , & config . allow ) , ( "-D" , & config . deny ) , ( "-W" , & config . warn ) , ( "-F" , & config . forbid ) ]
82
74
{
83
75
item. iter ( ) . for_each ( |v| {
84
76
let rule = format ! ( "{prefix}{v}" ) ;
85
- let position = all_args. iter ( ) . position ( |t| t == & rule) . unwrap ( ) ;
77
+ // Arguments added by bootstrap in LintConfig won't show up in the all_args list, so
78
+ // put them at the end of the command line.
79
+ let position = all_args. iter ( ) . position ( |t| t == & rule) . unwrap_or ( usize:: MAX ) ;
86
80
result. push ( ( position, rule) ) ;
87
81
} ) ;
88
82
}
@@ -91,9 +85,29 @@ pub(crate) fn get_clippy_rules_in_order(
91
85
result. into_iter ( ) . map ( |v| v. 1 ) . collect ( )
92
86
}
93
87
88
+ #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
89
+ struct LintConfig {
90
+ allow : Vec < String > ,
91
+ warn : Vec < String > ,
92
+ deny : Vec < String > ,
93
+ forbid : Vec < String > ,
94
+ }
95
+
96
+ impl LintConfig {
97
+ fn new ( builder : & Builder < ' _ > ) -> Self {
98
+ match builder. config . cmd . clone ( ) {
99
+ Subcommand :: Clippy { allow, deny, warn, forbid, .. } => {
100
+ Self { allow, warn, deny, forbid }
101
+ }
102
+ _ => unreachable ! ( "LintConfig can only be called from `clippy` subcommands." ) ,
103
+ }
104
+ }
105
+ }
106
+
94
107
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
95
108
pub struct Std {
96
109
pub target : TargetSelection ,
110
+ config : LintConfig ,
97
111
/// Whether to lint only a subset of crates.
98
112
crates : Vec < String > ,
99
113
}
@@ -108,7 +122,8 @@ impl Step for Std {
108
122
109
123
fn make_run ( run : RunConfig < ' _ > ) {
110
124
let crates = std_crates_for_run_make ( & run) ;
111
- run. builder . ensure ( Std { target : run. target , crates } ) ;
125
+ let config = LintConfig :: new ( run. builder ) ;
126
+ run. builder . ensure ( Std { target : run. target , config, crates } ) ;
112
127
}
113
128
114
129
fn run ( self , builder : & Builder < ' _ > ) {
@@ -138,7 +153,7 @@ impl Step for Std {
138
153
run_cargo (
139
154
builder,
140
155
cargo,
141
- lint_args ( builder, IGNORED_RULES_FOR_STD_AND_RUSTC ) ,
156
+ lint_args ( builder, & self . config , IGNORED_RULES_FOR_STD_AND_RUSTC ) ,
142
157
& libstd_stamp ( builder, compiler, target) ,
143
158
vec ! [ ] ,
144
159
true ,
@@ -150,6 +165,7 @@ impl Step for Std {
150
165
#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
151
166
pub struct Rustc {
152
167
pub target : TargetSelection ,
168
+ config : LintConfig ,
153
169
/// Whether to lint only a subset of crates.
154
170
crates : Vec < String > ,
155
171
}
@@ -165,7 +181,8 @@ impl Step for Rustc {
165
181
166
182
fn make_run ( run : RunConfig < ' _ > ) {
167
183
let crates = run. make_run_crates ( Alias :: Compiler ) ;
168
- run. builder . ensure ( Rustc { target : run. target , crates } ) ;
184
+ let config = LintConfig :: new ( run. builder ) ;
185
+ run. builder . ensure ( Rustc { target : run. target , config, crates } ) ;
169
186
}
170
187
171
188
/// Lints the compiler.
@@ -212,7 +229,7 @@ impl Step for Rustc {
212
229
run_cargo (
213
230
builder,
214
231
cargo,
215
- lint_args ( builder, IGNORED_RULES_FOR_STD_AND_RUSTC ) ,
232
+ lint_args ( builder, & self . config , IGNORED_RULES_FOR_STD_AND_RUSTC ) ,
216
233
& librustc_stamp ( builder, compiler, target) ,
217
234
vec ! [ ] ,
218
235
true ,
@@ -232,6 +249,7 @@ macro_rules! lint_any {
232
249
#[ derive( Debug , Clone , Hash , PartialEq , Eq ) ]
233
250
pub struct $name {
234
251
pub target: TargetSelection ,
252
+ config: LintConfig ,
235
253
}
236
254
237
255
impl Step for $name {
@@ -243,8 +261,10 @@ macro_rules! lint_any {
243
261
}
244
262
245
263
fn make_run( run: RunConfig <' _>) {
264
+ let config = LintConfig :: new( run. builder) ;
246
265
run. builder. ensure( $name {
247
266
target: run. target,
267
+ config,
248
268
} ) ;
249
269
}
250
270
@@ -281,7 +301,7 @@ macro_rules! lint_any {
281
301
run_cargo(
282
302
builder,
283
303
cargo,
284
- lint_args( builder, & [ ] ) ,
304
+ lint_args( builder, & self . config , & [ ] ) ,
285
305
& stamp,
286
306
vec![ ] ,
287
307
true ,
0 commit comments