From 698f8c2f01ea549d77d7dc3338a12e04c11057b9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:02:58 +0200 Subject: Adding upstream version 1.64.0+dfsg1. Signed-off-by: Daniel Baumann --- src/librustdoc/fold.rs | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/librustdoc/fold.rs (limited to 'src/librustdoc/fold.rs') diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs new file mode 100644 index 000000000..6b7e67e2c --- /dev/null +++ b/src/librustdoc/fold.rs @@ -0,0 +1,103 @@ +use crate::clean::*; + +pub(crate) fn strip_item(mut item: Item) -> Item { + if !matches!(*item.kind, StrippedItem(..)) { + item.kind = Box::new(StrippedItem(item.kind)); + } + item +} + +pub(crate) trait DocFolder: Sized { + fn fold_item(&mut self, item: Item) -> Option { + Some(self.fold_item_recur(item)) + } + + /// don't override! + fn fold_inner_recur(&mut self, kind: ItemKind) -> ItemKind { + match kind { + StrippedItem(..) => unreachable!(), + ModuleItem(i) => ModuleItem(self.fold_mod(i)), + StructItem(mut i) => { + i.fields = i.fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); + StructItem(i) + } + UnionItem(mut i) => { + i.fields = i.fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); + UnionItem(i) + } + EnumItem(mut i) => { + i.variants = i.variants.into_iter().filter_map(|x| self.fold_item(x)).collect(); + EnumItem(i) + } + TraitItem(mut i) => { + i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect(); + TraitItem(i) + } + ImplItem(mut i) => { + i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect(); + ImplItem(i) + } + VariantItem(i) => match i { + Variant::Struct(mut j) => { + j.fields = j.fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); + VariantItem(Variant::Struct(j)) + } + Variant::Tuple(fields) => { + let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect(); + VariantItem(Variant::Tuple(fields)) + } + Variant::CLike => VariantItem(Variant::CLike), + }, + ExternCrateItem { src: _ } + | ImportItem(_) + | FunctionItem(_) + | TypedefItem(_) + | OpaqueTyItem(_) + | StaticItem(_) + | ConstantItem(_) + | TraitAliasItem(_) + | TyMethodItem(_) + | MethodItem(_, _) + | StructFieldItem(_) + | ForeignFunctionItem(_) + | ForeignStaticItem(_) + | ForeignTypeItem + | MacroItem(_) + | ProcMacroItem(_) + | PrimitiveItem(_) + | TyAssocConstItem(..) + | AssocConstItem(..) + | TyAssocTypeItem(..) + | AssocTypeItem(..) + | KeywordItem => kind, + } + } + + /// don't override! + fn fold_item_recur(&mut self, mut item: Item) -> Item { + item.kind = Box::new(match *item.kind { + StrippedItem(box i) => StrippedItem(Box::new(self.fold_inner_recur(i))), + _ => self.fold_inner_recur(*item.kind), + }); + item + } + + fn fold_mod(&mut self, m: Module) -> Module { + Module { + span: m.span, + items: m.items.into_iter().filter_map(|i| self.fold_item(i)).collect(), + } + } + + 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); + } + + c + } +} -- cgit v1.2.3