diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index 86fb51419c270..c4c3b635b59e0 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -4470,15 +4470,17 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
{
let used_links_bor = Rc::new(RefCell::new(&mut used_links));
- let ret = v.iter()
- .filter(|i| i.inner_impl().trait_.is_none())
- .flat_map(move |i| get_methods(i.inner_impl(),
- false,
- &mut used_links_bor.borrow_mut()))
- .collect::();
+ let mut ret = v.iter()
+ .filter(|i| i.inner_impl().trait_.is_none())
+ .flat_map(move |i| get_methods(i.inner_impl(),
+ false,
+ &mut used_links_bor.borrow_mut()))
+ .collect::>();
+ // We want links' order to be reproducible so we don't use unstable sort.
+ ret.sort();
if !ret.is_empty() {
out.push_str(&format!("", ret));
+ ", ret.join("")));
}
}
@@ -4502,40 +4504,47 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
impl_.inner_impl().trait_.as_ref().unwrap())),
Escape(&format!("{:#}", target))));
out.push_str("");
- let ret = impls.iter()
- .filter(|i| i.inner_impl().trait_.is_none())
- .flat_map(|i| get_methods(i.inner_impl(),
- true,
- &mut used_links))
- .collect::();
- out.push_str(&format!("", ret));
+ let mut ret = impls.iter()
+ .filter(|i| i.inner_impl().trait_.is_none())
+ .flat_map(|i| get_methods(i.inner_impl(),
+ true,
+ &mut used_links))
+ .collect::>();
+ // We want links' order to be reproducible so we don't use unstable sort.
+ ret.sort();
+ if !ret.is_empty() {
+ out.push_str(&format!("",
+ ret.join("")));
+ }
}
}
}
let format_impls = |impls: Vec<&Impl>| {
let mut links = FxHashSet::default();
- impls.iter()
- .filter_map(|i| {
- let is_negative_impl = is_negative_impl(i.inner_impl());
- if let Some(ref i) = i.inner_impl().trait_ {
- let i_display = format!("{:#}", i);
- let out = Escape(&i_display);
- let encoded = small_url_encode(&format!("{:#}", i));
- let generated = format!("{}{}",
- encoded,
- if is_negative_impl { "!" } else { "" },
- out);
- if links.insert(generated.clone()) {
- Some(generated)
- } else {
- None
- }
- } else {
- None
- }
- })
- .collect::()
+ let mut ret = impls.iter()
+ .filter_map(|i| {
+ let is_negative_impl = is_negative_impl(i.inner_impl());
+ if let Some(ref i) = i.inner_impl().trait_ {
+ let i_display = format!("{:#}", i);
+ let out = Escape(&i_display);
+ let encoded = small_url_encode(&format!("{:#}", i));
+ let generated = format!("{}{}",
+ encoded,
+ if is_negative_impl { "!" } else { "" },
+ out);
+ if links.insert(generated.clone()) {
+ Some(generated)
+ } else {
+ None
+ }
+ } else {
+ None
+ }
+ })
+ .collect::>();
+ ret.sort();
+ ret.join("")
};
let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = v
@@ -4637,29 +4646,29 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
}
})
.collect::();
- let required = t.items
- .iter()
- .filter_map(|m| {
- match m.name {
- Some(ref name) if m.is_ty_method() => {
- Some(format!("{name}",
- name=name))
+ let mut required = t.items
+ .iter()
+ .filter_map(|m| {
+ match m.name {
+ Some(ref name) if m.is_ty_method() => {
+ Some(format!("{name}",
+ name=name))
+ }
+ _ => None,
}
- _ => None,
- }
- })
- .collect::();
- let provided = t.items
- .iter()
- .filter_map(|m| {
- match m.name {
- Some(ref name) if m.is_method() => {
- Some(format!("{name}", name=name))
+ })
+ .collect::>();
+ let mut provided = t.items
+ .iter()
+ .filter_map(|m| {
+ match m.name {
+ Some(ref name) if m.is_method() => {
+ Some(format!("{0}", name))
+ }
+ _ => None,
}
- _ => None,
- }
- })
- .collect::();
+ })
+ .collect::>();
if !types.is_empty() {
sidebar.push_str(&format!("",
- required));
+ required.join("")));
}
if !provided.is_empty() {
+ provided.sort();
sidebar.push_str(&format!("",
- provided));
+ provided.join("")));
}
let c = cache();
if let Some(implementors) = c.implementors.get(&it.def_id) {
- let res = implementors.iter()
- .filter(|i| i.inner_impl().for_.def_id()
- .map_or(false, |d| !c.paths.contains_key(&d)))
- .filter_map(|i| {
- match extract_for_impl_name(&i.impl_item) {
- Some((ref name, ref url)) => {
- Some(format!("{}",
- small_url_encode(url),
- Escape(name)))
+ let mut res = implementors.iter()
+ .filter(|i| i.inner_impl().for_.def_id()
+ .map_or(false, |d| !c.paths.contains_key(&d)))
+ .filter_map(|i| {
+ match extract_for_impl_name(&i.impl_item) {
+ Some((ref name, ref url)) => {
+ Some(format!("{}",
+ small_url_encode(url),
+ Escape(name)))
+ }
+ _ => None,
}
- _ => None,
- }
- })
- .collect::();
+ })
+ .collect::>();
if !res.is_empty() {
+ res.sort();
sidebar.push_str(&format!("",
- res));
+ res.join("")));
}
}