Skip to content

Commit c03cab3

Browse files
committed
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.
1 parent 3f0f510 commit c03cab3

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

src/librustdoc/fold.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,12 @@ crate trait DocFolder: Sized {
8484
fn fold_crate(&mut self, mut c: Crate) -> Crate {
8585
c.module = self.fold_item(c.module).unwrap();
8686

87-
{
88-
let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
89-
for (k, mut v) in external_traits {
90-
v.trait_.items =
91-
v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
92-
c.external_traits.borrow_mut().insert(k, v);
93-
}
87+
let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
88+
for (k, mut v) in external_traits {
89+
v.trait_.items = v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
90+
c.external_traits.borrow_mut().insert(k, v);
9491
}
92+
9593
c
9694
}
9795
}

src/librustdoc/visit.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ crate trait DocVisitor: Sized {
4343
fn visit_crate(&mut self, c: &Crate) {
4444
self.visit_item(&c.module);
4545

46-
let external_traits = c.external_traits.borrow();
47-
for v in external_traits.values() {
48-
v.trait_.items.iter().for_each(|i| self.visit_item(i))
46+
// FIXME: make this a simple by-ref for loop once external_traits is cleaned up
47+
let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
48+
for (k, v) in external_traits {
49+
v.trait_.items.iter().for_each(|i| self.visit_item(i));
50+
c.external_traits.borrow_mut().insert(k, v);
4951
}
5052
}
5153
}

0 commit comments

Comments
 (0)