diff options
| author | Noah Lev <camelidcamel@gmail.com> | 2021-10-31 21:53:31 -0700 |
|---|---|---|
| committer | Noah Lev <camelidcamel@gmail.com> | 2021-10-31 21:53:31 -0700 |
| commit | c03cab3fd07ab070d6ec0fa77655ad8d3a85a372 (patch) | |
| tree | 1eaafe5dd59fd0057b1c43b9983d7774cb897c06 | |
| parent | 3f0f51017c2febcf1709d1d7ff2bf6957c46c963 (diff) | |
| download | rust-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.rs | 12 | ||||
| -rw-r--r-- | src/librustdoc/visit.rs | 8 |
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); } } } |
