Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
18 changes: 17 additions & 1 deletion src/librustdoc/clean/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -786,7 +786,23 @@ impl Item {

/// Generates the HTML file name based on the item kind.
pub(crate) fn html_filename(&self) -> String {
format!("{type_}.{name}.html", type_ = self.type_(), name = self.name.unwrap())
let type_ = match self.type_() {
ItemType::Struct | ItemType::Union | ItemType::Enum => "type",
type_ => type_.as_str(),
};
format!("{type_}.{name}.html", name = self.name.unwrap())
}

/// Generates the HTML file for the legacy redirect
/// <https://gist.github.com/notriddle/08752eb42289c82a69638d65553571c4>
pub(crate) fn html_redirect_filename(&self) -> Option<String> {
let redirect_type = match self.type_() {
ItemType::Struct => "struct",
ItemType::Union => "union",
ItemType::Enum => "enum",
_ => return None,
};
Some(format!("{redirect_type}.{name}.html", name = self.name.unwrap()))
}

/// Returns a `FnHeader` if `self` is a function item, otherwise returns `None`.
Expand Down
5 changes: 5 additions & 0 deletions src/librustdoc/html/format.rs
Original file line number Diff line number Diff line change
Expand Up @@ -658,6 +658,11 @@ fn make_href(
ItemType::Module => {
url_parts.push("index.html");
}
// <https://gist.github.com/notriddle/08752eb42289c82a69638d65553571c4>
ItemType::Enum | ItemType::Struct | ItemType::Union => {
let last = fqp.last().unwrap();
url_parts.push_fmt(format_args!("type.{last}.html"));
}
_ => {
let last = fqp.last().unwrap();
url_parts.push_fmt(format_args!("{shortty}.{last}.html"));
Expand Down
20 changes: 20 additions & 0 deletions src/librustdoc/html/render/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -809,6 +809,26 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
let redir_dst = self.dst.join(redir_name);
self.shared.fs.write(redir_dst, v)?;
}
} else if let Some(html_redirect_filename) = item.html_redirect_filename() {
if let Some(ref redirections) = self.shared.redirections {
let to_path = fmt::from_fn(|f| {
for name in &self.current {
write!(f, "{name}/")?;
}
write!(f, "{}", item.html_filename())
});
let from_path = fmt::from_fn(|f| {
for name in &self.current {
write!(f, "{name}/")?;
}
write!(f, "{}", html_redirect_filename)
});
redirections.borrow_mut().insert(from_path.to_string(), to_path.to_string());
} else {
let v = layout::redirect(&item.html_filename());
let redir_dst = self.dst.join(html_redirect_filename);
self.shared.fs.write(redir_dst, v)?;
}
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/librustdoc/html/render/print_item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2326,6 +2326,8 @@ pub(super) fn print_item_path(item: &clean::Item) -> impl Display {
pub(super) fn print_ty_path(ty: ItemType, name: &str) -> impl Display {
fmt::from_fn(move |f| match ty {
ItemType::Module => write!(f, "{}index.html", ensure_trailing_slash(name)),
// <https://gist.github.com/notriddle/08752eb42289c82a69638d65553571c4>
ItemType::Struct | ItemType::Enum | ItemType::Union => write!(f, "type.{name}.html"),
_ => write!(f, "{ty}.{name}.html"),
})
}
Expand Down
2 changes: 2 additions & 0 deletions src/librustdoc/html/static/js/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,8 @@ function preLoadCss(cssUrl) {
let path;
if (shortty === "mod") {
path = `${modpath}${name}/index.html`;
} else if (shortty === "struct" || shortty === "enum" || shortty === "union") {
path = `${modpath}type.${name}.html`;
} else if (!isMacro) {
path = `${modpath}${shortty}.${name}.html`;
} else {
Expand Down
15 changes: 13 additions & 2 deletions src/librustdoc/html/static/js/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -2171,6 +2171,17 @@ class DocSearch {
let path = item.modulePath;
let exactPath = item.exactModulePath;

/**
* @param {string} type
* @returns {string}
*/
const normalizeType = type => {
if (type === "struct" || type === "enum" || type === "union") {
return "type";
}
return type;
};

if (type === "mod") {
displayPath = path + "::";
href = this.rootPath + path.replace(/::/g, "/") + "/" +
Expand Down Expand Up @@ -2220,13 +2231,13 @@ class DocSearch {
anchor = item.entry.associatedItemDisambiguatorOrExternCrateUrl + "/" + anchor;
}
href = this.rootPath + path.replace(/::/g, "/") +
"/" + pageType +
"/" + normalizeType(pageType) +
"." + pageName +
".html#" + anchor;
} else {
displayPath = item.modulePath + "::";
href = this.rootPath + item.modulePath.replace(/::/g, "/") +
"/" + type + "." + name + ".html";
"/" + normalizeType(type) + "." + name + ".html";
}
if (item.traitParent) {
const tparent = item.traitParent;
Expand Down
4 changes: 4 additions & 0 deletions src/librustdoc/passes/lint/redundant_explicit_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,10 @@ fn local_href_for_res(cx: &DocContext<'_>, module_id: DefId, res: Res<NodeId>) -
let mut url_parts = href_relative_parts(module_fqp, &current_fqp);
match item_type {
ItemType::Module => url_parts.push("index.html"),
// <https://gist.github.com/notriddle/08752eb42289c82a69638d65553571c4>
ItemType::Enum | ItemType::Struct | ItemType::Union => {
url_parts.push_fmt(format_args!("type.{last}.html", last = fqp.last()?))
}
_ => url_parts.push_fmt(format_args!(
"{}.{last}.html",
item_type.as_str(),
Expand Down
4 changes: 2 additions & 2 deletions tests/rustdoc-gui/fields.goml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ define-function: (
)

call-function: ("check-fields", {
"path": "struct.Struct.html",
"path": "type.Struct.html",
"selector_1": "#structfield\.a",
"selector_2": "#structfield\.b",
})

call-function: ("check-fields", {
"path": "union.Union.html",
"path": "type.Union.html",
"selector_1": "#structfield\.a",
"selector_2": "#structfield\.b",
})
Expand Down
4 changes: 2 additions & 2 deletions tests/rustdoc-gui/go-to-collapsed-elem.goml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ define-function: ("collapsed-from-search", [], block {
// Then we run the search.
call-function: ("open-search", {})
write-into: (".search-input", "foo::must_use")
wait-for: "//*[@id='search']//a[@href='../test_docs/struct.Foo.html#method.must_use']"
click: "//*[@id='search']//a[@href='../test_docs/struct.Foo.html#method.must_use']"
wait-for: "//*[@id='search']//a[@href='../test_docs/type.Foo.html#method.must_use']"
click: "//*[@id='search']//a[@href='../test_docs/type.Foo.html#method.must_use']"
assert-property: ("#implementations-list .implementors-toggle", {"open": "true"})
})

Expand Down
6 changes: 3 additions & 3 deletions tests/rustdoc-gui/item-decl-comment-highlighting.goml
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,17 @@ define-function: (
})
call-function: ("check-item-decl-comment", {
"theme": |theme|,
"url": "file://" + |DOC_PATH| + "/test_docs/private/struct.Struct.html",
"url": "file://" + |DOC_PATH| + "/test_docs/private/type.Struct.html",
"comment_color": |comment_color|,
})
call-function: ("check-item-decl-comment", {
"theme": |theme|,
"url": "file://" + |DOC_PATH| + "/test_docs/private/struct.Tuple.html",
"url": "file://" + |DOC_PATH| + "/test_docs/private/type.Tuple.html",
"comment_color": |comment_color|,
})
call-function: ("check-item-decl-comment", {
"theme": |theme|,
"url": "file://" + |DOC_PATH| + "/test_docs/private/union.Union.html",
"url": "file://" + |DOC_PATH| + "/test_docs/private/type.Union.html",
"comment_color": |comment_color|,
})
call-function: ("check-item-decl-comment", {
Expand Down
12 changes: 6 additions & 6 deletions tests/rustdoc-gui/search-result-impl-disambiguation.goml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ call-function: ("perform-search", {"query": "ZyxwvutMethodDisambiguation -> bool
// Check the disambiguated link.
assert-count: ("a.result-method", 1)
assert-attribute: ("a.result-method", {
"href": "../test_docs/struct.ZyxwvutMethodDisambiguation.html#impl-ZyxwvutMethodDisambiguation/method.method_impl_disambiguation"
"href": "../test_docs/type.ZyxwvutMethodDisambiguation.html#impl-ZyxwvutMethodDisambiguation/method.method_impl_disambiguation"
})
click: "a.result-method"
wait-for: "#impl-ZyxwvutMethodDisambiguation"
assert-document-property: ({
"URL": "struct.ZyxwvutMethodDisambiguation.html#method.method_impl_disambiguation"
"URL": "type.ZyxwvutMethodDisambiguation.html#method.method_impl_disambiguation"
}, ENDS_WITH)
assert: "section:target"

Expand All @@ -26,12 +26,12 @@ call-function: ("perform-search", {"query": "ZyxwvutMethodDisambiguation, usize
// Check the disambiguated link.
assert-count: ("a.result-method", 1)
assert-attribute: ("a.result-method", {
"href": "../test_docs/struct.ZyxwvutMethodDisambiguation.html#impl-ZyxwvutTrait-for-ZyxwvutMethodDisambiguation/method.method_impl_disambiguation"
"href": "../test_docs/type.ZyxwvutMethodDisambiguation.html#impl-ZyxwvutTrait-for-ZyxwvutMethodDisambiguation/method.method_impl_disambiguation"
})
click: "a.result-method"
wait-for: "#impl-ZyxwvutMethodDisambiguation"
assert-document-property: ({
"URL": "struct.ZyxwvutMethodDisambiguation.html#method.method_impl_disambiguation-1"
"URL": "type.ZyxwvutMethodDisambiguation.html#method.method_impl_disambiguation-1"
}, ENDS_WITH)
assert: "section:target"

Expand All @@ -42,7 +42,7 @@ go-to: "file://" + |DOC_PATH| + "/lib2/index.html?search=MultiImplBlockStruct->b
call-function: ("wait-for-search-results", {})
assert-count: ("a.result-method", 1)
assert-attribute: ("a.result-method", {
"href": "../lib2/another_mod/struct.MultiImplBlockStruct.html#impl-MultiImplBlockStruct/method.second_fn"
"href": "../lib2/another_mod/type.MultiImplBlockStruct.html#impl-MultiImplBlockStruct/method.second_fn"
})
click: "a.result-method"
wait-for: "details:has(summary > #impl-MultiImplBlockStruct-1) > div section[id='method.second_fn']:target"
Expand All @@ -51,7 +51,7 @@ go-to: "file://" + |DOC_PATH| + "/lib2/index.html?search=MultiImplBlockStruct->u
call-function: ("wait-for-search-results", {})
assert-count: ("a.result-method", 1)
assert-attribute: ("a.result-method", {
"href": "../lib2/another_mod/struct.MultiImplBlockStruct.html#impl-MultiImplBlockTrait-for-MultiImplBlockStruct/method.second_fn"
"href": "../lib2/another_mod/type.MultiImplBlockStruct.html#impl-MultiImplBlockTrait-for-MultiImplBlockStruct/method.second_fn"
})
click: "a.result-method"
wait-for: "details:has(summary > #impl-MultiImplBlockTrait-for-MultiImplBlockStruct) > div section[id='method.second_fn-1']:target"
4 changes: 2 additions & 2 deletions tests/rustdoc-gui/setting-go-to-only-result.goml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ click: "#search-button"
wait-for: "#alternative-display .search-input"
write-into: (".search-input", "HasALongTraitWithParams")
wait-for-document-property: {"title": "HasALongTraitWithParams in lib2 - Rust"}
assert-window-property: ({"location"."pathname": "/lib2/struct.HasALongTraitWithParams.html"}, ENDS_WITH)
assert-window-property: ({"location"."pathname": "/lib2/type.HasALongTraitWithParams.html"}, ENDS_WITH)

// Regression test for <https://github.com/rust-lang/rust/issues/112676>.
// If "go-to-only-result" is enabled and you go back to history, it should not lead you back to the
Expand All @@ -49,7 +49,7 @@ assert-window-property: ({"location"."pathname": "/lib2/index.html"}, ENDS_WITH)
// We try again to see if it goes to the only result
go-to: "file://" + |DOC_PATH| + "/lib2/index.html?search=HasALongTraitWithParams"
wait-for-document-property: {"title": "HasALongTraitWithParams in lib2 - Rust"}
assert-document-property: ({"URL": "/lib2/struct.HasALongTraitWithParams.html"}, ENDS_WITH)
assert-document-property: ({"URL": "/lib2/type.HasALongTraitWithParams.html"}, ENDS_WITH)

// We check the settings
call-function: ("check-setting", {
Expand Down
6 changes: 3 additions & 3 deletions tests/rustdoc-gui/sidebar-modnav-position.goml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ call-function: ("check-positions", {"url": "/test_docs/codeblock_sub/index.html"
go-to: "file://" + |DOC_PATH| + "/test_docs/fields/struct.Struct.html"
store-position: ("#rustdoc-modnav > h2", {"x": h2_x, "y": h2_y})
store-position: ("#rustdoc-modnav > ul:first-of-type > li:first-of-type", {"x": x, "y": y})
call-function: ("check-positions", {"url": "/test_docs/fields/struct.Struct.html"})
call-function: ("check-positions", {"url": "/test_docs/fields/union.Union.html"})
call-function: ("check-positions", {"url": "/test_docs/fields/enum.Enum.html"})
call-function: ("check-positions", {"url": "/test_docs/fields/type.Struct.html"})
call-function: ("check-positions", {"url": "/test_docs/fields/type.Union.html"})
call-function: ("check-positions", {"url": "/test_docs/fields/type.Enum.html"})
2 changes: 1 addition & 1 deletion tests/rustdoc-gui/tooltips.goml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ define-function: (
)

call-function: ("check-font", {"path": "tooltips/fn.bar.html"})
call-function: ("check-font", {"path": "tooltips/struct.X.html"})
call-function: ("check-font", {"path": "tooltips/type.X.html"})
8 changes: 4 additions & 4 deletions tests/rustdoc-html/all.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#![crate_name = "foo"]

//@ has foo/all.html '//a[@href="struct.Struct.html"]' 'Struct'
//@ has foo/all.html '//a[@href="enum.Enum.html"]' 'Enum'
//@ has foo/all.html '//a[@href="union.Union.html"]' 'Union'
//@ has foo/all.html '//a[@href="type.Struct.html"]' 'Struct'
//@ has foo/all.html '//a[@href="type.Enum.html"]' 'Enum'
//@ has foo/all.html '//a[@href="type.Union.html"]' 'Union'
//@ has foo/all.html '//a[@href="constant.CONST.html"]' 'CONST'
//@ has foo/all.html '//a[@href="static.STATIC.html"]' 'STATIC'
//@ has foo/all.html '//a[@href="fn.function.html"]' 'function'
Expand All @@ -23,6 +23,6 @@ mod private_module {
pub struct ReexportedStruct;
}

//@ has foo/all.html '//a[@href="struct.ReexportedStruct.html"]' 'ReexportedStruct'
//@ has foo/all.html '//a[@href="type.ReexportedStruct.html"]' 'ReexportedStruct'
//@ !hasraw foo/all.html 'private_module'
pub use private_module::ReexportedStruct;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// https://github.com/rust-lang/rust/issues/25001
#![crate_name="issue_25001"]

//@ has issue_25001/struct.Foo.html
//@ has issue_25001/type.Foo.html
pub struct Foo<T>(T);

pub trait Bar {
Expand Down
2 changes: 1 addition & 1 deletion tests/rustdoc-html/anchors/anchor-id-trait-method-15169.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
//@ has issue_15169/struct.Foo.html '//*[@id="method.eq"]' 'fn eq'
//@ has issue_15169/type.Foo.html '//*[@id="method.eq"]' 'fn eq'

// https://github.com/rust-lang/rust/issues/15169
#![crate_name="issue_15169"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ pub trait Bar {
fn baz() { }
}

//@ has issue_28478/struct.Foo.html
//@ has issue_28478/type.Foo.html
pub struct Foo;

impl Foo {
Expand Down
2 changes: 1 addition & 1 deletion tests/rustdoc-html/anchors/anchors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pub trait Bar {
fn bar() {}
}

//@ has 'foo/struct.Foo.html'
//@ has 'foo/type.Foo.html'
impl Bar for Foo {
//@ has - '//*[@id="associatedtype.T"]/a[@class="anchor"]' ''
type T = u32;
Expand Down
2 changes: 1 addition & 1 deletion tests/rustdoc-html/anchors/disambiguate-anchors-32890.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// https://github.com/rust-lang/rust/issues/32890
#![crate_name="issue_32890"]

//@ has issue_32890/struct.Foo.html
//@ has issue_32890/type.Foo.html
pub struct Foo<T>(T);

impl Foo<u8> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// https://github.com/rust-lang/rust/issues/29449
#![crate_name="issue_29449"]

//@ has issue_29449/struct.Foo.html
//@ has issue_29449/type.Foo.html
pub struct Foo;

impl Foo {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ extern crate issue_86620_1;

use issue_86620_1::*;

//@ !has foo/struct.S.html '//*[@id="method.vzip"]//a[@class="fnname"]/@href' #tymethod.vzip
//@ has foo/struct.S.html '//*[@id="method.vzip"]//a[@class="anchor"]/@href' #method.vzip
//@ !has foo/type.S.html '//*[@id="method.vzip"]//a[@class="fnname"]/@href' #tymethod.vzip
//@ has foo/type.S.html '//*[@id="method.vzip"]//a[@class="anchor"]/@href' #method.vzip
pub struct S;
20 changes: 10 additions & 10 deletions tests/rustdoc-html/anchors/trait-impl-items-links-and-anchors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,21 +38,21 @@ impl MyTrait for Vec<u8> {

impl MyTrait for MyStruct {
//@ has trait_impl_items_links_and_anchors/trait.MyTrait.html '//*[@id="associatedtype.Assoc-3"]//a[@class="anchor"]/@href' #associatedtype.Assoc-3
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="associatedtype.Assoc"]//a[@class="associatedtype"]/@href' trait.MyTrait.html#associatedtype.Assoc
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="associatedtype.Assoc"]//a[@class="anchor"]/@href' #associatedtype.Assoc
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="associatedtype.Assoc"]//a[@class="associatedtype"]/@href' trait.MyTrait.html#associatedtype.Assoc
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="associatedtype.Assoc"]//a[@class="anchor"]/@href' #associatedtype.Assoc
type Assoc = bool;
//@ has trait_impl_items_links_and_anchors/trait.MyTrait.html '//*[@id="associatedconstant.VALUE-3"]//a[@class="anchor"]/@href' #associatedconstant.VALUE-3
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="associatedconstant.VALUE"]//a[@class="constant"]/@href' trait.MyTrait.html#associatedconstant.VALUE
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="associatedconstant.VALUE"]//a[@class="anchor"]/@href' #associatedconstant.VALUE
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="associatedconstant.VALUE"]//a[@class="constant"]/@href' trait.MyTrait.html#associatedconstant.VALUE
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="associatedconstant.VALUE"]//a[@class="anchor"]/@href' #associatedconstant.VALUE
const VALUE: u32 = 20;
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="method.trait_function"]//a[@class="fn"]/@href' trait.MyTrait.html#tymethod.trait_function
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="method.trait_function"]//a[@class="anchor"]/@href' #method.trait_function
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="method.trait_function"]//a[@class="fn"]/@href' trait.MyTrait.html#tymethod.trait_function
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="method.trait_function"]//a[@class="anchor"]/@href' #method.trait_function
fn trait_function(&self) {}
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="method.defaulted_override"]//a[@class="fn"]/@href' trait.MyTrait.html#method.defaulted_override
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="method.defaulted_override"]//a[@class="anchor"]/@href' #method.defaulted_override
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="method.defaulted_override"]//a[@class="fn"]/@href' trait.MyTrait.html#method.defaulted_override
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="method.defaulted_override"]//a[@class="anchor"]/@href' #method.defaulted_override
fn defaulted_override(&self) {}
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="method.defaulted"]//a[@class="fn"]/@href' trait.MyTrait.html#method.defaulted
//@ has trait_impl_items_links_and_anchors/struct.MyStruct.html '//*[@id="method.defaulted"]//a[@class="anchor"]/@href' #method.defaulted
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="method.defaulted"]//a[@class="fn"]/@href' trait.MyTrait.html#method.defaulted
//@ has trait_impl_items_links_and_anchors/type.MyStruct.html '//*[@id="method.defaulted"]//a[@class="anchor"]/@href' #method.defaulted
}

pub struct MyStruct;
Expand Down
2 changes: 1 addition & 1 deletion tests/rustdoc-html/array-links.link_box_generic.html
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<code>pub fn delta&lt;T&gt;() -&gt; <a class="struct" href="struct.MyBox.html" title="struct foo::MyBox">MyBox</a>&lt;<a class="primitive" href="{{channel}}/core/primitive.array.html">[T; 1]</a>&gt;</code>
<code>pub fn delta&lt;T&gt;() -&gt; <a class="struct" href="type.MyBox.html" title="struct foo::MyBox">MyBox</a>&lt;<a class="primitive" href="{{channel}}/core/primitive.array.html">[T; 1]</a>&gt;</code>
Loading
Loading