Skip to content

Commit 0438048

Browse files
authored
Rollup merge of #88639 - Emilgardis:fix-issue-88600, r=GuillaumeGomez
rustdoc: Fix ICE with `doc(hidden)` on tuple variant fields Fixes #88600. ```rust pub struct H; pub struct S; pub enum FooEnum { HiddenTupleItem(#[doc(hidden)] H), MultipleHidden(#[doc(hidden)] H, #[doc(hidden)] H), MixedHiddenFirst(#[doc(hidden)] H, S), MixedHiddenLast(S, #[doc(hidden)] H), HiddenStruct { #[doc(hidden)] h: H, s: S, }, } ``` Generates ![image](https://user-images.githubusercontent.com/1502855/132259152-382f9517-c2a0-41d8-acd0-64e5993931fc.png)
2 parents 1043549 + 4a915ac commit 0438048

File tree

2 files changed

+61
-24
lines changed

2 files changed

+61
-24
lines changed

src/librustdoc/html/render/print_item.rs

+27-24
Original file line numberDiff line numberDiff line change
@@ -944,15 +944,15 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni
944944
}
945945

946946
fn print_tuple_struct_fields(w: &mut Buffer, cx: &Context<'_>, s: &[clean::Item]) {
947-
for (i, ty) in s
948-
.iter()
949-
.map(|f| if let clean::StructFieldItem(ref ty) = *f.kind { ty } else { unreachable!() })
950-
.enumerate()
951-
{
947+
for (i, ty) in s.iter().enumerate() {
952948
if i > 0 {
953949
w.write_str(",&nbsp;");
954950
}
955-
write!(w, "{}", ty.print(cx));
951+
match *ty.kind {
952+
clean::StrippedItem(box clean::StructFieldItem(_)) => w.write_str("_"),
953+
clean::StructFieldItem(ref ty) => write!(w, "{}", ty.print(cx)),
954+
_ => unreachable!(),
955+
}
956956
}
957957
}
958958

@@ -1068,24 +1068,27 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum
10681068
name = variant.name.as_ref().unwrap(),
10691069
);
10701070
for field in fields {
1071-
use crate::clean::StructFieldItem;
1072-
if let StructFieldItem(ref ty) = *field.kind {
1073-
let id = cx.derive_id(format!(
1074-
"variant.{}.field.{}",
1075-
variant.name.as_ref().unwrap(),
1076-
field.name.as_ref().unwrap()
1077-
));
1078-
write!(
1079-
w,
1080-
"<span id=\"{id}\" class=\"variant small-section-header\">\
1081-
<a href=\"#{id}\" class=\"anchor field\"></a>\
1082-
<code>{f}:&nbsp;{t}</code>\
1083-
</span>",
1084-
id = id,
1085-
f = field.name.as_ref().unwrap(),
1086-
t = ty.print(cx)
1087-
);
1088-
document(w, cx, field, Some(variant));
1071+
match *field.kind {
1072+
clean::StrippedItem(box clean::StructFieldItem(_)) => {}
1073+
clean::StructFieldItem(ref ty) => {
1074+
let id = cx.derive_id(format!(
1075+
"variant.{}.field.{}",
1076+
variant.name.as_ref().unwrap(),
1077+
field.name.as_ref().unwrap()
1078+
));
1079+
write!(
1080+
w,
1081+
"<span id=\"{id}\" class=\"variant small-section-header\">\
1082+
<a href=\"#{id}\" class=\"anchor field\"></a>\
1083+
<code>{f}:&nbsp;{t}</code>\
1084+
</span>",
1085+
id = id,
1086+
f = field.name.as_ref().unwrap(),
1087+
t = ty.print(cx)
1088+
);
1089+
document(w, cx, field, Some(variant));
1090+
}
1091+
_ => unreachable!(),
10891092
}
10901093
}
10911094
w.write_str("</div></div>");

src/test/rustdoc/issue-88600.rs

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// This test ensure that #[doc(hidden)] is applied correctly in enum variant fields.
2+
3+
// Denotes a field which should be hidden.
4+
pub struct H;
5+
6+
// Denotes a field which should not be hidden (shown).
7+
pub struct S;
8+
9+
// @has issue_88600/enum.FooEnum.html
10+
pub enum FooEnum {
11+
// @has - '//*[@id="variant.HiddenTupleItem"]//code' 'HiddenTupleItem(_)'
12+
// @count - '//*[@id="variant.HiddenTupleItem.field.0"]' 0
13+
HiddenTupleItem(#[doc(hidden)] H),
14+
// @has - '//*[@id="variant.MultipleHidden"]//code' 'MultipleHidden(_, _)'
15+
// @count - '//*[@id="variant.MultipleHidden.field.0"]' 0
16+
// @count - '//*[@id="variant.MultipleHidden.field.1"]' 0
17+
MultipleHidden(#[doc(hidden)] H, #[doc(hidden)] H),
18+
// @has - '//*[@id="variant.MixedHiddenFirst"]//code' 'MixedHiddenFirst(_, S)'
19+
// @count - '//*[@id="variant.MixedHiddenFirst.field.0"]' 0
20+
// @has - '//*[@id="variant.MixedHiddenFirst.field.1"]' '1: S'
21+
MixedHiddenFirst(#[doc(hidden)] H, S),
22+
// @has - '//*[@id="variant.MixedHiddenLast"]//code' 'MixedHiddenLast(S, _)'
23+
// @has - '//*[@id="variant.MixedHiddenLast.field.0"]' '0: S'
24+
// @count - '//*[@id="variant.MixedHiddenLast.field.1"]' 0
25+
MixedHiddenLast(S, #[doc(hidden)] H),
26+
// @has - '//*[@id="variant.HiddenStruct"]//code' 'HiddenStruct'
27+
// @count - '//*[@id="variant.HiddenStruct.field.h"]' 0
28+
// @has - '//*[@id="variant.HiddenStruct.field.s"]' 's: S'
29+
HiddenStruct {
30+
#[doc(hidden)]
31+
h: H,
32+
s: S,
33+
},
34+
}

0 commit comments

Comments
 (0)