Skip to content

Commit e6349ac

Browse files
authored
Rollup merge of rust-lang#79310 - jyn514:fold-item-cleanup, r=GuillaumeGomez
Make `fold_item_recur` non-nullable This gets rid of a bunch of `unwrap()`s and makes it a little more clear what's going on. Originally I wanted to make `fold_item` non-nullable too, which would have been a lot nicer to work with, but unfortunately `stripper` does actually return `None` in some places. I might make a follow-up moving stripper to be special and not a pass so that passes can be non-nullable. Found while working on rust-lang#76998.
2 parents 8c315c6 + ab1e634 commit e6349ac

15 files changed

+67
-75
lines changed

src/librustdoc/fold.rs

+5-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ impl StripItem {
1616

1717
crate trait DocFolder: Sized {
1818
fn fold_item(&mut self, item: Item) -> Option<Item> {
19-
self.fold_item_recur(item)
19+
Some(self.fold_item_recur(item))
2020
}
2121

2222
/// don't override!
@@ -71,15 +71,12 @@ crate trait DocFolder: Sized {
7171
}
7272

7373
/// don't override!
74-
fn fold_item_recur(&mut self, item: Item) -> Option<Item> {
75-
let Item { attrs, name, source, visibility, def_id, kind, stability, deprecation } = item;
76-
77-
let kind = match kind {
74+
fn fold_item_recur(&mut self, mut item: Item) -> Item {
75+
item.kind = match item.kind {
7876
StrippedItem(box i) => StrippedItem(box self.fold_inner_recur(i)),
79-
_ => self.fold_inner_recur(kind),
77+
_ => self.fold_inner_recur(item.kind),
8078
};
81-
82-
Some(Item { attrs, name, source, kind, visibility, stability, deprecation, def_id })
79+
item
8380
}
8481

8582
fn fold_mod(&mut self, m: Module) -> Module {

src/librustdoc/formats/cache.rs

+37-40
Original file line numberDiff line numberDiff line change
@@ -421,55 +421,52 @@ impl DocFolder for Cache {
421421

422422
// Once we've recursively found all the generics, hoard off all the
423423
// implementations elsewhere.
424-
let ret = self.fold_item_recur(item).and_then(|item| {
425-
if let clean::Item { kind: clean::ImplItem(_), .. } = item {
426-
// Figure out the id of this impl. This may map to a
427-
// primitive rather than always to a struct/enum.
428-
// Note: matching twice to restrict the lifetime of the `i` borrow.
429-
let mut dids = FxHashSet::default();
430-
if let clean::Item { kind: clean::ImplItem(ref i), .. } = item {
431-
match i.for_ {
432-
clean::ResolvedPath { did, .. }
433-
| clean::BorrowedRef {
434-
type_: box clean::ResolvedPath { did, .. }, ..
435-
} => {
436-
dids.insert(did);
437-
}
438-
ref t => {
439-
let did = t
440-
.primitive_type()
441-
.and_then(|t| self.primitive_locations.get(&t).cloned());
424+
let item = self.fold_item_recur(item);
425+
let ret = if let clean::Item { kind: clean::ImplItem(_), .. } = item {
426+
// Figure out the id of this impl. This may map to a
427+
// primitive rather than always to a struct/enum.
428+
// Note: matching twice to restrict the lifetime of the `i` borrow.
429+
let mut dids = FxHashSet::default();
430+
if let clean::Item { kind: clean::ImplItem(ref i), .. } = item {
431+
match i.for_ {
432+
clean::ResolvedPath { did, .. }
433+
| clean::BorrowedRef { type_: box clean::ResolvedPath { did, .. }, .. } => {
434+
dids.insert(did);
435+
}
436+
ref t => {
437+
let did = t
438+
.primitive_type()
439+
.and_then(|t| self.primitive_locations.get(&t).cloned());
442440

443-
if let Some(did) = did {
444-
dids.insert(did);
445-
}
441+
if let Some(did) = did {
442+
dids.insert(did);
446443
}
447444
}
445+
}
448446

449-
if let Some(generics) = i.trait_.as_ref().and_then(|t| t.generics()) {
450-
for bound in generics {
451-
if let Some(did) = bound.def_id() {
452-
dids.insert(did);
453-
}
447+
if let Some(generics) = i.trait_.as_ref().and_then(|t| t.generics()) {
448+
for bound in generics {
449+
if let Some(did) = bound.def_id() {
450+
dids.insert(did);
454451
}
455452
}
456-
} else {
457-
unreachable!()
458-
};
459-
let impl_item = Impl { impl_item: item };
460-
if impl_item.trait_did().map_or(true, |d| self.traits.contains_key(&d)) {
461-
for did in dids {
462-
self.impls.entry(did).or_insert(vec![]).push(impl_item.clone());
463-
}
464-
} else {
465-
let trait_did = impl_item.trait_did().expect("no trait did");
466-
self.orphan_trait_impls.push((trait_did, dids, impl_item));
467453
}
468-
None
469454
} else {
470-
Some(item)
455+
unreachable!()
456+
};
457+
let impl_item = Impl { impl_item: item };
458+
if impl_item.trait_did().map_or(true, |d| self.traits.contains_key(&d)) {
459+
for did in dids {
460+
self.impls.entry(did).or_insert(vec![]).push(impl_item.clone());
461+
}
462+
} else {
463+
let trait_did = impl_item.trait_did().expect("no trait did");
464+
self.orphan_trait_impls.push((trait_did, dids, impl_item));
471465
}
472-
});
466+
None
467+
} else {
468+
Some(item)
469+
};
473470

474471
if pushed {
475472
self.stack.pop().expect("stack already empty");

src/librustdoc/html/sources.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl<'a> DocFolder for SourceCollector<'a> {
6060
}
6161
};
6262
}
63-
self.fold_item_recur(item)
63+
Some(self.fold_item_recur(item))
6464
}
6565
}
6666

src/librustdoc/passes/calculate_doc_coverage.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,6 @@ impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> {
268268
}
269269
}
270270

271-
self.fold_item_recur(i)
271+
Some(self.fold_item_recur(i))
272272
}
273273
}

src/librustdoc/passes/check_code_block_syntax.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> {
105105
}
106106
}
107107

108-
self.fold_item_recur(item)
108+
Some(self.fold_item_recur(item))
109109
}
110110
}
111111

src/librustdoc/passes/collapse_docs.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct Collapser;
2323
impl fold::DocFolder for Collapser {
2424
fn fold_item(&mut self, mut i: Item) -> Option<Item> {
2525
i.attrs.collapse_doc_comments();
26-
self.fold_item_recur(i)
26+
Some(self.fold_item_recur(i))
2727
}
2828
}
2929

src/librustdoc/passes/collect_intra_doc_links.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
858858
// we don't display docs on `extern crate` items anyway, so don't process them.
859859
clean::ExternCrateItem(..) => {
860860
debug!("ignoring extern crate item {:?}", item.def_id);
861-
return self.fold_item_recur(item);
861+
return Some(self.fold_item_recur(item));
862862
}
863863
clean::ImportItem(Import { kind: clean::ImportKind::Simple(ref name, ..), .. }) => {
864864
Some(name.clone())
@@ -958,7 +958,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
958958
}
959959
}
960960

961-
if item.is_mod() {
961+
Some(if item.is_mod() {
962962
if !item.attrs.inner_docs {
963963
self.mod_ids.push(item.def_id);
964964
}
@@ -968,7 +968,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
968968
ret
969969
} else {
970970
self.fold_item_recur(item)
971-
}
971+
})
972972
}
973973
}
974974

