Skip to content

Commit 56da32c

Browse files
committed
rustdoc: Don't ignore dox on impl blocks
Closes #9611
1 parent d505f70 commit 56da32c

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

src/librustdoc/html/render.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct Cache {
6161
// typaram id => name of that typaram
6262
typarams: HashMap<ast::NodeId, ~str>,
6363
// type id => all implementations for that type
64-
impls: HashMap<ast::NodeId, ~[clean::Impl]>,
64+
impls: HashMap<ast::NodeId, ~[(clean::Impl, Option<~str>)]>,
6565
// path id => (full qualified path, shortty) -- used to generate urls
6666
paths: HashMap<ast::NodeId, (~[~str], &'static str)>,
6767
// trait id => method name => dox
@@ -454,21 +454,34 @@ impl DocFolder for Cache {
454454
// implementations elsewhere
455455
let ret = match self.fold_item_recur(item) {
456456
Some(item) => {
457-
match item.inner {
458-
clean::ImplItem(i) => {
457+
match item {
458+
clean::Item{ attrs, inner: clean::ImplItem(i), _ } => {
459459
match i.for_ {
460460
clean::ResolvedPath { did, _ } if is_local(did) => {
461461
let id = did.node;
462462
let v = do self.impls.find_or_insert_with(id) |_| {
463463
~[]
464464
};
465-
v.push(i);
465+
// extract relevant documentation for this impl
466+
match attrs.move_iter().find(|a| {
467+
match *a {
468+
clean::NameValue(~"doc", _) => true,
469+
_ => false
470+
}
471+
}) {
472+
Some(clean::NameValue(_, dox)) => {
473+
v.push((i, Some(dox)));
474+
}
475+
Some(*) | None => {
476+
v.push((i, None));
477+
}
478+
}
466479
}
467480
_ => {}
468481
}
469482
None
470483
}
471-
_ => Some(item),
484+
i => Some(i),
472485
}
473486
}
474487
i => i,
@@ -1205,22 +1218,26 @@ fn render_methods(w: &mut io::Writer, it: &clean::Item) {
12051218
do cache.read |c| {
12061219
match c.impls.find(&it.id) {
12071220
Some(v) => {
1208-
let mut non_trait = v.iter().filter(|i| i.trait_.is_none());
1221+
let mut non_trait = v.iter().filter(|p| {
1222+
p.n0_ref().trait_.is_none()
1223+
});
12091224
let non_trait = non_trait.to_owned_vec();
1210-
let mut traits = v.iter().filter(|i| i.trait_.is_some());
1225+
let mut traits = v.iter().filter(|p| {
1226+
p.n0_ref().trait_.is_some()
1227+
});
12111228
let traits = traits.to_owned_vec();
12121229

12131230
if non_trait.len() > 0 {
12141231
write!(w, "<h2 id='methods'>Methods</h2>");
1215-
for &i in non_trait.iter() {
1216-
render_impl(w, i);
1232+
for &(ref i, ref dox) in non_trait.move_iter() {
1233+
render_impl(w, i, dox);
12171234
}
12181235
}
12191236
if traits.len() > 0 {
12201237
write!(w, "<h2 id='implementations'>Trait \
12211238
Implementations</h2>");
1222-
for &i in traits.iter() {
1223-
render_impl(w, i);
1239+
for &(ref i, ref dox) in traits.move_iter() {
1240+
render_impl(w, i, dox);
12241241
}
12251242
}
12261243
}
@@ -1230,7 +1247,7 @@ fn render_methods(w: &mut io::Writer, it: &clean::Item) {
12301247
}
12311248
}
12321249

1233-
fn render_impl(w: &mut io::Writer, i: &clean::Impl) {
1250+
fn render_impl(w: &mut io::Writer, i: &clean::Impl, dox: &Option<~str>) {
12341251
write!(w, "<h3 class='impl'><code>impl{} ", i.generics);
12351252
let trait_id = match i.trait_ {
12361253
Some(ref ty) => {
@@ -1243,6 +1260,13 @@ fn render_impl(w: &mut io::Writer, i: &clean::Impl) {
12431260
None => None
12441261
};
12451262
write!(w, "{}</code></h3>", i.for_);
1263+
match *dox {
1264+
Some(ref dox) => {
1265+
write!(w, "<div class='docblock'>{}</div>",
1266+
Markdown(dox.as_slice()));
1267+
}
1268+
None => {}
1269+
}
12461270
write!(w, "<div class='methods'>");
12471271
for meth in i.methods.iter() {
12481272
write!(w, "<h4 id='method.{}' class='method'><code>",

0 commit comments

Comments
 (0)