Skip to content

Commit c09083c

Browse files
author
Clar Charr
committed
Fix for #39596: sort Trait1 before Trait2.
1 parent 134c4a0 commit c09083c

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

src/librustdoc/html/render.rs

+49-1
Original file line numberDiff line numberDiff line change
@@ -1700,6 +1700,23 @@ fn document_stability(w: &mut fmt::Formatter, cx: &Context, item: &clean::Item)
17001700
Ok(())
17011701
}
17021702

1703+
fn name_key(name: &str) -> (&str, u64, usize) {
1704+
// find number at end
1705+
let split = name.bytes().rposition(|b| b < b'0' || b'9' < b).map_or(0, |s| s + 1);
1706+
1707+
// count leading zeroes
1708+
let after_zeroes =
1709+
name[split..].bytes().position(|b| b != b'0').map_or(name.len(), |extra| split + extra);
1710+
1711+
// sort leading zeroes last
1712+
let num_zeroes = after_zeroes - split;
1713+
1714+
match name[split..].parse() {
1715+
Ok(n) => (&name[..split], n, num_zeroes),
1716+
Err(_) => (name, 0, num_zeroes),
1717+
}
1718+
}
1719+
17031720
fn item_module(w: &mut fmt::Formatter, cx: &Context,
17041721
item: &clean::Item, items: &[clean::Item]) -> fmt::Result {
17051722
document(w, cx, item)?;
@@ -1744,7 +1761,9 @@ fn item_module(w: &mut fmt::Formatter, cx: &Context,
17441761
(Some(stability::Stable), Some(stability::Unstable)) => return Ordering::Less,
17451762
_ => {}
17461763
}
1747-
i1.name.cmp(&i2.name)
1764+
let lhs = i1.name.as_ref().map_or("", |s| &**s);
1765+
let rhs = i2.name.as_ref().map_or("", |s| &**s);
1766+
name_key(lhs).cmp(&name_key(rhs))
17481767
}
17491768

17501769
indices.sort_by(|&i1, &i2| cmp(&items[i1], &items[i2], i1, i2));
@@ -3198,3 +3217,32 @@ fn test_unique_id() {
31983217
reset_ids(true);
31993218
test();
32003219
}
3220+
3221+
#[cfg(test)]
3222+
#[test]
3223+
fn test_name_key() {
3224+
assert_eq!(name_key("0"), ("", 0, 1));
3225+
assert_eq!(name_key("123"), ("", 123, 0));
3226+
assert_eq!(name_key("Fruit"), ("Fruit", 0, 0));
3227+
assert_eq!(name_key("Fruit0"), ("Fruit", 0, 1));
3228+
assert_eq!(name_key("Fruit0000"), ("Fruit", 0, 4));
3229+
assert_eq!(name_key("Fruit01"), ("Fruit", 1, 1));
3230+
assert_eq!(name_key("Fruit10"), ("Fruit", 10, 0));
3231+
assert_eq!(name_key("Fruit123"), ("Fruit", 123, 0));
3232+
}
3233+
3234+
#[cfg(test)]
3235+
#[test]
3236+
fn test_name_sorting() {
3237+
let names = ["Apple",
3238+
"Banana",
3239+
"Fruit", "Fruit0", "Fruit00",
3240+
"Fruit1", "Fruit01",
3241+
"Fruit2", "Fruit02",
3242+
"Fruit20",
3243+
"Fruit100",
3244+
"Pear"];
3245+
let mut sorted = names.to_owned();
3246+
sorted.sort_by_key(|&s| name_key(s));
3247+
assert_eq!(names, sorted);
3248+
}

0 commit comments

Comments
 (0)