Skip to content

Commit 4a915ac

Browse files
committed
fix ICE on hidden tuple variant fields
this also renders them as `_`, which rustdoc previously did not.
1 parent 065a372 commit 4a915ac

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
@@ -942,15 +942,15 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni
942942
}
943943

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

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