11use  std:: collections:: { BTreeSet ,  HashMap ,  HashSet } ; 
2+ use  std:: iter; 
23use  std:: process:: Command ; 
3- use  std:: str:: FromStr ; 
44use  std:: sync:: OnceLock ; 
5- use  std:: { fmt,  iter} ; 
65
76use  build_helper:: git:: GitConfig ; 
87use  camino:: { Utf8Path ,  Utf8PathBuf } ; 
98use  semver:: Version ; 
109use  serde:: de:: { Deserialize ,  Deserializer ,  Error  as  _} ; 
1110
12- pub  use  self :: Mode :: * ; 
1311use  crate :: executor:: { ColorConfig ,  OutputFormat } ; 
1412use  crate :: fatal; 
15- use  crate :: util:: { Utf8PathBufExt ,  add_dylib_path} ; 
16- 
17- macro_rules!  string_enum { 
18-     ( $( #[ $meta: meta] ) *  $vis: vis enum  $name: ident {  $( $variant: ident => $repr: expr, ) *  } )  => { 
19-         $( #[ $meta] ) * 
20-         $vis enum  $name { 
21-             $( $variant, ) * 
22-         } 
23- 
24-         impl  $name { 
25-             $vis const  VARIANTS :  & ' static  [ Self ]  = & [ $( Self :: $variant, ) * ] ; 
26-             $vis const  STR_VARIANTS :  & ' static  [ & ' static  str ]  = & [ $( Self :: $variant. to_str( ) , ) * ] ; 
27- 
28-             $vis const  fn  to_str( & self )  -> & ' static  str  { 
29-                 match  self  { 
30-                     $( Self :: $variant => $repr, ) * 
31-                 } 
32-             } 
33-         } 
34- 
35-         impl  fmt:: Display  for  $name { 
36-             fn  fmt( & self ,  f:  & mut  fmt:: Formatter <' _>)  -> fmt:: Result  { 
37-                 fmt:: Display :: fmt( self . to_str( ) ,  f) 
38-             } 
39-         } 
40- 
41-         impl  FromStr  for  $name { 
42-             type  Err  = String ; 
43- 
44-             fn  from_str( s:  & str )  -> Result <Self ,  Self :: Err > { 
45-                 match  s { 
46-                     $( $repr => Ok ( Self :: $variant) , ) * 
47-                     _ => Err ( format!( concat!( "unknown `" ,  stringify!( $name) ,  "` variant: `{}`" ) ,  s) ) , 
48-                 } 
49-             } 
50-         } 
51-     } 
52- } 
53- 
54- // Make the macro visible outside of this module, for tests. 
55- #[ cfg( test) ]  
56- pub ( crate )  use  string_enum; 
13+ use  crate :: util:: { Utf8PathBufExt ,  add_dylib_path,  string_enum} ; 
5714
5815string_enum !  { 
5916    #[ derive( Clone ,  Copy ,  PartialEq ,  Debug ) ] 
60-     pub  enum  Mode  { 
17+     pub  enum  TestMode  { 
6118        Pretty  => "pretty" , 
6219        DebugInfo  => "debuginfo" , 
6320        Codegen  => "codegen" , 
@@ -76,18 +33,12 @@ string_enum! {
7633    } 
7734} 
7835
79- impl  Default  for  Mode  { 
80-     fn  default ( )  -> Self  { 
81-         Mode :: Ui 
82-     } 
83- } 
84- 
85- impl  Mode  { 
36+ impl  TestMode  { 
8637    pub  fn  aux_dir_disambiguator ( self )  -> & ' static  str  { 
8738        // Pretty-printing tests could run concurrently, and if they do, 
8839        // they need to keep their output segregated. 
8940        match  self  { 
90-             Pretty  => ".pretty" , 
41+             TestMode :: Pretty  => ".pretty" , 
9142            _ => "" , 
9243        } 
9344    } 
@@ -96,7 +47,7 @@ impl Mode {
9647        // Coverage tests use the same test files for multiple test modes, 
9748        // so each mode should have a separate output directory. 
9849        match  self  { 
99-             CoverageMap  | CoverageRun  => self . to_str ( ) , 
50+             TestMode :: CoverageMap  | TestMode :: CoverageRun  => self . to_str ( ) , 
10051            _ => "" , 
10152        } 
10253    } 
@@ -193,9 +144,9 @@ pub enum Sanitizer {
193144/// 
194145/// FIXME: audit these options to make sure we are not hashing less than necessary for build stamp 
195146/// (for changed test detection). 
196- #[ derive( Debug ,  Default ,   Clone ) ]  
147+ #[ derive( Debug ,  Clone ) ]  
197148pub  struct  Config  { 
198-     /// Some test [`Mode `]s support [snapshot testing], where a *reference snapshot* of outputs (of 
149+     /// Some [`TestMode `]s support [snapshot testing], where a *reference snapshot* of outputs (of 
199150/// `stdout`, `stderr`, or other form of artifacts) can be compared to the *actual output*. 
200151/// 
201152/// This option can be set to `true` to update the *reference snapshots* in-place, otherwise 
@@ -317,20 +268,20 @@ pub struct Config {
317268/// FIXME: reconsider this string; this is hashed for test build stamp. 
318269pub  stage_id :  String , 
319270
320-     /// The test [`Mode `]. E.g. [`Mode ::Ui`]. Each test mode can correspond to one or more test 
271+     /// The [`TestMode `]. E.g. [`TestMode ::Ui`]. Each test mode can correspond to one or more test 
321272/// suites. 
322273/// 
323274/// FIXME: stop using stringly-typed test suites! 
324- pub  mode :  Mode , 
275+ pub  mode :  TestMode , 
325276
326277    /// The test suite. 
327278/// 
328- /// Example: `tests/ui/` is the "UI" test *suite*, which happens to also be of the [`Mode::Ui`]  
329- /// test *mode*. 
279+ /// Example: `tests/ui/` is the "UI" test *suite*, which happens to also be of the 
280+ /// [`TestMode::Ui`]  test *mode*. 
330281/// 
331282/// Note that the same test directory (e.g. `tests/coverage/`) may correspond to multiple test 
332- /// modes, e.g. `tests/coverage/` can be run under both [`Mode ::CoverageRun`] and 
333- /// [`Mode ::CoverageMap`]. 
283+ /// modes, e.g. `tests/coverage/` can be run under both [`TestMode ::CoverageRun`] and 
284+ /// [`TestMode ::CoverageMap`]. 
334285/// 
335286/// FIXME: stop using stringly-typed test suites! 
336287pub  suite :  String , 
@@ -586,8 +537,8 @@ pub struct Config {
586537    // Configuration for various run-make tests frobbing things like C compilers or querying about 
587538    // various LLVM component information. 
588539    // 
589-     // FIXME: this really should be better packaged together. 
590-     // FIXME: these need better docs, e.g.  for *host*, or for *target*? 
540+     // FIXME: this really should be better packaged together. FIXME: these need better docs, e.g.  
541+     // for *host*, or for *target*? 
591542    pub  cc :  String , 
592543    pub  cxx :  String , 
593544    pub  cflags :  String , 
@@ -653,6 +604,107 @@ pub struct Config {
653604} 
654605
655606impl  Config  { 
607+     /// Incomplete config intended for `src/tools/rustdoc-gui-test` **only** as 
608+ /// `src/tools/rustdoc-gui-test` wants to reuse `compiletest`'s directive -> test property 
609+ /// handling for `//@ {compile,run}-flags`, do not use for any other purpose. 
610+ /// 
611+ /// FIXME(#143827): this setup feels very hacky. It so happens that `tests/rustdoc-gui/` 
612+ /// **only** uses `//@ {compile,run}-flags` for now and not any directives that actually rely on 
613+ /// info that is assumed available in a fully populated [`Config`]. 
614+ pub  fn  incomplete_for_rustdoc_gui_test ( )  -> Config  { 
615+         // FIXME(#143827): spelling this out intentionally, because this is questionable. 
616+         // 
617+         // For instance, `//@ ignore-stage1` will not work at all. 
618+         Config  { 
619+             mode :  TestMode :: Rustdoc , 
620+ 
621+             // Dummy values. 
622+             edition :  Default :: default ( ) , 
623+             bless :  Default :: default ( ) , 
624+             fail_fast :  Default :: default ( ) , 
625+             compile_lib_path :  Utf8PathBuf :: default ( ) , 
626+             run_lib_path :  Utf8PathBuf :: default ( ) , 
627+             rustc_path :  Utf8PathBuf :: default ( ) , 
628+             cargo_path :  Default :: default ( ) , 
629+             stage0_rustc_path :  Default :: default ( ) , 
630+             rustdoc_path :  Default :: default ( ) , 
631+             coverage_dump_path :  Default :: default ( ) , 
632+             python :  Default :: default ( ) , 
633+             jsondocck_path :  Default :: default ( ) , 
634+             jsondoclint_path :  Default :: default ( ) , 
635+             llvm_filecheck :  Default :: default ( ) , 
636+             llvm_bin_dir :  Default :: default ( ) , 
637+             run_clang_based_tests_with :  Default :: default ( ) , 
638+             src_root :  Utf8PathBuf :: default ( ) , 
639+             src_test_suite_root :  Utf8PathBuf :: default ( ) , 
640+             build_root :  Utf8PathBuf :: default ( ) , 
641+             build_test_suite_root :  Utf8PathBuf :: default ( ) , 
642+             sysroot_base :  Utf8PathBuf :: default ( ) , 
643+             stage :  Default :: default ( ) , 
644+             stage_id :  String :: default ( ) , 
645+             suite :  Default :: default ( ) , 
646+             debugger :  Default :: default ( ) , 
647+             run_ignored :  Default :: default ( ) , 
648+             with_rustc_debug_assertions :  Default :: default ( ) , 
649+             with_std_debug_assertions :  Default :: default ( ) , 
650+             filters :  Default :: default ( ) , 
651+             skip :  Default :: default ( ) , 
652+             filter_exact :  Default :: default ( ) , 
653+             force_pass_mode :  Default :: default ( ) , 
654+             run :  Default :: default ( ) , 
655+             runner :  Default :: default ( ) , 
656+             host_rustcflags :  Default :: default ( ) , 
657+             target_rustcflags :  Default :: default ( ) , 
658+             rust_randomized_layout :  Default :: default ( ) , 
659+             optimize_tests :  Default :: default ( ) , 
660+             target :  Default :: default ( ) , 
661+             host :  Default :: default ( ) , 
662+             cdb :  Default :: default ( ) , 
663+             cdb_version :  Default :: default ( ) , 
664+             gdb :  Default :: default ( ) , 
665+             gdb_version :  Default :: default ( ) , 
666+             lldb_version :  Default :: default ( ) , 
667+             llvm_version :  Default :: default ( ) , 
668+             system_llvm :  Default :: default ( ) , 
669+             android_cross_path :  Default :: default ( ) , 
670+             adb_path :  Default :: default ( ) , 
671+             adb_test_dir :  Default :: default ( ) , 
672+             adb_device_status :  Default :: default ( ) , 
673+             lldb_python_dir :  Default :: default ( ) , 
674+             verbose :  Default :: default ( ) , 
675+             format :  Default :: default ( ) , 
676+             color :  Default :: default ( ) , 
677+             remote_test_client :  Default :: default ( ) , 
678+             compare_mode :  Default :: default ( ) , 
679+             rustfix_coverage :  Default :: default ( ) , 
680+             has_html_tidy :  Default :: default ( ) , 
681+             has_enzyme :  Default :: default ( ) , 
682+             channel :  Default :: default ( ) , 
683+             git_hash :  Default :: default ( ) , 
684+             cc :  Default :: default ( ) , 
685+             cxx :  Default :: default ( ) , 
686+             cflags :  Default :: default ( ) , 
687+             cxxflags :  Default :: default ( ) , 
688+             ar :  Default :: default ( ) , 
689+             target_linker :  Default :: default ( ) , 
690+             host_linker :  Default :: default ( ) , 
691+             llvm_components :  Default :: default ( ) , 
692+             nodejs :  Default :: default ( ) , 
693+             npm :  Default :: default ( ) , 
694+             force_rerun :  Default :: default ( ) , 
695+             only_modified :  Default :: default ( ) , 
696+             target_cfgs :  Default :: default ( ) , 
697+             builtin_cfg_names :  Default :: default ( ) , 
698+             supported_crate_types :  Default :: default ( ) , 
699+             nocapture :  Default :: default ( ) , 
700+             nightly_branch :  Default :: default ( ) , 
701+             git_merge_commit_email :  Default :: default ( ) , 
702+             profiler_runtime :  Default :: default ( ) , 
703+             diff_command :  Default :: default ( ) , 
704+             minicore_path :  Default :: default ( ) , 
705+         } 
706+     } 
707+ 
656708    /// FIXME: this run scheme is... confusing. 
657709pub  fn  run_enabled ( & self )  -> bool  { 
658710        self . run . unwrap_or_else ( || { 
0 commit comments