about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoshua Nelson <jyn514@gmail.com>2020-08-05 00:11:57 -0400
committerJoshua Nelson <jyn514@gmail.com>2020-08-29 17:21:26 -0400
commit868927fefb2f6ea62783339552bbb67f828190e1 (patch)
tree960e5c1b67fab7ea5c763569145c608063310892
parent1dc748fb3d2c54f536e6abd74f1ad34b3624f640 (diff)
downloadrust-868927fefb2f6ea62783339552bbb67f828190e1.tar.gz
rust-868927fefb2f6ea62783339552bbb67f828190e1.zip
rustdoc: Fix intra-doc links for cross-crate re-exports of traits
 #58972 ignored extern_traits because before #65983 was fixed, they
would always fail to resolve, giving spurious warnings.
This undoes that change, so extern traits are now seen by the
`collect_intra_doc_links` pass. There are also some minor changes in
librustdoc/fold.rs to avoid borrowing the extern_traits RefCell more
than once at a time.
-rw-r--r--src/librustdoc/clean/inline.rs4
-rw-r--r--src/librustdoc/fold.rs14
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs9
-rw-r--r--src/test/rustdoc/intra-doc-crate/traits.rs2
4 files changed, 8 insertions, 21 deletions
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs
index 38fa8a402c4..50cb987cf08 100644
--- a/src/librustdoc/clean/inline.rs
+++ b/src/librustdoc/clean/inline.rs
@@ -628,7 +628,9 @@ pub fn record_extern_trait(cx: &DocContext<'_>, did: DefId) {
         }
     }
 
-    cx.active_extern_traits.borrow_mut().insert(did);
+    {
+        cx.active_extern_traits.borrow_mut().insert(did);
+    }
 
     debug!("record_extern_trait: {:?}", did);
     let trait_ = build_external_trait(cx, did);
diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs
index 0a85cb1d5a6..d4ada3278e6 100644
--- a/src/librustdoc/fold.rs
+++ b/src/librustdoc/fold.rs
@@ -93,15 +93,11 @@ pub trait DocFolder: Sized {
         c.module = c.module.take().and_then(|module| self.fold_item(module));
 
         {
-            let mut guard = c.external_traits.borrow_mut();
-            let external_traits = std::mem::replace(&mut *guard, Default::default());
-            *guard = external_traits
-                .into_iter()
-                .map(|(k, mut v)| {
-                    v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
-                    (k, v)
-                })
-                .collect();
+            let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
+            for (k, mut v) in external_traits {
+                v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
+                c.external_traits.borrow_mut().insert(k, v);
+            }
         }
         c
     }
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index 65d116b9c67..0ef48e7d51b 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -971,15 +971,6 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
             self.fold_item_recur(item)
         }
     }
-
-    // FIXME: if we can resolve intra-doc links from other crates, we can use the stock
-    // `fold_crate`, but until then we should avoid scanning `krate.external_traits` since those
-    // will never resolve properly
-    fn fold_crate(&mut self, mut c: Crate) -> Crate {
-        c.module = c.module.take().and_then(|module| self.fold_item(module));
-
-        c
-    }
 }
 
 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
diff --git a/src/test/rustdoc/intra-doc-crate/traits.rs b/src/test/rustdoc/intra-doc-crate/traits.rs
index 07f9fb63313..07decb48019 100644
--- a/src/test/rustdoc/intra-doc-crate/traits.rs
+++ b/src/test/rustdoc/intra-doc-crate/traits.rs
@@ -1,5 +1,3 @@
-// ignore-test
-// ^ this is https://github.com/rust-lang/rust/issues/73829
 // aux-build:traits.rs
 // build-aux-docs
 // ignore-tidy-line-length