@@ -37,7 +37,7 @@ use std::sync::OnceLock;
3737use  pulldown_cmark:: { 
3838    BrokenLink ,  CodeBlockKind ,  CowStr ,  Event ,  LinkType ,  Options ,  Parser ,  Tag ,  TagEnd ,  html, 
3939} ; 
40- use  rustc_data_structures:: fx:: FxHashMap ; 
40+ use  rustc_data_structures:: fx:: { FxHashMap ,   FxHashSet } ; 
4141use  rustc_errors:: { Diag ,  DiagMessage } ; 
4242use  rustc_hir:: def_id:: LocalDefId ; 
4343use  rustc_middle:: ty:: TyCtxt ; 
@@ -1886,71 +1886,81 @@ pub struct IdMap {
18861886    existing_footnotes :  usize , 
18871887} 
18881888
1889- // The map is pre-initialized and cloned each time to avoid reinitializing it repeatedly. 
1890- static  DEFAULT_ID_MAP :  OnceLock < FxHashMap < Cow < ' static ,  str > ,  usize > >  = OnceLock :: new ( ) ; 
1889+ // The map is pre-initialized and then can be used as is to prevent cloning it for each item 
1890+ // (in the sidebar rendering). 
1891+ static  DEFAULT_ID_MAP :  OnceLock < FxHashSet < & ' static  str > >  = OnceLock :: new ( ) ; 
18911892
1892- fn  init_id_map ( )  -> FxHashMap < Cow < ' static ,  str > ,   usize >  { 
1893-     let  mut  map = FxHashMap :: default ( ) ; 
1893+ fn  init_id_map ( )  -> FxHashSet < & ' static  str >  { 
1894+     let  mut  map = FxHashSet :: default ( ) ; 
18941895    // This is the list of IDs used in JavaScript. 
1895-     map. insert ( "help" . into ( ) ,   1 ) ; 
1896-     map. insert ( "settings" . into ( ) ,   1 ) ; 
1897-     map. insert ( "not-displayed" . into ( ) ,   1 ) ; 
1898-     map. insert ( "alternative-display" . into ( ) ,   1 ) ; 
1899-     map. insert ( "search" . into ( ) ,   1 ) ; 
1900-     map. insert ( "crate-search" . into ( ) ,   1 ) ; 
1901-     map. insert ( "crate-search-div" . into ( ) ,   1 ) ; 
1896+     map. insert ( "help" ) ; 
1897+     map. insert ( "settings" ) ; 
1898+     map. insert ( "not-displayed" ) ; 
1899+     map. insert ( "alternative-display" ) ; 
1900+     map. insert ( "search" ) ; 
1901+     map. insert ( "crate-search" ) ; 
1902+     map. insert ( "crate-search-div" ) ; 
19021903    // This is the list of IDs used in HTML generated in Rust (including the ones 
19031904    // used in tera template files). 
1904-     map. insert ( "themeStyle" . into ( ) ,   1 ) ; 
1905-     map. insert ( "settings-menu" . into ( ) ,   1 ) ; 
1906-     map. insert ( "help-button" . into ( ) ,   1 ) ; 
1907-     map. insert ( "sidebar-button" . into ( ) ,   1 ) ; 
1908-     map. insert ( "main-content" . into ( ) ,   1 ) ; 
1909-     map. insert ( "toggle-all-docs" . into ( ) ,   1 ) ; 
1910-     map. insert ( "all-types" . into ( ) ,   1 ) ; 
1911-     map. insert ( "default-settings" . into ( ) ,   1 ) ; 
1912-     map. insert ( "sidebar-vars" . into ( ) ,   1 ) ; 
1913-     map. insert ( "copy-path" . into ( ) ,   1 ) ; 
1914-     map. insert ( "rustdoc-toc" . into ( ) ,   1 ) ; 
1915-     map. insert ( "rustdoc-modnav" . into ( ) ,   1 ) ; 
1905+     map. insert ( "themeStyle" ) ; 
1906+     map. insert ( "settings-menu" ) ; 
1907+     map. insert ( "help-button" ) ; 
1908+     map. insert ( "sidebar-button" ) ; 
1909+     map. insert ( "main-content" ) ; 
1910+     map. insert ( "toggle-all-docs" ) ; 
1911+     map. insert ( "all-types" ) ; 
1912+     map. insert ( "default-settings" ) ; 
1913+     map. insert ( "sidebar-vars" ) ; 
1914+     map. insert ( "copy-path" ) ; 
1915+     map. insert ( "rustdoc-toc" ) ; 
1916+     map. insert ( "rustdoc-modnav" ) ; 
19161917    // This is the list of IDs used by rustdoc sections (but still generated by 
19171918    // rustdoc). 
1918-     map. insert ( "fields" . into ( ) ,   1 ) ; 
1919-     map. insert ( "variants" . into ( ) ,   1 ) ; 
1920-     map. insert ( "implementors-list" . into ( ) ,   1 ) ; 
1921-     map. insert ( "synthetic-implementors-list" . into ( ) ,   1 ) ; 
1922-     map. insert ( "foreign-impls" . into ( ) ,   1 ) ; 
1923-     map. insert ( "implementations" . into ( ) ,   1 ) ; 
1924-     map. insert ( "trait-implementations" . into ( ) ,   1 ) ; 
1925-     map. insert ( "synthetic-implementations" . into ( ) ,   1 ) ; 
1926-     map. insert ( "blanket-implementations" . into ( ) ,   1 ) ; 
1927-     map. insert ( "required-associated-types" . into ( ) ,   1 ) ; 
1928-     map. insert ( "provided-associated-types" . into ( ) ,   1 ) ; 
1929-     map. insert ( "provided-associated-consts" . into ( ) ,   1 ) ; 
1930-     map. insert ( "required-associated-consts" . into ( ) ,   1 ) ; 
1931-     map. insert ( "required-methods" . into ( ) ,   1 ) ; 
1932-     map. insert ( "provided-methods" . into ( ) ,   1 ) ; 
1933-     map. insert ( "dyn-compatibility" . into ( ) ,   1 ) ; 
1934-     map. insert ( "implementors" . into ( ) ,   1 ) ; 
1935-     map. insert ( "synthetic-implementors" . into ( ) ,   1 ) ; 
1936-     map. insert ( "implementations-list" . into ( ) ,   1 ) ; 
1937-     map. insert ( "trait-implementations-list" . into ( ) ,   1 ) ; 
1938-     map. insert ( "synthetic-implementations-list" . into ( ) ,   1 ) ; 
1939-     map. insert ( "blanket-implementations-list" . into ( ) ,   1 ) ; 
1940-     map. insert ( "deref-methods" . into ( ) ,   1 ) ; 
1941-     map. insert ( "layout" . into ( ) ,   1 ) ; 
1942-     map. insert ( "aliased-type" . into ( ) ,   1 ) ; 
1919+     map. insert ( "fields" ) ; 
1920+     map. insert ( "variants" ) ; 
1921+     map. insert ( "implementors-list" ) ; 
1922+     map. insert ( "synthetic-implementors-list" ) ; 
1923+     map. insert ( "foreign-impls" ) ; 
1924+     map. insert ( "implementations" ) ; 
1925+     map. insert ( "trait-implementations" ) ; 
1926+     map. insert ( "synthetic-implementations" ) ; 
1927+     map. insert ( "blanket-implementations" ) ; 
1928+     map. insert ( "required-associated-types" ) ; 
1929+     map. insert ( "provided-associated-types" ) ; 
1930+     map. insert ( "provided-associated-consts" ) ; 
1931+     map. insert ( "required-associated-consts" ) ; 
1932+     map. insert ( "required-methods" ) ; 
1933+     map. insert ( "provided-methods" ) ; 
1934+     map. insert ( "dyn-compatibility" ) ; 
1935+     map. insert ( "implementors" ) ; 
1936+     map. insert ( "synthetic-implementors" ) ; 
1937+     map. insert ( "implementations-list" ) ; 
1938+     map. insert ( "trait-implementations-list" ) ; 
1939+     map. insert ( "synthetic-implementations-list" ) ; 
1940+     map. insert ( "blanket-implementations-list" ) ; 
1941+     map. insert ( "deref-methods" ) ; 
1942+     map. insert ( "layout" ) ; 
1943+     map. insert ( "aliased-type" ) ; 
19431944    map
19441945} 
19451946
19461947impl  IdMap  { 
19471948    pub  fn  new ( )  -> Self  { 
1948-         IdMap  {  map :  DEFAULT_ID_MAP . get_or_init ( init_id_map ) . clone ( ) ,  existing_footnotes :  0  } 
1949+         IdMap  {  map :  FxHashMap :: default ( ) ,  existing_footnotes :  0  } 
19491950    } 
19501951
19511952    pub ( crate )  fn  derive < S :  AsRef < str >  + ToString > ( & mut  self ,  candidate :  S )  -> String  { 
19521953        let  id = match  self . map . get_mut ( candidate. as_ref ( ) )  { 
1953-             None  => candidate. to_string ( ) , 
1954+             None  => { 
1955+                 let  candidate = candidate. to_string ( ) ; 
1956+                 if  DEFAULT_ID_MAP . get_or_init ( init_id_map) . contains ( candidate. as_str ( ) )  { 
1957+                     let  id = format ! ( "{}-{}" ,  candidate,  1 ) ; 
1958+                     self . map . insert ( candidate. into ( ) ,  2 ) ; 
1959+                     id
1960+                 }  else  { 
1961+                     candidate
1962+                 } 
1963+             } 
19541964            Some ( a)  => { 
19551965                let  id = format ! ( "{}-{}" ,  candidate. as_ref( ) ,  * a) ; 
19561966                * a += 1 ; 
@@ -1970,4 +1980,9 @@ impl IdMap {
19701980        closure ( self ,  & mut  existing_footnotes) ; 
19711981        self . existing_footnotes  = existing_footnotes; 
19721982    } 
1983+ 
1984+     pub ( crate )  fn  clear ( & mut  self )  { 
1985+         self . map . clear ( ) ; 
1986+         self . existing_footnotes  = 0 ; 
1987+     } 
19731988} 
0 commit comments