Skip to content

Commit c40fa32

Browse files
sort elements in the sidebar
1 parent 19f8958 commit c40fa32

File tree

1 file changed

+84
-72
lines changed

1 file changed

+84
-72
lines changed

src/librustdoc/html/render.rs

+84-72
Original file line numberDiff line numberDiff line change
@@ -4470,15 +4470,17 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
44704470

44714471
{
44724472
let used_links_bor = Rc::new(RefCell::new(&mut used_links));
4473-
let ret = v.iter()
4474-
.filter(|i| i.inner_impl().trait_.is_none())
4475-
.flat_map(move |i| get_methods(i.inner_impl(),
4476-
false,
4477-
&mut used_links_bor.borrow_mut()))
4478-
.collect::<String>();
4473+
let mut ret = v.iter()
4474+
.filter(|i| i.inner_impl().trait_.is_none())
4475+
.flat_map(move |i| get_methods(i.inner_impl(),
4476+
false,
4477+
&mut used_links_bor.borrow_mut()))
4478+
.collect::<Vec<_>>();
4479+
// We want links' order to be reproducible so we don't use unstable sort.
4480+
ret.sort();
44794481
if !ret.is_empty() {
44804482
out.push_str(&format!("<a class=\"sidebar-title\" href=\"#methods\">Methods\
4481-
</a><div class=\"sidebar-links\">{}</div>", ret));
4483+
</a><div class=\"sidebar-links\">{}</div>", ret.join("")));
44824484
}
44834485
}
44844486

@@ -4502,40 +4504,47 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
45024504
impl_.inner_impl().trait_.as_ref().unwrap())),
45034505
Escape(&format!("{:#}", target))));
45044506
out.push_str("</a>");
4505-
let ret = impls.iter()
4506-
.filter(|i| i.inner_impl().trait_.is_none())
4507-
.flat_map(|i| get_methods(i.inner_impl(),
4508-
true,
4509-
&mut used_links))
4510-
.collect::<String>();
4511-
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", ret));
4507+
let mut ret = impls.iter()
4508+
.filter(|i| i.inner_impl().trait_.is_none())
4509+
.flat_map(|i| get_methods(i.inner_impl(),
4510+
true,
4511+
&mut used_links))
4512+
.collect::<Vec<_>>();
4513+
// We want links' order to be reproducible so we don't use unstable sort.
4514+
ret.sort();
4515+
if !ret.is_empty() {
4516+
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>",
4517+
ret.join("")));
4518+
}
45124519
}
45134520
}
45144521
}
45154522
let format_impls = |impls: Vec<&Impl>| {
45164523
let mut links = FxHashSet::default();
45174524

4518-
impls.iter()
4519-
.filter_map(|i| {
4520-
let is_negative_impl = is_negative_impl(i.inner_impl());
4521-
if let Some(ref i) = i.inner_impl().trait_ {
4522-
let i_display = format!("{:#}", i);
4523-
let out = Escape(&i_display);
4524-
let encoded = small_url_encode(&format!("{:#}", i));
4525-
let generated = format!("<a href=\"#impl-{}\">{}{}</a>",
4526-
encoded,
4527-
if is_negative_impl { "!" } else { "" },
4528-
out);
4529-
if links.insert(generated.clone()) {
4530-
Some(generated)
4531-
} else {
4532-
None
4533-
}
4534-
} else {
4535-
None
4536-
}
4537-
})
4538-
.collect::<String>()
4525+
let mut ret = impls.iter()
4526+
.filter_map(|i| {
4527+
let is_negative_impl = is_negative_impl(i.inner_impl());
4528+
if let Some(ref i) = i.inner_impl().trait_ {
4529+
let i_display = format!("{:#}", i);
4530+
let out = Escape(&i_display);
4531+
let encoded = small_url_encode(&format!("{:#}", i));
4532+
let generated = format!("<a href=\"#impl-{}\">{}{}</a>",
4533+
encoded,
4534+
if is_negative_impl { "!" } else { "" },
4535+
out);
4536+
if links.insert(generated.clone()) {
4537+
Some(generated)
4538+
} else {
4539+
None
4540+
}
4541+
} else {
4542+
None
4543+
}
4544+
})
4545+
.collect::<Vec<String>>();
4546+
ret.sort();
4547+
ret.join("")
45394548
};
45404549

