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 {
@@ -138,6 +143,7 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
138
143
let conf_path = clippy_config:: lookup_conf_file ( ) ;
139
144
let previous = config. register_lints . take ( ) ;
140
145
let clippy_args_var = self . clippy_args_var . take ( ) ;
146
+ let testing = self . testing ;
141
147
config. psess_created = Some ( Box :: new ( move |psess| {
142
148
track_clippy_args ( psess, clippy_args_var. as_deref ( ) ) ;
143
149
track_files ( psess) ;
@@ -156,11 +162,14 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
156
162
( previous) ( sess, lint_store) ;
157
163
}
158
164
165
+ let conf = clippy_config:: Conf :: read ( sess, & conf_path) ;
166
+ let disabled = build_disabled_set ( sess, conf, testing) ;
167
+ clippy_utils:: diagnostics:: set_disabled ( disabled) ;
168
+
159
169
let mut list_builder = LintListBuilder :: default ( ) ;
160
170
list_builder. insert ( clippy_lints:: declared_lints:: LINTS ) ;
161
171
list_builder. register ( lint_store) ;
162
172
163
- let conf = clippy_config:: Conf :: read ( sess, & conf_path) ;
164
173
clippy_lints:: register_lint_passes ( lint_store, conf) ;
165
174
166
175
#[ cfg( feature = "internal" ) ]
@@ -181,6 +190,34 @@ impl rustc_driver::Callbacks for ClippyCallbacks {
181
190
}
182
191
}
183
192
193
+ fn build_disabled_set ( sess : & Session , conf : & ' static Conf , testing : bool ) -> FxHashSet < & ' static str > {
194
+ if !testing {
195
+ return FxHashSet :: default ( ) ;
196
+ }
197
+ let disabled = conf
198
+ . disabled_in_tests
199
+ . iter ( )
200
+ . map ( String :: as_str)
201
+ . collect :: < FxHashSet < _ > > ( ) ;
202
+ let declared_lint_names = clippy_lints:: declared_lints:: LINTS
203
+ . iter ( )
204
+ . map ( |lint| lint. name_lower ( ) )
205
+ . collect :: < FxHashSet < _ > > ( ) ;
206
+ #[ allow( rustc:: potential_query_instability) ]
207
+ for & name in & disabled {
208
+ if !declared_lint_names. contains ( name) {
209
+ let mut msg = format ! ( "unknown lint `{name}`" ) ;
210
+ let replaced = name. replace ( '-' , "_" ) ;
211
+ if declared_lint_names. contains ( & replaced) {
212
+ writeln ! ( msg, ". Did you mean `{replaced}`?" ) . unwrap ( ) ;
213
+ }
214
+ sess. dcx ( ) . warn ( msg) ;
215
+ }
216
+ }
217
+ disabled
218
+ }
219
+
220
+ #[ allow( clippy:: ignored_unit_patterns) ]
184
221
fn display_help ( ) {
185
222
println ! ( "{}" , help_message( ) ) ;
186
223
}
@@ -333,7 +370,13 @@ pub fn main() {
333
370
let clippy_enabled = !cap_lints_allow && relevant_package && !info_query;
334
371
if clippy_enabled {
335
372
args. extend ( clippy_args) ;
336
- rustc_driver:: run_compiler ( & args, & mut ClippyCallbacks { clippy_args_var } ) ;
373
+ rustc_driver:: run_compiler (
374
+ & args,
375
+ & mut ClippyCallbacks {
376
+ clippy_args_var,
377
+ testing : orig_args. iter ( ) . any ( |arg| arg == "--test" ) ,
378
+ } ,
379
+ ) ;
337
380
} else {
338
381
rustc_driver:: run_compiler ( & args, & mut RustcCallbacks { clippy_args_var } ) ;
339
382
}
0 commit comments