Skip to content

Commit 97dd726

Browse files
committed
auto merge of #13639 : alexcrichton/rust/rustdoc-tuple-fields, r=sfackler
The fields of tuple structs recently gained the ability to have privacy associated with them, but rustdoc was not updated accodingly. This moves the struct field filtering to the rendering phase in order to preserve the ordering of struct fields to allow tuple structs to have their private fields printed as underscores. Closes #13594
2 parents 02081e7 + 9d546d6 commit 97dd726

File tree

3 files changed

+51
-23
lines changed

3 files changed

+51
-23
lines changed

src/librustdoc/clean.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ pub enum Type {
652652
Proc(~ClosureDecl),
653653
/// extern "ABI" fn
654654
BareFunction(~BareFunctionDecl),
655-
Tuple(Vec<Type> ),
655+
Tuple(Vec<Type>),
656656
Vector(~Type),
657657
FixedVector(~Type, ~str),
658658
String,
@@ -713,25 +713,24 @@ impl Clean<Type> for ast::Ty {
713713
}
714714

715715
#[deriving(Clone, Encodable, Decodable)]
716-
pub struct StructField {
717-
pub type_: Type,
716+
pub enum StructField {
717+
HiddenStructField,
718+
TypedStructField(Type),
718719
}
719720

720721
impl Clean<Item> for ast::StructField {
721722
fn clean(&self) -> Item {
722723
let (name, vis) = match self.node.kind {
723-
ast::NamedField(id, vis) => (Some(id), Some(vis)),
724-
_ => (None, None)
724+
ast::NamedField(id, vis) => (Some(id), vis),
725+
ast::UnnamedField(vis) => (None, vis)
725726
};
726727
Item {
727728
name: name.clean(),
728729
attrs: self.node.attrs.clean().move_iter().collect(),
729730
source: self.span.clean(),
730-
visibility: vis,
731+
visibility: Some(vis),
731732
id: self.node.id,
732-
inner: StructFieldItem(StructField {
733-
type_: self.node.ty.clean(),
734-
}),
733+
inner: StructFieldItem(TypedStructField(self.node.ty.clean())),
735734
}
736735
}
737736
}
@@ -837,7 +836,7 @@ impl Clean<Item> for doctree::Variant {
837836
#[deriving(Clone, Encodable, Decodable)]
838837
pub enum VariantKind {
839838
CLikeVariant,
840-
TupleVariant(Vec<Type> ),
839+
TupleVariant(Vec<Type>),
841840
StructVariant(VariantStruct),
842841
}
843842

src/librustdoc/html/render.rs

+32-12
Original file line numberDiff line numberDiff line change
@@ -1345,16 +1345,22 @@ fn item_struct(w: &mut Writer, it: &clean::Item,
13451345
Some(&s.generics),
13461346
s.struct_type,
13471347
s.fields.as_slice(),
1348-
s.fields_stripped,
13491348
"",
13501349
true));
13511350
try!(write!(w, "</pre>"));
13521351

13531352
try!(document(w, it));
1353+
let mut fields = s.fields.iter().filter(|f| {
1354+
match f.inner {
1355+
clean::StructFieldItem(clean::HiddenStructField) => false,
1356+
clean::StructFieldItem(clean::TypedStructField(..)) => true,
1357+
_ => false,
1358+
}
1359+
}).peekable();
13541360
match s.struct_type {
1355-
doctree::Plain if s.fields.len() > 0 => {
1361+
doctree::Plain if fields.peek().is_some() => {
13561362
try!(write!(w, "<h2 class='fields'>Fields</h2>\n<table>"));
1357-
for field in s.fields.iter() {
1363+
for field in fields {
13581364
try!(write!(w, "<tr><td id='structfield.{name}'>\
13591365
<code>{name}</code></td><td>",
13601366
name = field.name.get_ref().as_slice()));
@@ -1400,7 +1406,6 @@ fn item_enum(w: &mut Writer, it: &clean::Item, e: &clean::Enum) -> fmt::Result {
14001406
None,
14011407
s.struct_type,
14021408
s.fields.as_slice(),
1403-
s.fields_stripped,
14041409
" ",
14051410
false));
14061411
}
@@ -1429,9 +1434,18 @@ fn item_enum(w: &mut Writer, it: &clean::Item, e: &clean::Enum) -> fmt::Result {
14291434
clean::VariantItem(ref var) => {
14301435
match var.kind {
14311436
clean::StructVariant(ref s) => {
1437+
let mut fields = s.fields.iter().filter(|f| {
1438+
match f.inner {
1439+
clean::StructFieldItem(ref t) => match *t {
1440+
clean::HiddenStructField => false,
1441+
clean::TypedStructField(..) => true,
1442+
},
1443+
_ => false,
1444+
}
1445+
});
14321446
try!(write!(w, "<h3 class='fields'>Fields</h3>\n
14331447
<table>"));
1434-
for field in s.fields.iter() {
1448+
for field in fields {
14351449
try!(write!(w, "<tr><td \
14361450
id='variant.{v}.field.{f}'>\
14371451
<code>{f}</code></td><td>",
@@ -1460,7 +1474,6 @@ fn render_struct(w: &mut Writer, it: &clean::Item,
14601474
g: Option<&clean::Generics>,
14611475
ty: doctree::StructType,
14621476
fields: &[clean::Item],
1463-
fields_stripped: bool,
14641477
tab: &str,
14651478
structhead: bool) -> fmt::Result {
14661479
try!(write!(w, "{}{}{}",
@@ -1474,17 +1487,21 @@ fn render_struct(w: &mut Writer, it: &clean::Item,
14741487
match ty {
14751488
doctree::Plain => {
14761489
try!(write!(w, " \\{\n{}", tab));
1490+
let mut fields_stripped = false;
14771491
for field in fields.iter() {
14781492
match field.inner {
1479-
clean::StructFieldItem(ref ty) => {
1493+
clean::StructFieldItem(clean::HiddenStructField) => {
1494+
fields_stripped = true;
1495+
}
1496+
clean::StructFieldItem(clean::TypedStructField(ref ty)) => {
14801497
try!(write!(w, " {}{}: {},\n{}",
14811498
VisSpace(field.visibility),
14821499
field.name.get_ref().as_slice(),
1483-
ty.type_,
1500+
*ty,
14841501
tab));
14851502
}
1486-
_ => unreachable!()
1487-
}
1503+
_ => unreachable!(),
1504+
};
14881505
}
14891506

14901507
if fields_stripped {
@@ -1499,8 +1516,11 @@ fn render_struct(w: &mut Writer, it: &clean::Item,
14991516
try!(write!(w, ", "));
15001517
}
15011518
match field.inner {
1502-
clean::StructFieldItem(ref field) => {
1503-
try!(write!(w, "{}", field.type_));
1519+
clean::StructFieldItem(clean::HiddenStructField) => {
1520+
try!(write!(w, "_"))
1521+
}
1522+
clean::StructFieldItem(clean::TypedStructField(ref ty)) => {
1523+
try!(write!(w, "{}{}", VisSpace(field.visibility), *ty))
15041524
}
15051525
_ => unreachable!()
15061526
}

src/librustdoc/passes.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,21 @@ impl<'a> fold::DocFolder for Stripper<'a> {
129129
}
130130
}
131131

132-
clean::ViewItemItem(..) | clean::StructFieldItem(..) => {
132+
clean::ViewItemItem(..) => {
133133
if i.visibility != Some(ast::Public) {
134134
return None
135135
}
136136
}
137137

138+
clean::StructFieldItem(..) => {
139+
if i.visibility != Some(ast::Public) {
140+
return Some(clean::Item {
141+
inner: clean::StructFieldItem(clean::HiddenStructField),
142+
..i
143+
})
144+
}
145+
}
146+
138147
// handled below
139148
clean::ModuleItem(..) => {}
140149

0 commit comments

Comments
 (0)