Skip to content

Commit

Permalink
rustdoc: Optimize impl sorting during rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
petrochenkov committed Mar 20, 2023
1 parent 13b7aa4 commit 4d55aff
Showing 1 changed file with 20 additions and 7 deletions.
27 changes: 20 additions & 7 deletions src/librustdoc/html/render/print_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -880,8 +880,8 @@ fn item_trait(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &clean:
let (mut synthetic, mut concrete): (Vec<&&Impl>, Vec<&&Impl>) =
local.iter().partition(|i| i.inner_impl().kind.is_auto());

synthetic.sort_by(|a, b| compare_impl(a, b, cx));
concrete.sort_by(|a, b| compare_impl(a, b, cx));
synthetic.sort_by_cached_key(|i| ImplString::new(i, cx));
concrete.sort_by_cached_key(|i| ImplString::new(i, cx));

if !foreign.is_empty() {
write_small_section_header(w, "foreign-impls", "Implementations on Foreign Types", "");
Expand Down Expand Up @@ -1597,12 +1597,25 @@ where
w.write_str("</code></pre>");
}

fn compare_impl<'a, 'b>(lhs: &'a &&Impl, rhs: &'b &&Impl, cx: &Context<'_>) -> Ordering {
let lhss = format!("{}", lhs.inner_impl().print(false, cx));
let rhss = format!("{}", rhs.inner_impl().print(false, cx));
#[derive(PartialEq, Eq)]
struct ImplString(String);

// lhs and rhs are formatted as HTML, which may be unnecessary
compare_names(&lhss, &rhss)
impl ImplString {
fn new(i: &Impl, cx: &Context<'_>) -> ImplString {
ImplString(format!("{}", i.inner_impl().print(false, cx)))
}
}

impl PartialOrd for ImplString {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(Ord::cmp(self, other))
}
}

impl Ord for ImplString {
fn cmp(&self, other: &Self) -> Ordering {
compare_names(&self.0, &other.0)
}
}

fn render_implementor(
Expand Down

0 comments on commit 4d55aff

Please sign in to comment.