@@ -32,7 +32,6 @@ use std::iter::Peekable;
3232use  std:: ops:: { ControlFlow ,  Range } ; 
3333use  std:: path:: PathBuf ; 
3434use  std:: str:: { self ,  CharIndices } ; 
35- use  std:: sync:: OnceLock ; 
3635
3736use  pulldown_cmark:: { 
3837    BrokenLink ,  CodeBlockKind ,  CowStr ,  Event ,  LinkType ,  Options ,  Parser ,  Tag ,  TagEnd ,  html, 
@@ -1886,83 +1885,81 @@ pub(crate) fn rust_code_blocks(md: &str, extra_info: &ExtraInfo<'_>) -> Vec<Rust
18861885#[ derive( Clone ,  Default ,  Debug ) ]  
18871886pub  struct  IdMap  { 
18881887    map :  FxHashMap < Cow < ' static ,  str > ,  usize > , 
1888+     defined_ids :  FxHashSet < & ' static  str > , 
18891889    existing_footnotes :  usize , 
18901890} 
18911891
1892- // The map is pre-initialized and cloned each time to avoid reinitializing it repeatedly. 
1893- static  DEFAULT_ID_MAP :  OnceLock < FxHashSet < Cow < ' static ,  str > > >  = OnceLock :: new ( ) ; 
1894- 
1895- fn  init_id_map ( )  -> FxHashSet < Cow < ' static ,  str > >  { 
1892+ fn  init_id_map ( )  -> FxHashSet < & ' static  str >  { 
18961893    let  mut  map = FxHashSet :: default ( ) ; 
18971894    // This is the list of IDs used in JavaScript. 
1898-     map. insert ( "help" . into ( ) ) ; 
1899-     map. insert ( "settings" . into ( ) ) ; 
1900-     map. insert ( "not-displayed" . into ( ) ) ; 
1901-     map. insert ( "alternative-display" . into ( ) ) ; 
1902-     map. insert ( "search" . into ( ) ) ; 
1903-     map. insert ( "crate-search" . into ( ) ) ; 
1904-     map. insert ( "crate-search-div" . into ( ) ) ; 
1895+     map. insert ( "help" ) ; 
1896+     map. insert ( "settings" ) ; 
1897+     map. insert ( "not-displayed" ) ; 
1898+     map. insert ( "alternative-display" ) ; 
1899+     map. insert ( "search" ) ; 
1900+     map. insert ( "crate-search" ) ; 
1901+     map. insert ( "crate-search-div" ) ; 
19051902    // This is the list of IDs used in HTML generated in Rust (including the ones 
19061903    // used in tera template files). 
1907-     map. insert ( "themeStyle" . into ( ) ) ; 
1908-     map. insert ( "settings-menu" . into ( ) ) ; 
1909-     map. insert ( "help-button" . into ( ) ) ; 
1910-     map. insert ( "sidebar-button" . into ( ) ) ; 
1911-     map. insert ( "main-content" . into ( ) ) ; 
1912-     map. insert ( "toggle-all-docs" . into ( ) ) ; 
1913-     map. insert ( "all-types" . into ( ) ) ; 
1914-     map. insert ( "default-settings" . into ( ) ) ; 
1915-     map. insert ( "sidebar-vars" . into ( ) ) ; 
1916-     map. insert ( "copy-path" . into ( ) ) ; 
1917-     map. insert ( "rustdoc-toc" . into ( ) ) ; 
1918-     map. insert ( "rustdoc-modnav" . into ( ) ) ; 
1904+     map. insert ( "themeStyle" ) ; 
1905+     map. insert ( "settings-menu" ) ; 
1906+     map. insert ( "help-button" ) ; 
1907+     map. insert ( "sidebar-button" ) ; 
1908+     map. insert ( "main-content" ) ; 
1909+     map. insert ( "toggle-all-docs" ) ; 
1910+     map. insert ( "all-types" ) ; 
1911+     map. insert ( "default-settings" ) ; 
1912+     map. insert ( "sidebar-vars" ) ; 
1913+     map. insert ( "copy-path" ) ; 
1914+     map. insert ( "rustdoc-toc" ) ; 
1915+     map. insert ( "rustdoc-modnav" ) ; 
19191916    // This is the list of IDs used by rustdoc sections (but still generated by 
19201917    // rustdoc). 
1921-     map. insert ( "fields" . into ( ) ) ; 
1922-     map. insert ( "variants" . into ( ) ) ; 
1923-     map. insert ( "implementors-list" . into ( ) ) ; 
1924-     map. insert ( "synthetic-implementors-list" . into ( ) ) ; 
1925-     map. insert ( "foreign-impls" . into ( ) ) ; 
1926-     map. insert ( "implementations" . into ( ) ) ; 
1927-     map. insert ( "trait-implementations" . into ( ) ) ; 
1928-     map. insert ( "synthetic-implementations" . into ( ) ) ; 
1929-     map. insert ( "blanket-implementations" . into ( ) ) ; 
1930-     map. insert ( "required-associated-types" . into ( ) ) ; 
1931-     map. insert ( "provided-associated-types" . into ( ) ) ; 
1932-     map. insert ( "provided-associated-consts" . into ( ) ) ; 
1933-     map. insert ( "required-associated-consts" . into ( ) ) ; 
1934-     map. insert ( "required-methods" . into ( ) ) ; 
1935-     map. insert ( "provided-methods" . into ( ) ) ; 
1936-     map. insert ( "dyn-compatibility" . into ( ) ) ; 
1937-     map. insert ( "implementors" . into ( ) ) ; 
1938-     map. insert ( "synthetic-implementors" . into ( ) ) ; 
1939-     map. insert ( "implementations-list" . into ( ) ) ; 
1940-     map. insert ( "trait-implementations-list" . into ( ) ) ; 
1941-     map. insert ( "synthetic-implementations-list" . into ( ) ) ; 
1942-     map. insert ( "blanket-implementations-list" . into ( ) ) ; 
1943-     map. insert ( "deref-methods" . into ( ) ) ; 
1944-     map. insert ( "layout" . into ( ) ) ; 
1945-     map. insert ( "aliased-type" . into ( ) ) ; 
1918+     map. insert ( "fields" ) ; 
1919+     map. insert ( "variants" ) ; 
1920+     map. insert ( "implementors-list" ) ; 
1921+     map. insert ( "synthetic-implementors-list" ) ; 
1922+     map. insert ( "foreign-impls" ) ; 
1923+     map. insert ( "implementations" ) ; 
1924+     map. insert ( "trait-implementations" ) ; 
1925+     map. insert ( "synthetic-implementations" ) ; 
1926+     map. insert ( "blanket-implementations" ) ; 
1927+     map. insert ( "required-associated-types" ) ; 
1928+     map. insert ( "provided-associated-types" ) ; 
1929+     map. insert ( "provided-associated-consts" ) ; 
1930+     map. insert ( "required-associated-consts" ) ; 
1931+     map. insert ( "required-methods" ) ; 
1932+     map. insert ( "provided-methods" ) ; 
1933+     map. insert ( "dyn-compatibility" ) ; 
1934+     map. insert ( "implementors" ) ; 
1935+     map. insert ( "synthetic-implementors" ) ; 
1936+     map. insert ( "implementations-list" ) ; 
1937+     map. insert ( "trait-implementations-list" ) ; 
1938+     map. insert ( "synthetic-implementations-list" ) ; 
1939+     map. insert ( "blanket-implementations-list" ) ; 
1940+     map. insert ( "deref-methods" ) ; 
1941+     map. insert ( "layout" ) ; 
1942+     map. insert ( "aliased-type" ) ; 
19461943    map
19471944} 
19481945
19491946impl  IdMap  { 
19501947    pub  fn  new ( )  -> Self  { 
1951-         let  mut  id_map = IdMap  {  map :  FxHashMap :: default ( ) ,  existing_footnotes :  0  } ; 
1952-         id_map. init_map ( ) ; 
1953-         id_map
1954-     } 
1955- 
1956-     #[ allow( rustc:: potential_query_instability) ]  
1957-     fn  init_map ( & mut  self )  { 
1958-         for  key in  DEFAULT_ID_MAP . get_or_init ( init_id_map) . iter ( )  { 
1959-             self . map . insert ( key. clone ( ) ,  1 ) ; 
1960-         } 
1948+         IdMap  {  map :  FxHashMap :: default ( ) ,  defined_ids :  init_id_map ( ) ,  existing_footnotes :  0  } 
19611949    } 
19621950
19631951    pub ( crate )  fn  derive < S :  AsRef < str >  + ToString > ( & mut  self ,  candidate :  S )  -> String  { 
19641952        let  id = match  self . map . get_mut ( candidate. as_ref ( ) )  { 
1965-             None  => candidate. to_string ( ) , 
1953+             None  => { 
1954+                 let  candidate = candidate. to_string ( ) ; 
1955+                 if  self . defined_ids . contains ( candidate. as_str ( ) )  { 
1956+                     let  id = format ! ( "{}-{}" ,  candidate,  1 ) ; 
1957+                     self . map . insert ( candidate. into ( ) ,  2 ) ; 
1958+                     id
1959+                 }  else  { 
1960+                     candidate. to_string ( ) 
1961+                 } 
1962+             } 
19661963            Some ( a)  => { 
19671964                let  id = format ! ( "{}-{}" ,  candidate. as_ref( ) ,  * a) ; 
19681965                * a += 1 ; 
@@ -1985,7 +1982,6 @@ impl IdMap {
19851982
19861983    pub ( crate )  fn  clear ( & mut  self )  { 
19871984        self . map . clear ( ) ; 
1988-         self . init_map ( ) ; 
19891985        self . existing_footnotes  = 0 ; 
19901986    } 
19911987} 
0 commit comments