@@ -407,13 +407,33 @@ pub struct Collector {
407407    pub  tests :  Vec < testing:: TestDescAndFn > , 
408408    // to be removed when hoedown will be definitely gone 
409409    pub  old_tests :  HashMap < String ,  Vec < String > > , 
410+ 
411+     // The name of the test displayed to the user, separated by `::`. 
412+     // 
413+     // In tests from Rust source, this is the path to the item 
414+     // e.g. `["std", "vec", "Vec", "push"]`. 
415+     // 
416+     // In tests from a markdown file, this is the titles of all headers (h1~h6) 
417+     // of the sections that contain the code block, e.g. if the markdown file is 
418+     // written as: 
419+     // 
420+     // ``````markdown 
421+     // # Title 
422+     // 
423+     // ## Subtitle 
424+     // 
425+     // ```rust 
426+     // assert!(true); 
427+     // ``` 
428+     // `````` 
429+     // 
430+     // the `names` vector of that test will be `["Title", "Subtitle"]`. 
410431    names :  Vec < String > , 
432+ 
411433    cfgs :  Vec < String > , 
412434    libs :  SearchPaths , 
413435    externs :  Externs , 
414-     cnt :  usize , 
415436    use_headers :  bool , 
416-     current_header :  Option < String > , 
417437    cratename :  String , 
418438    opts :  TestOptions , 
419439    maybe_sysroot :  Option < PathBuf > , 
@@ -436,9 +456,7 @@ impl Collector {
436456            cfgs, 
437457            libs, 
438458            externs, 
439-             cnt :  0 , 
440459            use_headers, 
441-             current_header :  None , 
442460            cratename, 
443461            opts, 
444462            maybe_sysroot, 
@@ -450,28 +468,12 @@ impl Collector {
450468    } 
451469
452470    fn  generate_name ( & self ,  line :  usize ,  filename :  & str )  -> String  { 
453-         if  self . use_headers  { 
454-             if  let  Some ( ref  header)  = self . current_header  { 
455-                 format ! ( "{} - {} (line {})" ,  filename,  header,  line) 
456-             }  else  { 
457-                 format ! ( "{} - (line {})" ,  filename,  line) 
458-             } 
459-         }  else  { 
460-             format ! ( "{} - {} (line {})" ,  filename,  self . names. join( "::" ) ,  line) 
461-         } 
471+         format ! ( "{} - {} (line {})" ,  filename,  self . names. join( "::" ) ,  line) 
462472    } 
463473
464474    // to be removed once hoedown is gone 
465475    fn  generate_name_beginning ( & self ,  filename :  & str )  -> String  { 
466-         if  self . use_headers  { 
467-             if  let  Some ( ref  header)  = self . current_header  { 
468-                 format ! ( "{} - {} (line" ,  filename,  header) 
469-             }  else  { 
470-                 format ! ( "{} - (line" ,  filename) 
471-             } 
472-         }  else  { 
473-             format ! ( "{} - {} (line" ,  filename,  self . names. join( "::" ) ) 
474-         } 
476+         format ! ( "{} - {} (line" ,  filename,  self . names. join( "::" ) ) 
475477    } 
476478
477479    pub  fn  add_old_test ( & mut  self ,  test :  String ,  filename :  String )  { 
@@ -580,7 +582,7 @@ impl Collector {
580582    } 
581583
582584    pub  fn  register_header ( & mut  self ,  name :  & str ,  level :  u32 )  { 
583-         if  self . use_headers  && level ==  1   { 
585+         if  self . use_headers  { 
584586            // we use these headings as test names, so it's good if 
585587            // they're valid identifiers. 
586588            let  name = name. chars ( ) . enumerate ( ) . map ( |( i,  c) | { 
@@ -592,9 +594,28 @@ impl Collector {
592594                    } 
593595                } ) . collect :: < String > ( ) ; 
594596
595-             // new header => reset count. 
596-             self . cnt  = 0 ; 
597-             self . current_header  = Some ( name) ; 
597+             // Here we try to efficiently assemble the header titles into the 
598+             // test name in the form of `h1::h2::h3::h4::h5::h6`. 
599+             // 
600+             // Suppose originally `self.names` contains `[h1, h2, h3]`... 
601+             let  level = level as  usize ; 
602+             if  level <= self . names . len ( )  { 
603+                 // ... Consider `level == 2`. All headers in the lower levels 
604+                 // are irrelevant in this new level. So we should reset 
605+                 // `self.names` to contain headers until <h2>, and replace that 
606+                 // slot with the new name: `[h1, name]`. 
607+                 self . names . truncate ( level) ; 
608+                 self . names [ level - 1 ]  = name; 
609+             }  else  { 
610+                 // ... On the other hand, consider `level == 5`. This means we 
611+                 // need to extend `self.names` to contain five headers. We fill 
612+                 // in the missing level (<h4>) with `_`. Thus `self.names` will 
613+                 // become `[h1, h2, h3, "_", name]`. 
614+                 if  level - 1  > self . names . len ( )  { 
615+                     self . names . resize ( level - 1 ,  "_" . to_owned ( ) ) ; 
616+                 } 
617+                 self . names . push ( name) ; 
618+             } 
598619        } 
599620    } 
600621} 
@@ -625,7 +646,6 @@ impl<'a, 'hir> HirCollector<'a, 'hir> {
625646        attrs. collapse_doc_comments ( ) ; 
626647        attrs. unindent_doc_comments ( ) ; 
627648        if  let  Some ( doc)  = attrs. doc_value ( )  { 
628-             self . collector . cnt  = 0 ; 
629649            if  self . collector . render_type  == RenderType :: Pulldown  { 
630650                markdown:: old_find_testable_code ( doc,  self . collector , 
631651                                                 attrs. span . unwrap_or ( DUMMY_SP ) ) ; 
0 commit comments