45414550
let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = v
@@ -4637,29 +4646,29 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
46374646
}
46384647
})
46394648
.collect::<String>();
4640-
let required = t.items
4641-
.iter()
4642-
.filter_map(|m| {
4643-
match m.name {
4644-
Some(ref name) if m.is_ty_method() => {
4645-
Some(format!("<a href=\"#tymethod.{name}\">{name}</a>",
4646-
name=name))
4649+
let mut required = t.items
4650+
.iter()
4651+
.filter_map(|m| {
4652+
match m.name {
4653+
Some(ref name) if m.is_ty_method() => {
4654+
Some(format!("<a href=\"#tymethod.{name}\">{name}</a>",
4655+
name=name))
4656+
}
4657+
_ => None,
46474658
}
4648-
_ => None,
4649-
}
4650-
})
4651-
.collect::<String>();
4652-
let provided = t.items
4653-
.iter()
4654-
.filter_map(|m| {
4655-
match m.name {
4656-
Some(ref name) if m.is_method() => {
4657-
Some(format!("<a href=\"#method.{name}\">{name}</a>", name=name))
4659+
})
4660+
.collect::<Vec<String>>();
4661+
let mut provided = t.items
4662+
.iter()
4663+
.filter_map(|m| {
4664+
match m.name {
4665+
Some(ref name) if m.is_method() => {
4666+
Some(format!("<a href=\"#method.{0}\">{0}</a>", name))
4667+
}
4668+
_ => None,
46584669
}
4659-
_ => None,
4660-
}
4661-
})
4662-
.collect::<String>();
4670+
})
4671+
.collect::<Vec<String>>();
46634672

46644673
if !types.is_empty() {
46654674
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#associated-types\">\
@@ -4672,38 +4681,41 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
46724681
consts));
46734682
}
46744683
if !required.is_empty() {
4684+
required.sort();
46754685
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#required-methods\">\
46764686
Required Methods</a><div class=\"sidebar-links\">{}</div>",
4677-
required));
4687+
required.join("")));
46784688
}
46794689
if !provided.is_empty() {
4690+
provided.sort();
46804691
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#provided-methods\">\
46814692
Provided Methods</a><div class=\"sidebar-links\">{}</div>",
4682-
provided));
4693+
provided.join("")));
46834694
}
46844695

46854696
let c = cache();
46864697

46874698
if let Some(implementors) = c.implementors.get(&it.def_id) {
4688-
let res = implementors.iter()
4689-
.filter(|i| i.inner_impl().for_.def_id()
4690-
.map_or(false, |d| !c.paths.contains_key(&d)))
4691-
.filter_map(|i| {
4692-
match extract_for_impl_name(&i.impl_item) {
4693-
Some((ref name, ref url)) => {
4694-
Some(format!("<a href=\"#impl-{}\">{}</a>",
4695-
small_url_encode(url),
4696-
Escape(name)))
4699+
let mut res = implementors.iter()
4700+
.filter(|i| i.inner_impl().for_.def_id()
4701+
.map_or(false, |d| !c.paths.contains_key(&d)))
4702+
.filter_map(|i| {
4703+
match extract_for_impl_name(&i.impl_item) {
4704+
Some((ref name, ref url)) => {
4705+
Some(format!("<a href=\"#impl-{}\">{}</a>",
4706+
small_url_encode(url),
4707+
Escape(name)))
4708+
}
4709+
_ => None,
46974710
}
4698-
_ => None,
4699-
}
4700-
})
4701-
.collect::<String>();
4711+
})
4712+
.collect::<Vec<String>>();
47024713
if !res.is_empty() {
4714+
res.sort();
47034715
sidebar.push_str(&format!("<a class=\"sidebar-title\" href=\"#foreign-impls\">\
47044716
Implementations on Foreign Types</a><div \
47054717
class=\"sidebar-links\">{}</div>",
4706-
res));
4718+
res.join("")));
47074719
}
47084720
}
47094721

0 commit comments

Comments
 (0)