src/librustdoc/passes/collect_trait_impls.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ impl<'a, 'tcx> DocFolder for SyntheticImplCollector<'a, 'tcx> {
133133
}
134134
}
135135

136-
self.fold_item_recur(i)
136+
Some(self.fold_item_recur(i))
137137
}
138138
}
139139

@@ -152,7 +152,7 @@ impl DocFolder for ItemCollector {
152152
fn fold_item(&mut self, i: Item) -> Option<Item> {
153153
self.items.insert(i.def_id);
154154

155-
self.fold_item_recur(i)
155+
Some(self.fold_item_recur(i))
156156
}
157157
}
158158

src/librustdoc/passes/doc_test_lints.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ impl<'a, 'tcx> DocFolder for PrivateItemDocTestLinter<'a, 'tcx> {
4141

4242
look_for_tests(&cx, &dox, &item);
4343

44-
self.fold_item_recur(item)
44+
Some(self.fold_item_recur(item))
4545
}
4646
}
4747

src/librustdoc/passes/html_tags.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
178178
Some(hir_id) => hir_id,
179179
None => {
180180
// If non-local, no need to check anything.
181-
return self.fold_item_recur(item);
181+
return Some(self.fold_item_recur(item));
182182
}
183183
};
184184
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
@@ -223,6 +223,6 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> {
223223
}
224224
}
225225

