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