about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrançois Mockers <mockersf@gmail.com>2021-03-13 01:40:13 +0100
committerFrançois Mockers <mockersf@gmail.com>2021-04-13 22:13:41 +0200
commit838c2ef1112b0aeff1152f71caec12b2606df3f3 (patch)
tree839f0dbee44a2574eb65ad49ec1aaa93b19e2a91
parent45964368f4a2e31c94e9bcf1cef933c087d21544 (diff)
downloadrust-838c2ef1112b0aeff1152f71caec12b2606df3f3.tar.gz
rust-838c2ef1112b0aeff1152f71caec12b2606df3f3.zip
fix source link when in a trait implementation
-rw-r--r--src/librustdoc/html/render/mod.rs38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs
index 9f9a3acd852..1eb70eb6364 100644
--- a/src/librustdoc/html/render/mod.rs
+++ b/src/librustdoc/html/render/mod.rs
@@ -1459,9 +1459,20 @@ fn render_impl(
                 // Only render when the method is not static or we allow static methods
                 if render_method_item {
                     let id = cx.derive_id(format!("{}.{}", item_type, name));
+                    let source_id = trait_
+                        .and_then(|trait_| trait_
+                            .items.iter()
+                            .find(|item| item.name.map(|n| n.as_str().eq(&name.as_str())).unwrap_or(false))
+                        ).map(|item| format!("{}.{}", item.type_(), name));
                     write!(w, "<h4 id=\"{}\" class=\"{}{}{}\">", id, item_type, extra_class, in_trait_class);
                     w.write_str("<code>");
-                    render_assoc_item(w, item, link.anchor(&id), ItemType::Impl, cx);
+                    render_assoc_item(
+                        w,
+                        item,
+                        link.anchor(source_id.as_ref().unwrap_or(&id)),
+                        ItemType::Impl,
+                        cx
+                    );
                     w.write_str("</code>");
                     render_stability_since_raw(
                         w,
@@ -1476,14 +1487,15 @@ fn render_impl(
                 }
             }
             clean::TypedefItem(ref tydef, _) => {
-                let id = cx.derive_id(format!("{}.{}", ItemType::AssocType, name));
+                let source_id = format!("{}.{}", ItemType::AssocType, name);
+                let id = cx.derive_id(source_id.clone());
                 write!(w, "<h4 id=\"{}\" class=\"{}{}{}\"><code>", id, item_type, extra_class, in_trait_class);
                 assoc_type(
                     w,
                     item,
                     &Vec::new(),
                     Some(&tydef.type_),
-                    link.anchor(&id),
+                    link.anchor(if trait_.is_some() { &source_id } else { &id }),
                     "",
                     cx.cache(),
                     tcx,
@@ -1493,9 +1505,18 @@ fn render_impl(
                 w.write_str("</h4>");
             }
             clean::AssocConstItem(ref ty, ref default) => {
-                let id = cx.derive_id(format!("{}.{}", item_type, name));
+                let source_id = format!("{}.{}", item_type, name);
+                let id = cx.derive_id(source_id.clone());
                 write!(w, "<h4 id=\"{}\" class=\"{}{}{}\"><code>", id, item_type, extra_class, in_trait_class);
-                assoc_const(w, item, ty, default.as_ref(), link.anchor(&id), "", cx);
+                assoc_const(
+                    w,
+                    item,
+                    ty,
+                    default.as_ref(),
+                    link.anchor(if trait_.is_some() { &source_id } else { &id }),
+                    "",
+                    cx
+                );
                 w.write_str("</code>");
                 render_stability_since_raw(
                     w,
@@ -1509,14 +1530,15 @@ fn render_impl(
                 w.write_str("</h4>");
             }
             clean::AssocTypeItem(ref bounds, ref default) => {
-                let id = cx.derive_id(format!("{}.{}", item_type, name));
+                let source_id = format!("{}.{}", item_type, name);
+                let id = cx.derive_id(source_id.clone());
                 write!(w, "<h4 id=\"{}\" class=\"{}{}{}\"><code>", id, item_type, extra_class, in_trait_class);
                 assoc_type(
                     w,
                     item,
                     bounds,
                     default.as_ref(),
-                    link.anchor(&id),
+                    link.anchor(if trait_.is_some() { &source_id } else { &id }),
                     "",
                     cx.cache(),
                     tcx,
@@ -1613,7 +1635,7 @@ fn render_impl(
                 true,
                 outer_version,
                 outer_const_version,
-                None,
+                Some(t),
                 show_def_docs,
             );
         }