@@ -11,6 +11,7 @@ use std::env::{self, remove_var, set_var, var_os};
11
11
use std:: ffi:: { OsStr , OsString } ;
12
12
use std:: fs;
13
13
use std:: io;
14
+ use std:: lazy:: SyncLazy ;
14
15
use std:: path:: { Path , PathBuf } ;
15
16
use test_utils:: IS_RUSTC_TEST_SUITE ;
16
17
@@ -64,11 +65,11 @@ extern crate tokio;
64
65
/// dependencies must be added to Cargo.toml at the project root. Test
65
66
/// dependencies that are not *directly* used by this test module require an
66
67
/// `extern crate` declaration.
67
- fn extern_flags ( ) -> String {
68
+ static EXTERN_FLAGS : SyncLazy < String > = SyncLazy :: new ( || {
68
69
let current_exe_depinfo = {
69
70
let mut path = env:: current_exe ( ) . unwrap ( ) ;
70
71
path. set_extension ( "d" ) ;
71
- std :: fs:: read_to_string ( path) . unwrap ( )
72
+ fs:: read_to_string ( path) . unwrap ( )
72
73
} ;
73
74
let mut crates: HashMap < & str , & str > = HashMap :: with_capacity ( TEST_DEPENDENCIES . len ( ) ) ;
74
75
for line in current_exe_depinfo. lines ( ) {
@@ -112,24 +113,25 @@ fn extern_flags() -> String {
112
113
. into_iter ( )
113
114
. map ( |( name, path) | format ! ( " --extern {}={}" , name, path) )
114
115
. collect ( )
115
- }
116
+ } ) ;
116
117
117
- fn default_config ( ) -> compiletest:: Config {
118
+ fn base_config ( test_dir : & str ) -> compiletest:: Config {
118
119
let mut config = compiletest:: Config {
119
120
edition : Some ( "2021" . into ( ) ) ,
121
+ mode : TestMode :: Ui ,
120
122
..compiletest:: Config :: default ( )
121
123
} ;
122
124
123
125
if let Ok ( filters) = env:: var ( "TESTNAME" ) {
124
- config. filters = filters. split ( ',' ) . map ( std :: string :: ToString :: to_string) . collect ( ) ;
126
+ config. filters = filters. split ( ',' ) . map ( ToString :: to_string) . collect ( ) ;
125
127
}
126
128
127
129
if let Some ( path) = option_env ! ( "RUSTC_LIB_PATH" ) {
128
130
let path = PathBuf :: from ( path) ;
129
131
config. run_lib_path = path. clone ( ) ;
130
132
config. compile_lib_path = path;
131
133
}
132
- let current_exe_path = std :: env:: current_exe ( ) . unwrap ( ) ;
134
+ let current_exe_path = env:: current_exe ( ) . unwrap ( ) ;
133
135
let deps_path = current_exe_path. parent ( ) . unwrap ( ) ;
134
136
let profile_path = deps_path. parent ( ) . unwrap ( ) ;
135
137
@@ -143,10 +145,11 @@ fn default_config() -> compiletest::Config {
143
145
"--emit=metadata -Dwarnings -Zui-testing -L dependency={}{}{}" ,
144
146
deps_path. display( ) ,
145
147
host_libs,
146
- extern_flags ( ) ,
148
+ & * EXTERN_FLAGS ,
147
149
) ) ;
148
150
149
- config. build_base = profile_path. join ( "test" ) ;
151
+ config. src_base = Path :: new ( "tests" ) . join ( test_dir) ;
152
+ config. build_base = profile_path. join ( "test" ) . join ( test_dir) ;
150
153
config. rustc_path = profile_path. join ( if cfg ! ( windows) {
151
154
"clippy-driver.exe"
152
155
} else {
@@ -155,38 +158,31 @@ fn default_config() -> compiletest::Config {
155
158
config
156
159
}
157
160
158
- fn run_ui ( cfg : & mut compiletest:: Config ) {
159
- cfg. mode = TestMode :: Ui ;
160
- cfg. src_base = Path :: new ( "tests" ) . join ( "ui" ) ;
161
+ fn run_ui ( ) {
162
+ let config = base_config ( "ui" ) ;
161
163
// use tests/clippy.toml
162
- let _g = VarGuard :: set ( "CARGO_MANIFEST_DIR" , std :: fs:: canonicalize ( "tests" ) . unwrap ( ) ) ;
163
- compiletest:: run_tests ( cfg ) ;
164
+ let _g = VarGuard :: set ( "CARGO_MANIFEST_DIR" , fs:: canonicalize ( "tests" ) . unwrap ( ) ) ;
165
+ compiletest:: run_tests ( & config ) ;
164
166
}
165
167
166
- fn run_ui_test ( cfg : & mut compiletest:: Config ) {
167
- cfg. mode = TestMode :: Ui ;
168
- cfg. src_base = Path :: new ( "tests" ) . join ( "ui_test" ) ;
169
- let _g = VarGuard :: set ( "CARGO_MANIFEST_DIR" , std:: fs:: canonicalize ( "tests" ) . unwrap ( ) ) ;
170
- let rustcflags = cfg. target_rustcflags . get_or_insert_with ( Default :: default) ;
171
- let len = rustcflags. len ( ) ;
168
+ fn run_ui_test ( ) {
169
+ let mut config = base_config ( "ui_test" ) ;
170
+ let _g = VarGuard :: set ( "CARGO_MANIFEST_DIR" , fs:: canonicalize ( "tests" ) . unwrap ( ) ) ;
171
+ let rustcflags = config. target_rustcflags . get_or_insert_with ( Default :: default) ;
172
172
rustcflags. push_str ( " --test" ) ;
173
- compiletest:: run_tests ( cfg) ;
174
- if let Some ( ref mut flags) = & mut cfg. target_rustcflags {
175
- flags. truncate ( len) ;
176
- }
173
+ compiletest:: run_tests ( & config) ;
177
174
}
178
175
179
- fn run_internal_tests ( cfg : & mut compiletest :: Config ) {
176
+ fn run_internal_tests ( ) {
180
177
// only run internal tests with the internal-tests feature
181
178
if !RUN_INTERNAL_TESTS {
182
179
return ;
183
180
}
184
- cfg. mode = TestMode :: Ui ;
185
- cfg. src_base = Path :: new ( "tests" ) . join ( "ui-internal" ) ;
186
- compiletest:: run_tests ( cfg) ;
181
+ let config = base_config ( "ui-internal" ) ;
182
+ compiletest:: run_tests ( & config) ;
187
183
}
188
184
189
- fn run_ui_toml ( config : & mut compiletest :: Config ) {
185
+ fn run_ui_toml ( ) {
190
186
fn run_tests ( config : & compiletest:: Config , mut tests : Vec < tester:: TestDescAndFn > ) -> Result < bool , io:: Error > {
191
187
let mut result = true ;
192
188
let opts = compiletest:: test_opts ( config) ;
@@ -222,12 +218,12 @@ fn run_ui_toml(config: &mut compiletest::Config) {
222
218
Ok ( result)
223
219
}
224
220
225
- config. mode = TestMode :: Ui ;
226
- config. src_base = Path :: new ( "tests" ) . join ( "ui-toml" ) . canonicalize ( ) . unwrap ( ) ;
221
+ let mut config = base_config ( "ui-toml" ) ;
222
+ config. src_base = config . src_base . canonicalize ( ) . unwrap ( ) ;
227
223
228
- let tests = compiletest:: make_tests ( config) ;
224
+ let tests = compiletest:: make_tests ( & config) ;
229
225
230
- let res = run_tests ( config, tests) ;
226
+ let res = run_tests ( & config, tests) ;
231
227
match res {
232
228
Ok ( true ) => { } ,
233
229
Ok ( false ) => panic ! ( "Some tests failed" ) ,
@@ -237,7 +233,7 @@ fn run_ui_toml(config: &mut compiletest::Config) {
237
233
}
238
234
}
239
235
240
- fn run_ui_cargo ( config : & mut compiletest :: Config ) {
236
+ fn run_ui_cargo ( ) {
241
237
fn run_tests (
242
238
config : & compiletest:: Config ,
243
239
filters : & [ String ] ,
@@ -310,13 +306,13 @@ fn run_ui_cargo(config: &mut compiletest::Config) {
310
306
return ;
311
307
}
312
308
313
- config. mode = TestMode :: Ui ;
314
- config. src_base = Path :: new ( "tests" ) . join ( "ui-cargo" ) . canonicalize ( ) . unwrap ( ) ;
309
+ let mut config = base_config ( "ui-cargo" ) ;
310
+ config. src_base = config . src_base . canonicalize ( ) . unwrap ( ) ;
315
311
316
- let tests = compiletest:: make_tests ( config) ;
312
+ let tests = compiletest:: make_tests ( & config) ;
317
313
318
314
let current_dir = env:: current_dir ( ) . unwrap ( ) ;
319
- let res = run_tests ( config, & config. filters , tests) ;
315
+ let res = run_tests ( & config, & config. filters , tests) ;
320
316
env:: set_current_dir ( current_dir) . unwrap ( ) ;
321
317
322
318
match res {
@@ -331,12 +327,11 @@ fn run_ui_cargo(config: &mut compiletest::Config) {
331
327
#[ test]
332
328
fn compile_test ( ) {
333
329
set_var ( "CLIPPY_DISABLE_DOCS_LINKS" , "true" ) ;
334
- let mut config = default_config ( ) ;
335
- run_ui ( & mut config) ;
336
- run_ui_test ( & mut config) ;
337
- run_ui_toml ( & mut config) ;
338
- run_ui_cargo ( & mut config) ;
339
- run_internal_tests ( & mut config) ;
330
+ run_ui ( ) ;
331
+ run_ui_test ( ) ;
332
+ run_ui_toml ( ) ;
333
+ run_ui_cargo ( ) ;
334
+ run_internal_tests ( ) ;
340
335
}
341
336
342
337
/// Restores an env var on drop
0 commit comments