diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustdoc/html/render/print_item.rs | 17 | ||||
| -rw-r--r-- | src/librustdoc/html/render/search_index.rs | 16 | ||||
| -rw-r--r-- | src/librustdoc/html/url_parts_builder.rs | 17 |
3 files changed, 29 insertions, 21 deletions
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 02ee34aaac6..aca2eb53c11 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -12,7 +12,7 @@ use rustc_hir::def_id::DefId; use rustc_index::IndexVec; use rustc_middle::ty::{self, TyCtxt}; use rustc_span::hygiene::MacroKind; -use rustc_span::symbol::{Symbol, sym}; +use rustc_span::symbol::{InternerInner, Symbol, sym}; use tracing::{debug, info}; use super::type_layout::document_type_layout; @@ -333,7 +333,12 @@ fn item_module(cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) -> i } } - fn cmp(i1: &clean::Item, i2: &clean::Item, tcx: TyCtxt<'_>) -> Ordering { + fn cmp( + i1: &clean::Item, + i2: &clean::Item, + interner: &InternerInner, + tcx: TyCtxt<'_>, + ) -> Ordering { let rty1 = reorder(i1.type_()); let rty2 = reorder(i2.type_()); if rty1 != rty2 { @@ -349,7 +354,9 @@ fn item_module(cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) -> i return is_stable2.cmp(&is_stable1); } match (i1.name, i2.name) { - (Some(name1), Some(name2)) => compare_names(name1.as_str(), name2.as_str()), + (Some(name1), Some(name2)) => { + compare_names(interner.get_str(name1), interner.get_str(name2)) + } (Some(_), None) => Ordering::Greater, (None, Some(_)) => Ordering::Less, (None, None) => Ordering::Equal, @@ -360,7 +367,9 @@ fn item_module(cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) -> i match cx.shared.module_sorting { ModuleSorting::Alphabetical => { - not_stripped_items.sort_by(|(_, i1), (_, i2)| cmp(i1, i2, tcx)); + Symbol::with_interner(|interner| { + not_stripped_items.sort_by(|(_, i1), (_, i2)| cmp(i1, i2, interner, tcx)); + }); } ModuleSorting::DeclarationOrder => {} } diff --git a/src/librustdoc/html/render/search_index.rs b/src/librustdoc/html/render/search_index.rs index 3c9be29ccc3..6f1765a598b 100644 --- a/src/librustdoc/html/render/search_index.rs +++ b/src/librustdoc/html/render/search_index.rs @@ -105,12 +105,16 @@ pub(crate) fn build_index( let mut aliases: BTreeMap<String, Vec<usize>> = BTreeMap::new(); // Sort search index items. This improves the compressibility of the search index. - cache.search_index.sort_unstable_by(|k1, k2| { - // `sort_unstable_by_key` produces lifetime errors - // HACK(rustdoc): should not be sorting `CrateNum` or `DefIndex`, this will soon go away, too - let k1 = (&k1.path, k1.name.as_str(), &k1.ty, k1.parent.map(|id| (id.index, id.krate))); - let k2 = (&k2.path, k2.name.as_str(), &k2.ty, k2.parent.map(|id| (id.index, id.krate))); - Ord::cmp(&k1, &k2) + Symbol::with_interner(|inner| { + cache.search_index.sort_unstable_by(|k1, k2| { + // `sort_unstable_by_key` produces lifetime errors + // HACK(rustdoc): should not be sorting `CrateNum` or `DefIndex`, this will soon go + // away, too + let pair = |k: &IndexItem| k.parent.map(|id| (id.index, id.krate)); + let k1 = (&k1.path, inner.get_str(k1.name), &k1.ty, pair(k1)); + let k2 = (&k2.path, inner.get_str(k2.name), &k2.ty, pair(k2)); + Ord::cmp(&k1, &k2) + }); }); // Set up alias indexes. diff --git a/src/librustdoc/html/url_parts_builder.rs b/src/librustdoc/html/url_parts_builder.rs index 705fa498e8d..09368d69e45 100644 --- a/src/librustdoc/html/url_parts_builder.rs +++ b/src/librustdoc/html/url_parts_builder.rs @@ -146,22 +146,17 @@ impl<'a> Extend<&'a str> for UrlPartsBuilder { impl FromIterator<Symbol> for UrlPartsBuilder { fn from_iter<T: IntoIterator<Item = Symbol>>(iter: T) -> Self { - // This code has to be duplicated from the `&str` impl because of - // `Symbol::as_str`'s lifetimes. - let iter = iter.into_iter(); - let mut builder = Self::with_capacity_bytes(AVG_PART_LENGTH * iter.size_hint().0); - iter.for_each(|part| builder.push(part.as_str())); - builder + Symbol::with_interner(|interner| { + UrlPartsBuilder::from_iter(iter.into_iter().map(|sym| interner.get_str(sym))) + }) } } impl Extend<Symbol> for UrlPartsBuilder { fn extend<T: IntoIterator<Item = Symbol>>(&mut self, iter: T) { - // This code has to be duplicated from the `&str` impl because of - // `Symbol::as_str`'s lifetimes. - let iter = iter.into_iter(); - self.buf.reserve(AVG_PART_LENGTH * iter.size_hint().0); - iter.for_each(|part| self.push(part.as_str())); + Symbol::with_interner(|interner| { + self.extend(iter.into_iter().map(|sym| interner.get_str(sym))) + }) } } |
