1
Fork 0

Rollup merge of #58143 - GuillaumeGomez:sort-elements-in-sidebar, r=QuietMisdreavus

Sort elements in the sidebar

Fixes #57448.

Not sorting fields or variants though.

r? @QuietMisdreavus
This commit is contained in:
Guillaume Gomez 2019-02-07 14:28:37 +01:00 committed by GitHub
commit 2c9f1f5750
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -4480,15 +4480,17 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
{ {
let used_links_bor = Rc::new(RefCell::new(&mut used_links)); let used_links_bor = Rc::new(RefCell::new(&mut used_links));
let ret = v.iter() let mut ret = v.iter()
.filter(|i| i.inner_impl().trait_.is_none()) .filter(|i| i.inner_impl().trait_.is_none())
.flat_map(move |i| get_methods(i.inner_impl(), .flat_map(move |i| get_methods(i.inner_impl(),
false, false,
&mut used_links_bor.borrow_mut())) &mut used_links_bor.borrow_mut()))
.collect::<String>(); .collect::<Vec<_>>();
// We want links' order to be reproducible so we don't use unstable sort.
ret.sort();
if !ret.is_empty() { if !ret.is_empty() {
out.push_str(&format!("<a class=\"sidebar-title\" href=\"#methods\">Methods\ out.push_str(&format!("<a class=\"sidebar-title\" href=\"#methods\">Methods\
</a><div class=\"sidebar-links\">{}</div>", ret)); </a><div class=\"sidebar-links\">{}</div>", ret.join("")));
} }
} }
@ -4512,40 +4514,47 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
impl_.inner_impl().trait_.as_ref().unwrap())), impl_.inner_impl().trait_.as_ref().unwrap())),
Escape(&format!("{:#}", target)))); Escape(&format!("{:#}", target))));
out.push_str("</a>"); out.push_str("</a>");
let ret = impls.iter() let mut ret = impls.iter()
.filter(|i| i.inner_impl().trait_.is_none()) .filter(|i| i.inner_impl().trait_.is_none())
.flat_map(|i| get_methods(i.inner_impl(), .flat_map(|i| get_methods(i.inner_impl(),
true, true,
&mut used_links)) &mut used_links))
.collect::<String>(); .collect::<Vec<_>>();
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", ret)); // We want links' order to be reproducible so we don't use unstable sort.
ret.sort();
if !ret.is_empty() {
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>",
ret.join("")));
}
} }
} }
} }
let format_impls = |impls: Vec<&Impl>| { let format_impls = |impls: Vec<&Impl>| {
let mut links = FxHashSet::default(); let mut links = FxHashSet::default();
impls.iter() let mut ret = impls.iter()
.filter_map(|i| { .filter_map(|i| {
let is_negative_impl = is_negative_impl(i.inner_impl()); let is_negative_impl = is_negative_impl(i.inner_impl());
if let Some(ref i) = i.inner_impl().trait_ { if let Some(ref i) = i.inner_impl().trait_ {
let i_display = format!("{:#}", i); let i_display = format!("{:#}", i);
let out = Escape(&i_display); let out = Escape(&i_display);
let encoded = small_url_encode(&format!("{:#}", i)); let encoded = small_url_encode(&format!("{:#}", i));
let generated = format!("<a href=\"#impl-{}\">{}{}</a>", let generated = format!("<a href=\"#impl-{}\">{}{}</a>",
encoded, encoded,
if is_negative_impl { "!" } else { "" }, if is_negative_impl { "!" } else { "" },
out); out);
if links.insert(generated.clone()) { if links.insert(generated.clone()) {
Some(generated) Some(generated)
} else { } else {
None None
} }
} else { } else {
None None
} }
}) })
.collect::<String>() .collect::<Vec<String>>();
ret.sort();
ret.join("")
}; };
let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = v let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = v
@ -4647,29 +4656,29 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
} }
}) })
.collect::<String>(); .collect::<String>();
let required = t.items let mut required = t.items
.iter() .iter()
.filter_map(|m| { .filter_map(|m| {
match m.name { match m.name {
Some(ref name) if m.is_ty_method() => { Some(ref name) if m.is_ty_method() => {
Some(format!("<a href=\"#tymethod.{name}\">{name}</a>", Some(format!("<a href=\"#tymethod.{name}\">{name}</a>",
name=name)) name=name))
}
_ => None,
} }
_ => None, })
} .collect::<Vec<String>>();
}) let mut provided = t.items
.collect::<String>(); .iter()
let provided = t.items .filter_map(|m| {
.iter() match m.name {
.filter_map(|m| { Some(ref name) if m.is_method() => {
match m.name { Some(format!("<a href=\"#method.{0}\">{0}</a>", name))
Some(ref name) if m.is_method() => { }
Some(format!("<a href=\"#method.{name}\">{name}</a>", name=name)) _ => None,
} }
_ => None, })
} .collect::<Vec<String>>();
})
.collect::<String>();
if !types.is_empty() { if !types.is_empty() {
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#associated-types\">\ sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#associated-types\">\
@ -4682,38 +4691,41 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
consts)); consts));
} }
if !required.is_empty() { if !required.is_empty() {
required.sort();
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#required-methods\">\ sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#required-methods\">\
Required Methods</a><div class=\"sidebar-links\">{}</div>", Required Methods</a><div class=\"sidebar-links\">{}</div>",
required)); required.join("")));
} }
if !provided.is_empty() { if !provided.is_empty() {
provided.sort();
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#provided-methods\">\ sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#provided-methods\">\
Provided Methods</a><div class=\"sidebar-links\">{}</div>", Provided Methods</a><div class=\"sidebar-links\">{}</div>",
provided)); provided.join("")));
} }
let c = cache(); let c = cache();
if let Some(implementors) = c.implementors.get(&it.def_id) { if let Some(implementors) = c.implementors.get(&it.def_id) {
let res = implementors.iter() let mut res = implementors.iter()
.filter(|i| i.inner_impl().for_.def_id() .filter(|i| i.inner_impl().for_.def_id()
.map_or(false, |d| !c.paths.contains_key(&d))) .map_or(false, |d| !c.paths.contains_key(&d)))
.filter_map(|i| { .filter_map(|i| {
match extract_for_impl_name(&i.impl_item) { match extract_for_impl_name(&i.impl_item) {
Some((ref name, ref url)) => { Some((ref name, ref url)) => {
Some(format!("<a href=\"#impl-{}\">{}</a>", Some(format!("<a href=\"#impl-{}\">{}</a>",
small_url_encode(url), small_url_encode(url),
Escape(name))) Escape(name)))
}
_ => None,
} }
_ => None, })
} .collect::<Vec<String>>();
})
.collect::<String>();
if !res.is_empty() { if !res.is_empty() {
res.sort();
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#foreign-impls\">\ sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#foreign-impls\">\
Implementations on Foreign Types</a><div \ Implementations on Foreign Types</a><div \
class=\"sidebar-links\">{}</div>", class=\"sidebar-links\">{}</div>",
res)); res.join("")));
} }
} }