8
8
9
9
// FIXME: switch to something more ergonomic here, once available.
10
10
// (Currently there is no way to opt into sysroot crates without `extern crate`.)
11
+ extern crate rustc_data_structures;
11
12
extern crate rustc_driver;
12
13
extern crate rustc_interface;
13
14
extern crate rustc_session;
@@ -18,15 +19,18 @@ extern crate rustc_span;
18
19
#[ cfg( feature = "jemalloc" ) ]
19
20
extern crate tikv_jemalloc_sys as jemalloc_sys;
20
21
22
+ use clippy_config:: Conf ;
21
23
use clippy_utils:: sym;
22
24
use declare_clippy_lint:: LintListBuilder ;
25
+ use rustc_data_structures:: fx:: FxHashSet ;
23
26
use rustc_interface:: interface;
24
- use rustc_session:: EarlyDiagCtxt ;
25
27
use rustc_session:: config:: ErrorOutputType ;
26
28
use rustc_session:: parse:: ParseSess ;
29
+ use rustc_session:: { EarlyDiagCtxt , Session } ;
27
30
use rustc_span:: symbol:: Symbol ;
28
31
29
32
use std:: env;
33
+ use std:: fmt:: Write ;
30
34
use std:: fs:: read_to_string;
31
35
use std:: path:: Path ;
32
36
use std:: process:: exit;
@@ -130,6 +134,7 @@ impl rustc_driver::Callbacks for RustcCallbacks {
130
134
131
135
struct ClippyCallbacks {
132
136
clippy_args_var : Option < String > ,
137
+ testing : bool ,
133
138
}
134
139
135
140
impl rustc_driver:: Callbacks for ClippyCallbacks {
@@ -139,6 +144,7 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
139
144
let conf_path = clippy_config:: lookup_conf_file ( ) ;
140
145
let previous = config. register_lints . take ( ) ;
141
146
let clippy_args_var = self . clippy_args_var . take ( ) ;
147
+ let testing = self . testing ;
142
148
config. psess_created = Some ( Box :: new ( move |psess| {
143
149
track_clippy_args ( psess, clippy_args_var. as_deref ( ) ) ;
144
150
track_files ( psess) ;
@@ -157,11 +163,14 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
157
163
( previous) ( sess, lint_store) ;
158
164
}
159
165
166
+ let conf = clippy_config:: Conf :: read ( sess, & conf_path) ;
167
+ let disabled = build_disabled_set ( sess, conf, testing) ;
168
+ clippy_utils:: diagnostics:: set_disabled ( disabled) ;
169
+
160
170
let mut list_builder = LintListBuilder :: default ( ) ;
161
171
list_builder. insert ( clippy_lints:: declared_lints:: LINTS ) ;
162
172
list_builder. register ( lint_store) ;
163
173
164
- let conf = clippy_config:: Conf :: read ( sess, & conf_path) ;
165
174
clippy_lints:: register_lint_passes ( lint_store, conf) ;
166
175
167
176
#[ cfg( feature = "internal" ) ]
@@ -182,6 +191,33 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
182
191
}
183
192
}
184
193
194
+ fn build_disabled_set ( sess : & Session , conf : & ' static Conf , testing : bool ) -> FxHashSet < & ' static str > {
195
+ if !testing {
196
+ return FxHashSet :: default ( ) ;
197
+ }
198
+ let disabled = conf
199
+ . disabled_in_tests
200
+ . iter ( )
201
+ . map ( String :: as_str)
202
+ . collect :: < FxHashSet < _ > > ( ) ;
203
+ let declared_lint_names = clippy_lints:: declared_lints:: LINTS
204
+ . iter ( )
205
+ . map ( |lint| lint. name_lower ( ) )
206
+ . collect :: < FxHashSet < _ > > ( ) ;
207
+ #[ allow( rustc:: potential_query_instability) ]
208
+ for & name in & disabled {
209
+ if !declared_lint_names. contains ( name) {
210
+ let mut msg = format ! ( "unknown lint `{name}`" ) ;
211
+ let replaced = name. replace ( '-' , "_" ) ;
212
+ if declared_lint_names. contains ( & replaced) {
213
+ writeln ! ( msg, ". Did you mean `{replaced}`?" ) . unwrap ( ) ;
214
+ }
215
+ sess. dcx ( ) . warn ( msg) ;
216
+ }
217
+ }
218
+ disabled
219
+ }
220
+
185
221
#[ allow( clippy:: ignored_unit_patterns) ]
186
222
fn display_help ( ) {
187
223
println ! ( "{}" , help_message( ) ) ;
@@ -336,7 +372,13 @@ pub fn main() {
336
372
let clippy_enabled = !cap_lints_allow && relevant_package && !info_query;
337
373
if clippy_enabled {
338
374
args. extend ( clippy_args) ;
339
- rustc_driver:: run_compiler ( & args, & mut ClippyCallbacks { clippy_args_var } ) ;
375
+ rustc_driver:: run_compiler (
376
+ & args,
377
+ & mut ClippyCallbacks {
378
+ clippy_args_var,
379
+ testing : orig_args. iter ( ) . any ( |arg| arg == "--test" ) ,
380
+ } ,
381
+ ) ;
340
382
} else {
341
383
rustc_driver:: run_compiler ( & args, & mut RustcCallbacks { clippy_args_var } ) ;
342
384
}
0 commit comments