@@ -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 ;
@@ -1890,65 +1890,74 @@ pub struct IdMap {
18901890}
18911891
18921892// The map is pre-initialized and cloned each time to avoid reinitializing it repeatedly.
1893- static DEFAULT_ID_MAP : OnceLock < FxHashMap < Cow < ' static , str > , usize > > = OnceLock :: new ( ) ;
1893+ static DEFAULT_ID_MAP : OnceLock < FxHashSet < Cow < ' static , str > > > = OnceLock :: new ( ) ;
18941894
1895- fn init_id_map ( ) -> FxHashMap < Cow < ' static , str > , usize > {
1896- let mut map = FxHashMap :: default ( ) ;
1895+ fn init_id_map ( ) -> FxHashSet < Cow < ' static , str > > {
1896+ let mut map = FxHashSet :: default ( ) ;
18971897 // This is the list of IDs used in JavaScript.
1898- map. insert ( "help" . into ( ) , 1 ) ;
1899- map. insert ( "settings" . into ( ) , 1 ) ;
1900- map. insert ( "not-displayed" . into ( ) , 1 ) ;
1901- map. insert ( "alternative-display" . into ( ) , 1 ) ;
1902- map. insert ( "search" . into ( ) , 1 ) ;
1903- map. insert ( "crate-search" . into ( ) , 1 ) ;
1904- map. insert ( "crate-search-div" . into ( ) , 1 ) ;
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 ( ) ) ;
19051905 // This is the list of IDs used in HTML generated in Rust (including the ones
19061906 // used in tera template files).
1907- map. insert ( "themeStyle" . into ( ) , 1 ) ;
1908- map. insert ( "settings-menu" . into ( ) , 1 ) ;
1909- map. insert ( "help-button" . into ( ) , 1 ) ;
1910- map. insert ( "sidebar-button" . into ( ) , 1 ) ;
1911- map. insert ( "main-content" . into ( ) , 1 ) ;
1912- map. insert ( "toggle-all-docs" . into ( ) , 1 ) ;
1913- map. insert ( "all-types" . into ( ) , 1 ) ;
1914- map. insert ( "default-settings" . into ( ) , 1 ) ;
1915- map. insert ( "sidebar-vars" . into ( ) , 1 ) ;
1916- map. insert ( "copy-path" . into ( ) , 1 ) ;
1917- map. insert ( "rustdoc-toc" . into ( ) , 1 ) ;
1918- map. insert ( "rustdoc-modnav" . into ( ) , 1 ) ;
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 ( ) ) ;
19191919 // This is the list of IDs used by rustdoc sections (but still generated by
19201920 // rustdoc).
1921- map. insert ( "fields" . into ( ) , 1 ) ;
1922- map. insert ( "variants" . into ( ) , 1 ) ;
1923- map. insert ( "implementors-list" . into ( ) , 1 ) ;
1924- map. insert ( "synthetic-implementors-list" . into ( ) , 1 ) ;
1925- map. insert ( "foreign-impls" . into ( ) , 1 ) ;
1926- map. insert ( "implementations" . into ( ) , 1 ) ;
1927- map. insert ( "trait-implementations" . into ( ) , 1 ) ;
1928- map. insert ( "synthetic-implementations" . into ( ) , 1 ) ;
1929- map. insert ( "blanket-implementations" . into ( ) , 1 ) ;
1930- map. insert ( "required-associated-types" . into ( ) , 1 ) ;
1931- map. insert ( "provided-associated-types" . into ( ) , 1 ) ;
1932- map. insert ( "provided-associated-consts" . into ( ) , 1 ) ;
1933- map. insert ( "required-associated-consts" . into ( ) , 1 ) ;
1934- map. insert ( "required-methods" . into ( ) , 1 ) ;
1935- map. insert ( "provided-methods" . into ( ) , 1 ) ;
1936- map. insert ( "dyn-compatibility" . into ( ) , 1 ) ;
1937- map. insert ( "implementors" . into ( ) , 1 ) ;
1938- map. insert ( "synthetic-implementors" . into ( ) , 1 ) ;
1939- map. insert ( "implementations-list" . into ( ) , 1 ) ;
1940- map. insert ( "trait-implementations-list" . into ( ) , 1 ) ;
1941- map. insert ( "synthetic-implementations-list" . into ( ) , 1 ) ;
1942- map. insert ( "blanket-implementations-list" . into ( ) , 1 ) ;
1943- map. insert ( "deref-methods" . into ( ) , 1 ) ;
1944- map. insert ( "layout" . into ( ) , 1 ) ;
1945- map. insert ( "aliased-type" . into ( ) , 1 ) ;
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 ( ) ) ;
19461946 map
19471947}
19481948
19491949impl IdMap {
19501950 pub fn new ( ) -> Self {
1951- IdMap { map : DEFAULT_ID_MAP . get_or_init ( init_id_map) . clone ( ) , existing_footnotes : 0 }
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+ }
19521961 }
19531962
19541963 pub ( crate ) fn derive < S : AsRef < str > + ToString > ( & mut self , candidate : S ) -> String {
@@ -1973,4 +1982,10 @@ impl IdMap {
19731982 closure ( self , & mut existing_footnotes) ;
19741983 self . existing_footnotes = existing_footnotes;
19751984 }
1985+
1986+ pub ( crate ) fn clear ( & mut self ) {
1987+ self . map . clear ( ) ;
1988+ self . init_map ( ) ;
1989+ self . existing_footnotes = 0 ;
1990+ }
19761991}
0 commit comments