226-
self.fold_item_recur(item)
226+
Some(self.fold_item_recur(item))
227227
}
228228
}

src/librustdoc/passes/non_autolinks.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
6868
Some(hir_id) => hir_id,
6969
None => {
7070
// If non-local, no need to check anything.
71-
return self.fold_item_recur(item);
71+
return Some(self.fold_item_recur(item));
7272
}
7373
};
7474
let dox = item.attrs.collapsed_doc_value().unwrap_or_default();
@@ -133,6 +133,6 @@ impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> {
133133
}
134134
}
135135

136-
self.fold_item_recur(item)
136+
Some(self.fold_item_recur(item))
137137
}
138138
}

src/librustdoc/passes/propagate_doc_cfg.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,6 @@ impl DocFolder for CfgPropagator {
3939
let result = self.fold_item_recur(item);
4040
self.parent_cfg = old_parent_cfg;
4141

42-
result
42+
Some(result)
4343
}
4444
}

src/librustdoc/passes/strip_hidden.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ impl<'a> DocFolder for Stripper<'a> {
4747
// strip things like impl methods but when doing so
4848
// we must not add any items to the `retained` set.
4949
let old = mem::replace(&mut self.update_retained, false);
50-
let ret = StripItem(self.fold_item_recur(i).unwrap()).strip();
50+
let ret = StripItem(self.fold_item_recur(i)).strip();
5151
self.update_retained = old;
5252
return ret;
5353
}
@@ -58,6 +58,6 @@ impl<'a> DocFolder for Stripper<'a> {
5858
self.retained.insert(i.def_id);
5959
}
6060
}
61-
self.fold_item_recur(i)
61+
Some(self.fold_item_recur(i))
6262
}
6363
}

src/librustdoc/passes/stripper.rs

+7-9
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ impl<'a> DocFolder for Stripper<'a> {
2222
let old = mem::replace(&mut self.update_retained, false);
2323
let ret = self.fold_item_recur(i);
2424
self.update_retained = old;
25-
return ret;
25+
return Some(ret);
2626
}
2727
// These items can all get re-exported
2828
clean::OpaqueTyItem(..)
@@ -59,7 +59,7 @@ impl<'a> DocFolder for Stripper<'a> {
5959
if i.def_id.is_local() && !i.visibility.is_public() {
6060
debug!("Stripper: stripping module {:?}", i.name);
6161
let old = mem::replace(&mut self.update_retained, false);
62-
let ret = StripItem(self.fold_item_recur(i).unwrap()).strip();
62+
let ret = StripItem(self.fold_item_recur(i)).strip();
6363
self.update_retained = old;
6464
return ret;
6565
}
@@ -107,12 +107,10 @@ impl<'a> DocFolder for Stripper<'a> {
107107
self.fold_item_recur(i)
108108
};
109109

110-
if let Some(ref i) = i {
111-
if self.update_retained {
112-
self.retained.insert(i.def_id);
113-
}
110+
if self.update_retained {
111+
self.retained.insert(i.def_id);
114112
}
115-
i
113+
Some(i)
116114
}
117115
}
118116

@@ -153,7 +151,7 @@ impl<'a> DocFolder for ImplStripper<'a> {
153151
}
154152
}
155153
}
156-
self.fold_item_recur(i)
154+
Some(self.fold_item_recur(i))
157155
}
158156
}
159157

@@ -164,7 +162,7 @@ impl DocFolder for ImportStripper {
164162
fn fold_item(&mut self, i: Item) -> Option<Item> {
165163
match i.kind {
166164
clean::ExternCrateItem(..) | clean::ImportItem(..) if !i.visibility.is_public() => None,
167-
_ => self.fold_item_recur(i),
165+
_ => Some(self.fold_item_recur(i)),
168166
}
169167
}
170168
}

src/librustdoc/passes/unindent_comments.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ struct CommentCleaner;
2323
impl fold::DocFolder for CommentCleaner {
2424
fn fold_item(&mut self, mut i: Item) -> Option<Item> {
2525
i.attrs.unindent_doc_comments();
26-
self.fold_item_recur(i)
26+
Some(self.fold_item_recur(i))
2727
}
2828
}
2929

0 commit comments

Comments
 (0)