@@ -11,6 +11,7 @@ use std::env::{self, remove_var, set_var, var_os};
1111use std:: ffi:: { OsStr , OsString } ;
1212use std:: fs;
1313use std:: io;
14+ use std:: lazy:: SyncLazy ;
1415use std:: path:: { Path , PathBuf } ;
1516use test_utils:: IS_RUSTC_TEST_SUITE ;
1617
@@ -64,11 +65,11 @@ extern crate tokio;
6465/// dependencies must be added to Cargo.toml at the project root. Test
6566/// dependencies that are not *directly* used by this test module require an
6667/// `extern crate` declaration.
67- fn extern_flags ( ) -> String {
68+ static EXTERN_FLAGS : SyncLazy < String > = SyncLazy :: new ( || {
6869 let current_exe_depinfo = {
6970 let mut path = env:: current_exe ( ) . unwrap ( ) ;
7071 path. set_extension ( "d" ) ;
71- std :: fs:: read_to_string ( path) . unwrap ( )
72+ fs:: read_to_string ( path) . unwrap ( )
7273 } ;
7374 let mut crates: HashMap < & str , & str > = HashMap :: with_capacity ( TEST_DEPENDENCIES . len ( ) ) ;
7475 for line in current_exe_depinfo. lines ( ) {
@@ -112,24 +113,25 @@ fn extern_flags() -> String {
112113 . into_iter ( )
113114 . map ( |( name, path) | format ! ( " --extern {}={}" , name, path) )
114115 . collect ( )
115- }
116+ } ) ;
116117
117- fn default_config ( ) -> compiletest:: Config {
118+ fn base_config ( test_dir : & str ) -> compiletest:: Config {
118119 let mut config = compiletest:: Config {
119120 edition : Some ( "2021" . into ( ) ) ,
121+ mode : TestMode :: Ui ,
120122 ..compiletest:: Config :: default ( )
121123 } ;
122124
123125 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 ( ) ;
125127 }
126128
127129 if let Some ( path) = option_env ! ( "RUSTC_LIB_PATH" ) {
128130 let path = PathBuf :: from ( path) ;
129131 config. run_lib_path = path. clone ( ) ;
130132 config. compile_lib_path = path;
131133 }
132- let current_exe_path = std :: env:: current_exe ( ) . unwrap ( ) ;
134+ let current_exe_path = env:: current_exe ( ) . unwrap ( ) ;
133135 let deps_path = current_exe_path. parent ( ) . unwrap ( ) ;
134136 let profile_path = deps_path. parent ( ) . unwrap ( ) ;
135137
@@ -143,10 +145,11 @@ fn default_config() -> compiletest::Config {
143145 "--emit=metadata -Dwarnings -Zui-testing -L dependency={}{}{}" ,
144146 deps_path. display( ) ,
145147 host_libs,
146- extern_flags ( ) ,
148+ & * EXTERN_FLAGS ,
147149 ) ) ;
148150
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) ;
150153 config. rustc_path = profile_path. join ( if cfg ! ( windows) {
151154 "clippy-driver.exe"
152155 } else {
@@ -155,38 +158,31 @@ fn default_config() -> compiletest::Config {
155158 config
156159}
157160
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" ) ;
161163 // 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 ) ;
164166}
165167
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) ;
172172 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) ;
177174}
178175
179- fn run_internal_tests ( cfg : & mut compiletest :: Config ) {
176+ fn run_internal_tests ( ) {
180177 // only run internal tests with the internal-tests feature
181178 if !RUN_INTERNAL_TESTS {
182179 return ;
183180 }
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) ;
187183}
188184
189- fn run_ui_toml ( config : & mut compiletest :: Config ) {
185+ fn run_ui_toml ( ) {
190186 fn run_tests ( config : & compiletest:: Config , mut tests : Vec < tester:: TestDescAndFn > ) -> Result < bool , io:: Error > {
191187 let mut result = true ;
192188 let opts = compiletest:: test_opts ( config) ;
@@ -222,12 +218,12 @@ fn run_ui_toml(config: &mut compiletest::Config) {
222218 Ok ( result)
223219 }
224220
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 ( ) ;
227223
228- let tests = compiletest:: make_tests ( config) ;
224+ let tests = compiletest:: make_tests ( & config) ;
229225
230- let res = run_tests ( config, tests) ;
226+ let res = run_tests ( & config, tests) ;
231227 match res {
232228 Ok ( true ) => { } ,
233229 Ok ( false ) => panic ! ( "Some tests failed" ) ,
@@ -237,7 +233,7 @@ fn run_ui_toml(config: &mut compiletest::Config) {
237233 }
238234}
239235
240- fn run_ui_cargo ( config : & mut compiletest :: Config ) {
236+ fn run_ui_cargo ( ) {
241237 fn run_tests (
242238 config : & compiletest:: Config ,
243239 filters : & [ String ] ,
@@ -310,13 +306,13 @@ fn run_ui_cargo(config: &mut compiletest::Config) {
310306 return ;
311307 }
312308
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 ( ) ;
315311
316- let tests = compiletest:: make_tests ( config) ;
312+ let tests = compiletest:: make_tests ( & config) ;
317313
318314 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) ;
320316 env:: set_current_dir ( current_dir) . unwrap ( ) ;
321317
322318 match res {
@@ -331,12 +327,11 @@ fn run_ui_cargo(config: &mut compiletest::Config) {
331327#[ test]
332328fn compile_test ( ) {
333329 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 ( ) ;
340335}
341336
342337/// Restores an env var on drop
0 commit comments