about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2023-10-06 23:31:16 -0700
committerMichael Howell <michael@notriddle.com>2023-10-22 16:51:32 -0700
commit46fdeb24fd16156f73d95272b48604ab967c81db (patch)
tree1c572f3b512d0a2dac7be093c567c695c4430558 /src
parent62c67a6438aac23f7c757322be880ca45f2b6b63 (diff)
downloadrust-46fdeb24fd16156f73d95272b48604ab967c81db.tar.gz
rust-46fdeb24fd16156f73d95272b48604ab967c81db.zip
rustdoc: make JS trait impls act more like HTML
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/html/render/mod.rs1
-rw-r--r--src/librustdoc/html/render/write_shared.rs21
-rw-r--r--src/librustdoc/html/static/js/main.js15
3 files changed, 31 insertions, 6 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs
index 51cc836cd15..3cf166a3e43 100644
--- a/src/librustdoc/html/render/mod.rs
+++ b/src/librustdoc/html/render/mod.rs
@@ -55,7 +55,6 @@ use rustc_hir::def_id::{DefId, DefIdSet};
 use rustc_hir::Mutability;
 use rustc_middle::middle::stability;
 use rustc_middle::ty::{self, TyCtxt};
-use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
 use rustc_span::{
     symbol::{sym, Symbol},
     BytePos, FileName, RealFileName,
diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs
index 4054281f346..3e58dd96ed9 100644
--- a/src/librustdoc/html/render/write_shared.rs
+++ b/src/librustdoc/html/render/write_shared.rs
@@ -530,7 +530,11 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
             .values()
             .flat_map(|AliasedTypeImpl { impl_, type_aliases }| {
                 let mut ret = Vec::new();
-                let trait_ = impl_.inner_impl().trait_.as_ref().map(|path| path.last().to_string());
+                let trait_ = impl_
+                    .inner_impl()
+                    .trait_
+                    .as_ref()
+                    .map(|trait_| format!("{:#}", trait_.print(cx)));
                 // render_impl will filter out "impossible-to-call" methods
                 // to make that functionality work here, it needs to be called with
                 // each type alias, and if it gives a different result, split the impl
@@ -538,12 +542,25 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
                     let mut buf = Buffer::html();
                     cx.id_map = Default::default();
                     cx.deref_id_map = Default::default();
+                    let target_did = impl_
+                        .inner_impl()
+                        .trait_
+                        .as_ref()
+                        .map(|trait_| trait_.def_id())
+                        .or_else(|| impl_.inner_impl().for_.def_id(cache));
+                    let provided_methods;
+                    let assoc_link = if let Some(target_did) = target_did {
+                        provided_methods = impl_.inner_impl().provided_trait_methods(cx.tcx());
+                        AssocItemLink::GotoSource(ItemId::DefId(target_did), &provided_methods)
+                    } else {
+                        AssocItemLink::Anchor(None)
+                    };
                     super::render_impl(
                         &mut buf,
                         cx,
                         *impl_,
                         &type_alias_item,
-                        AssocItemLink::Anchor(None),
+                        assoc_link,
                         RenderMode::Normal,
                         None,
                         &[],
diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index 6f0bcb8e6d0..7c052606aba 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -680,12 +680,14 @@ function preLoadCss(cssUrl) {
 
         let implementations = document.getElementById("implementations-list");
         let trait_implementations = document.getElementById("trait-implementations-list");
+        let trait_implementations_header = document.getElementById("trait-implementations");
 
         // We want to include the current type alias's impls, and no others.
         const script = document.querySelector("script[data-self-path]");
         const selfPath = script ? script.getAttribute("data-self-path") : null;
 
         // These sidebar blocks need filled in, too.
+        const mainContent = document.querySelector("#main-content");
         const sidebarSection = document.querySelector(".sidebar section");
         let methods = document.querySelector(".sidebar .block.method");
         let associatedTypes = document.querySelector(".sidebar .block.associatedtype");
@@ -719,18 +721,18 @@ function preLoadCss(cssUrl) {
                     const h = document.createElement("h3");
                     h.appendChild(link);
                     trait_implementations = outputList;
+                    trait_implementations_header = outputListHeader;
                     sidebarSection.appendChild(h);
                     sidebarTraitList = document.createElement("ul");
                     sidebarTraitList.className = "block trait-implementation";
                     sidebarSection.appendChild(sidebarTraitList);
-                    const mainContent = document.querySelector("#main-content");
                     mainContent.appendChild(outputListHeader);
                     mainContent.appendChild(outputList);
                 } else {
                     implementations = outputList;
                     if (trait_implementations) {
-                        document.insertBefore(outputListHeader, trait_implementations);
-                        document.insertBefore(outputList, trait_implementations);
+                        mainContent.insertBefore(outputListHeader, trait_implementations_header);
+                        mainContent.insertBefore(outputList, trait_implementations_header);
                     } else {
                         const mainContent = document.querySelector("#main-content");
                         mainContent.appendChild(outputListHeader);
@@ -762,7 +764,14 @@ function preLoadCss(cssUrl) {
                     }
                 }
                 if (i !== 0) {
+                    const oldHref = `#${el.id}`;
+                    const newHref = `#${el.id}-${i}`;
                     el.id = `${el.id}-${i}`;
+                    onEachLazy(template.content.querySelectorAll("a[href]"), link => {
+                        if (link.getAttribute("href") === oldHref) {
+                            link.href = newHref;
+                        }
+                    });
                 }
                 idMap.set(el.id, i + 1);
             });