@@ -110,21 +110,108 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
110
110
}
111
111
}
112
112
113
- pub fn main ( ) {
114
- rustc_driver:: init_rustc_env_logger ( ) ;
115
- exit (
116
- rustc_driver:: report_ices_to_stderr_if_any ( move || {
117
- use std:: env;
113
+ fn describe_lints ( ) {
114
+ use lintlist:: * ;
118
115
119
- if std:: env:: args ( ) . any ( |a| a == "--version" || a == "-V" ) {
120
- let version_info = rustc_tools_util:: get_version_info!( ) ;
121
- println ! ( "{}" , version_info) ;
122
- exit ( 0 ) ;
123
- }
116
+ println ! (
117
+ "
118
+ Available lint options:
119
+ -W <foo> Warn about <foo>
120
+ -A <foo> Allow <foo>
121
+ -D <foo> Deny <foo>
122
+ -F <foo> Forbid <foo> (deny <foo> and all attempts to override)
124
123
125
- if std:: env:: args ( ) . any ( |a| a == "--help" || a == "-h" ) {
126
- println ! (
127
- "\
124
+ "
125
+ ) ;
126
+
127
+ let mut lints: Vec < _ > = ALL_LINTS . iter ( ) . collect ( ) ;
128
+ // The sort doesn't case-fold but it's doubtful we care.
129
+ lints. sort_by_cached_key ( |x : & & Lint | ( "unknown" , x. name ) ) ;
130
+
131
+ let max_name_len = lints
132
+ . iter ( )
133
+ . map ( |lint| lint. name . len ( ) )
134
+ . map ( |len| len + "clippy::" . len ( ) )
135
+ . max ( )
136
+ . unwrap_or ( 0 ) ;
137
+
138
+ let padded = |x : & str | {
139
+ let mut s = " " . repeat ( max_name_len - x. chars ( ) . count ( ) ) ;
140
+ s. push_str ( x) ;
141
+ s
142
+ } ;
143
+
144
+ let scoped = |x : & str | format ! ( "clippy::{}" , x) ;
145
+
146
+ println ! ( "Lint checks provided by clippy:\n " ) ;
147
+ println ! ( " {} {:7.7} meaning" , padded( "name" ) , "default" ) ;
148
+ println ! ( " {} {:7.7} -------" , padded( "----" ) , "-------" ) ;
149
+
150
+ let print_lints = |lints : Vec < & Lint > | {
151
+ for lint in lints {
152
+ let name = lint. name . replace ( "_" , "-" ) ;
153
+ println ! ( " {} {:7.7} {}" , padded( & scoped( & name) ) , "unknown" , lint. desc) ;
154
+ }
155
+ println ! ( "\n " ) ;
156
+ } ;
157
+
158
+ print_lints ( lints) ;
159
+
160
+ // let max_name_len = max("warnings".len(),
161
+ // plugin_groups.iter()
162
+ // .chain(&builtin_groups)
163
+ // .map(|&(s, _)| s.chars().count())
164
+ // .max()
165
+ // .unwrap_or(0));
166
+
167
+ // let padded = |x: &str| {
168
+ // let mut s = " ".repeat(max_name_len - x.chars().count());
169
+ // s.push_str(x);
170
+ // s
171
+ // };
172
+
173
+ // println!("Lint groups provided by rustc:\n");
174
+ // println!(" {} {}", padded("name"), "sub-lints");
175
+ // println!(" {} {}", padded("----"), "---------");
176
+ // println!(" {} {}", padded("warnings"), "all lints that are set to issue warnings");
177
+
178
+ // let print_lint_groups = |lints: Vec<(&'static str, Vec<lint::LintId>)>| {
179
+ // for (name, to) in lints {
180
+ // let name = name.to_lowercase().replace("_", "-");
181
+ // let desc = to.into_iter()
182
+ // .map(|x| x.to_string().replace("_", "-"))
183
+ // .collect::<Vec<String>>()
184
+ // .join(", ");
185
+ // println!(" {} {}", padded(&name), desc);
186
+ // }
187
+ // println!("\n");
188
+ // };
189
+
190
+ // print_lint_groups(builtin_groups);
191
+
192
+ // match (loaded_plugins, plugin.len(), plugin_groups.len()) {
193
+ // (false, 0, _) | (false, _, 0) => {
194
+ // println!("Compiler plugins can provide additional lints and lint groups. To see a \
195
+ // listing of these, re-run `rustc -W help` with a crate filename.");
196
+ // }
197
+ // (false, ..) => panic!("didn't load lint plugins but got them anyway!"),
198
+ // (true, 0, 0) => println!("This crate does not load any lint plugins or lint groups."),
199
+ // (true, l, g) => {
200
+ // if l > 0 {
201
+ // println!("Lint checks provided by plugins loaded by this crate:\n");
202
+ // print_lints(plugin);
203
+ // }
204
+ // if g > 0 {
205
+ // println!("Lint groups provided by plugins loaded by this crate:\n");
206
+ // print_lint_groups(plugin_groups);
207
+ // }
208
+ // }
209
+ // }
210
+ }
211
+
212
+ fn display_help ( ) {
213
+ println ! (
214
+ "\
128
215
Checks a package to catch common mistakes and improve your Rust code.
129
216
130
217
Usage:
@@ -148,11 +235,18 @@ You can use tool lints to allow or deny lints from your code, eg.:
148
235
149
236
#[allow(clippy::needless_lifetimes)]
150
237
"
151
- ) ;
238
+ ) ;
239
+ }
152
240
153
- for lint in & lintlist:: ALL_LINTS [ ..] {
154
- println ! ( "clippy::{}," , lint. name) ;
155
- }
241
+ pub fn main ( ) {
242
+ rustc_driver:: init_rustc_env_logger ( ) ;
243
+ exit (
244
+ rustc_driver:: report_ices_to_stderr_if_any ( move || {
245
+ use std:: env;
246
+
247
+ if std:: env:: args ( ) . any ( |a| a == "--version" || a == "-V" ) {
248
+ let version_info = rustc_tools_util:: get_version_info!( ) ;
249
+ println ! ( "{}" , version_info) ;
156
250
exit ( 0 ) ;
157
251
}
158
252
@@ -189,13 +283,33 @@ You can use tool lints to allow or deny lints from your code, eg.:
189
283
190
284
// Setting RUSTC_WRAPPER causes Cargo to pass 'rustc' as the first argument.
191
285
// We're invoking the compiler programmatically, so we ignore this/
192
- if orig_args. len ( ) <= 1 {
193
- std:: process:: exit ( 1 ) ;
194
- }
195
- if Path :: new ( & orig_args[ 1 ] ) . file_stem ( ) == Some ( "rustc" . as_ref ( ) ) {
286
+ let wrapper_mode = Path :: new ( & orig_args[ 1 ] ) . file_stem ( ) == Some ( "rustc" . as_ref ( ) ) ;
287
+
288
+ if wrapper_mode {
196
289
// we still want to be able to invoke it normally though
197
290
orig_args. remove ( 1 ) ;
198
291
}
292
+
293
+ if !wrapper_mode && std:: env:: args ( ) . any ( |a| a == "--help" || a == "-h" ) {
294
+ display_help ( ) ;
295
+ exit ( 0 ) ;
296
+ }
297
+
298
+ let args: Vec < _ > = std:: env:: args ( ) . collect ( ) ;
299
+
300
+ if !wrapper_mode
301
+ && args. windows ( 2 ) . any ( |args| {
302
+ args[ 1 ] == "help"
303
+ && match args[ 0 ] . as_str ( ) {
304
+ "-W" | "-A" | "-D" | "-F" => true ,
305
+ _ => false ,
306
+ }
307
+ } )
308
+ {
309
+ describe_lints ( ) ;
310
+ exit ( 0 ) ;
311
+ }
312
+
199
313
// this conditional check for the --sysroot flag is there so users can call
200
314
// `clippy_driver` directly
201
315
// without having to pass --sysroot or anything
0 commit comments