about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNoah Lev <camelidcamel@gmail.com>2021-10-31 21:53:31 -0700
committerNoah Lev <camelidcamel@gmail.com>2021-10-31 21:53:31 -0700
commitc03cab3fd07ab070d6ec0fa77655ad8d3a85a372 (patch)
tree1eaafe5dd59fd0057b1c43b9983d7774cb897c06
parent3f0f51017c2febcf1709d1d7ff2bf6957c46c963 (diff)
downloadrust-c03cab3fd07ab070d6ec0fa77655ad8d3a85a372.tar.gz
rust-c03cab3fd07ab070d6ec0fa77655ad8d3a85a372.zip
Fix `RefCell` `BorrowMut` error in `DocVisitor`
Until `external_traits` is cleaned up (i.e., no longer behind a
`RefCell`), `DocVisitor` will have to `take` `external_traits` -- just
like `DocFolder` -- to prevent `RefCell` runtime errors.
-rw-r--r--src/librustdoc/fold.rs12
-rw-r--r--src/librustdoc/visit.rs8
2 files changed, 10 insertions, 10 deletions
diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs
index 9009a9bd41b..e8069f39f45 100644
--- a/src/librustdoc/fold.rs
+++ b/src/librustdoc/fold.rs
@@ -84,14 +84,12 @@ crate trait DocFolder: Sized {
     fn fold_crate(&mut self, mut c: Crate) -> Crate {
         c.module = self.fold_item(c.module).unwrap();
 
-        {
-            let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
-            for (k, mut v) in external_traits {
-                v.trait_.items =
-                    v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
-                c.external_traits.borrow_mut().insert(k, v);
-            }
+        let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
+        for (k, mut v) in external_traits {
+            v.trait_.items = v.trait_.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/visit.rs b/src/librustdoc/visit.rs
index 9edf6e11bec..44129548d1c 100644
--- a/src/librustdoc/visit.rs
+++ b/src/librustdoc/visit.rs
@@ -43,9 +43,11 @@ crate trait DocVisitor: Sized {
     fn visit_crate(&mut self, c: &Crate) {
         self.visit_item(&c.module);
 
-        let external_traits = c.external_traits.borrow();
-        for v in external_traits.values() {
-            v.trait_.items.iter().for_each(|i| self.visit_item(i))
+        // FIXME: make this a simple by-ref for loop once external_traits is cleaned up
+        let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
+        for (k, v) in external_traits {
+            v.trait_.items.iter().for_each(|i| self.visit_item(i));
+            c.external_traits.borrow_mut().insert(k, v);
         }
     }
 }