Skip to content

Commit 581fd27

Browse files
committed
Avoid Box in href_relative_parts.
This reverts part of rust-lang#91948, going back to returning a `UrlPartsBuilder`. It makes the code simpler, and also avoids some allocations.
1 parent 283db70 commit 581fd27

File tree

3 files changed

+20
-25
lines changed

3 files changed

+20
-25
lines changed

src/librustdoc/html/format.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ fn url_parts(
510510
builder.extend(module_fqp.iter().copied());
511511
Ok(builder)
512512
}
513-
ExternalLocation::Local => Ok(href_relative_parts(module_fqp, relative_to).collect()),
513+
ExternalLocation::Local => Ok(href_relative_parts(module_fqp, relative_to)),
514514
ExternalLocation::Unknown => Err(HrefError::DocumentationNotBuilt),
515515
}
516516
}
@@ -587,7 +587,7 @@ pub(crate) fn href_with_root_path(
587587
Some(&(ref fqp, shortty)) => (fqp, shortty, {
588588
let module_fqp = to_module_fqp(shortty, fqp.as_slice());
589589
debug!(?fqp, ?shortty, ?module_fqp);
590-
href_relative_parts(module_fqp, relative_to).collect()
590+
href_relative_parts(module_fqp, relative_to)
591591
}),
592592
None => {
593593
// Associated items are handled differently with "jump to def". The anchor is generated
@@ -619,34 +619,30 @@ pub(crate) fn href(
619619
/// Both paths should only be modules.
620620
/// This is because modules get their own directories; that is, `std::vec` and `std::vec::Vec` will
621621
/// both need `../iter/trait.Iterator.html` to get at the iterator trait.
622-
pub(crate) fn href_relative_parts<'fqp>(
623-
fqp: &'fqp [Symbol],
624-
relative_to_fqp: &[Symbol],
625-
) -> Box<dyn Iterator<Item = Symbol> + 'fqp> {
622+
pub(crate) fn href_relative_parts(fqp: &[Symbol], relative_to_fqp: &[Symbol]) -> UrlPartsBuilder {
626623
for (i, (f, r)) in fqp.iter().zip(relative_to_fqp.iter()).enumerate() {
627624
// e.g. linking to std::iter from std::vec (`dissimilar_part_count` will be 1)
628625
if f != r {
629626
let dissimilar_part_count = relative_to_fqp.len() - i;
630627
let fqp_module = &fqp[i..];
631-
return Box::new(
632-
iter::repeat_n(sym::dotdot, dissimilar_part_count)
633-
.chain(fqp_module.iter().copied()),
634-
);
628+
return iter::repeat_n(sym::dotdot, dissimilar_part_count)
629+
.chain(fqp_module.iter().copied())
630+
.collect();
635631
}
636632
}
637633
match relative_to_fqp.len().cmp(&fqp.len()) {
638634
Ordering::Less => {
639635
// e.g. linking to std::sync::atomic from std::sync
640-
Box::new(fqp[relative_to_fqp.len()..fqp.len()].iter().copied())
636+
fqp[relative_to_fqp.len()..fqp.len()].iter().copied().collect()
641637
}
642638
Ordering::Greater => {
643639
// e.g. linking to std::sync from std::sync::atomic
644640
let dissimilar_part_count = relative_to_fqp.len() - fqp.len();
645-
Box::new(iter::repeat_n(sym::dotdot, dissimilar_part_count))
641+
iter::repeat_n(sym::dotdot, dissimilar_part_count).collect()
646642
}
647643
Ordering::Equal => {
648644
// linking to the same module
649-
Box::new(iter::empty())
645+
UrlPartsBuilder::new()
650646
}
651647
}
652648
}

src/librustdoc/html/tests.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,51 @@
1-
use rustc_span::{Symbol, sym};
1+
use rustc_span::{Symbol, create_default_session_globals_then, sym};
22

33
use crate::html::format::href_relative_parts;
44

5-
fn assert_relative_path(expected: &[Symbol], relative_to_fqp: &[Symbol], fqp: &[Symbol]) {
6-
// No `create_default_session_globals_then` call is needed here because all
7-
// the symbols used are static, and no `Symbol::intern` calls occur.
8-
assert_eq!(expected, href_relative_parts(&fqp, &relative_to_fqp).collect::<Vec<_>>());
5+
fn assert_relative_path(expected: &str, relative_to_fqp: &[Symbol], fqp: &[Symbol]) {
6+
create_default_session_globals_then(|| {
7+
assert_eq!(expected, href_relative_parts(&fqp, &relative_to_fqp).finish());
8+
});
99
}
1010

1111
#[test]
1212
fn href_relative_parts_basic() {
1313
let relative_to_fqp = &[sym::std, sym::vec];
1414
let fqp = &[sym::std, sym::iter];
15-
assert_relative_path(&[sym::dotdot, sym::iter], relative_to_fqp, fqp);
15+
assert_relative_path("../iter", relative_to_fqp, fqp);
1616
}
1717

1818
#[test]
1919
fn href_relative_parts_parent_module() {
2020
let relative_to_fqp = &[sym::std, sym::vec];
2121
let fqp = &[sym::std];
22-
assert_relative_path(&[sym::dotdot], relative_to_fqp, fqp);
22+
assert_relative_path("..", relative_to_fqp, fqp);
2323
}
2424

2525
#[test]
2626
fn href_relative_parts_different_crate() {
2727
let relative_to_fqp = &[sym::std, sym::vec];
2828
let fqp = &[sym::core, sym::iter];
29-
assert_relative_path(&[sym::dotdot, sym::dotdot, sym::core, sym::iter], relative_to_fqp, fqp);
29+
assert_relative_path("../../core/iter", relative_to_fqp, fqp);
3030
}
3131

3232
#[test]
3333
fn href_relative_parts_same_module() {
3434
let relative_to_fqp = &[sym::std, sym::vec];
3535
let fqp = &[sym::std, sym::vec];
36-
assert_relative_path(&[], relative_to_fqp, fqp);
36+
assert_relative_path("", relative_to_fqp, fqp);
3737
}
3838

3939
#[test]
4040
fn href_relative_parts_child_module() {
4141
let relative_to_fqp = &[sym::std];
4242
let fqp = &[sym::std, sym::vec];
43-
assert_relative_path(&[sym::vec], relative_to_fqp, fqp);
43+
assert_relative_path("vec", relative_to_fqp, fqp);
4444
}
4545

4646
#[test]
4747
fn href_relative_parts_root() {
4848
let relative_to_fqp = &[];
4949
let fqp = &[sym::std];
50-
assert_relative_path(&[sym::std], relative_to_fqp, fqp);
50+
assert_relative_path("std", relative_to_fqp, fqp);
5151
}

src/librustdoc/html/url_parts_builder.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ pub(crate) struct UrlPartsBuilder {
1414

1515
impl UrlPartsBuilder {
1616
/// Create an empty buffer.
17-
#[allow(dead_code)]
1817
pub(crate) fn new() -> Self {
1918
Self { buf: String::new() }
2019
}

0 commit comments

Comments
 (0)