diff options
| author | bors <bors@rust-lang.org> | 2022-05-02 14:03:20 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-05-02 14:03:20 +0000 |
| commit | 879fb425960798a79042b3b2a850d1262b7a91e8 (patch) | |
| tree | 1d1454aa105200842e6beb2b918b5d5c5c0d07c4 /src/librustdoc | |
| parent | 542898328637b31412d91b882ce0dc4b85ad54e6 (diff) | |
| parent | 5b5964f569ca07ba54710cb440aacaa1cf1e5c1a (diff) | |
| download | rust-879fb425960798a79042b3b2a850d1262b7a91e8.tar.gz rust-879fb425960798a79042b3b2a850d1262b7a91e8.zip | |
Auto merge of #96431 - petrochenkov:parent, r=cjgillot
rustc: Panic by default in `DefIdTree::parent` Only crate root def-ids don't have a parent, and in majority of cases the argument of `DefIdTree::parent` cannot be a crate root. So we now panic by default in `parent` and introduce a new non-panicing function `opt_parent` for cases where the argument can be a crate root. Same applies to `local_parent`/`opt_local_parent`.
Diffstat (limited to 'src/librustdoc')
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 10 | ||||
| -rw-r--r-- | src/librustdoc/clean/utils.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/html/format.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/passes/calculate_doc_coverage.rs | 2 | ||||
| -rw-r--r-- | src/librustdoc/passes/collect_intra_doc_links.rs | 18 | ||||
| -rw-r--r-- | src/librustdoc/passes/collect_intra_doc_links/early.rs | 4 | ||||
| -rw-r--r-- | src/librustdoc/passes/collect_trait_impls.rs | 4 |
7 files changed, 18 insertions, 24 deletions
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index d458deddae3..eea4eef9065 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -421,7 +421,7 @@ impl Clean<GenericParamDef> for ty::GenericParamDef { // `self_def_id` set, we override it here. // See https://github.com/rust-lang/rust/issues/85454 if let QPath { ref mut self_def_id, .. } = default { - *self_def_id = cx.tcx.parent(self.def_id); + *self_def_id = Some(cx.tcx.parent(self.def_id)); } Some(default) @@ -1068,7 +1068,7 @@ impl Clean<Item> for hir::ImplItem<'_> { let mut what_rustc_thinks = Item::from_def_id_and_parts(local_did, Some(self.ident.name), inner, cx); - let impl_ref = cx.tcx.parent(local_did).and_then(|did| cx.tcx.impl_trait_ref(did)); + let impl_ref = cx.tcx.impl_trait_ref(cx.tcx.local_parent(self.def_id)); // Trait impl items always inherit the impl's visibility -- // we don't want to show `pub`. @@ -1260,7 +1260,7 @@ impl Clean<Item> for ty::AssocItem { let mut what_rustc_thinks = Item::from_def_id_and_parts(self.def_id, Some(self.name), kind, cx); - let impl_ref = tcx.parent(self.def_id).and_then(|did| tcx.impl_trait_ref(did)); + let impl_ref = tcx.impl_trait_ref(tcx.parent(self.def_id)); // Trait impl items always inherit the impl's visibility -- // we don't want to show `pub`. @@ -1742,9 +1742,7 @@ fn clean_field(def_id: DefId, name: Symbol, ty: Type, cx: &mut DocContext<'_>) - } fn is_field_vis_inherited(tcx: TyCtxt<'_>, def_id: DefId) -> bool { - let parent = tcx - .parent(def_id) - .expect("is_field_vis_inherited can only be called on struct or variant fields"); + let parent = tcx.parent(def_id); match tcx.def_kind(parent) { DefKind::Struct | DefKind::Union => false, DefKind::Variant => true, diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index abfc5b80a3e..3a2f24d719c 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -455,7 +455,7 @@ crate fn find_nearest_parent_module(tcx: TyCtxt<'_>, def_id: DefId) -> Option<De let mut current = def_id; // The immediate parent might not always be a module. // Find the first parent which is. - while let Some(parent) = tcx.parent(current) { + while let Some(parent) = tcx.opt_parent(current) { if tcx.def_kind(parent) == DefKind::Mod { return Some(parent); } diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index 118807a8286..528eb6410cb 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -563,7 +563,7 @@ crate fn href_with_root_path( let did = match def_kind { DefKind::AssocTy | DefKind::AssocFn | DefKind::AssocConst | DefKind::Variant => { // documented on their parent's page - tcx.parent(did).unwrap() + tcx.parent(did) } _ => did, }; diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs index 33d83aa339d..0d40ef4c600 100644 --- a/src/librustdoc/passes/calculate_doc_coverage.rs +++ b/src/librustdoc/passes/calculate_doc_coverage.rs @@ -239,7 +239,7 @@ impl<'a, 'b> DocVisitor for CoverageCalculator<'a, 'b> { let should_be_ignored = i .item_id .as_def_id() - .and_then(|def_id| self.ctx.tcx.parent(def_id)) + .and_then(|def_id| self.ctx.tcx.opt_parent(def_id)) .and_then(|def_id| self.ctx.tcx.hir().get_if_local(def_id)) .map(|node| { matches!( diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 84512fab269..22b2f8c0c8e 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -334,7 +334,7 @@ impl ItemFragment { FragmentKind::StructField => write!(s, "structfield.{}", name), FragmentKind::Variant => write!(s, "variant.{}", name), FragmentKind::VariantField => { - let variant = tcx.item_name(tcx.parent(def_id).unwrap()); + let variant = tcx.item_name(tcx.parent(def_id)); write!(s, "variant.{}.field.{}", variant, name) } } @@ -509,10 +509,10 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { | DefKind::AssocTy | DefKind::Variant | DefKind::Field) => { - let parent_def_id = tcx.parent(def_id).expect("nested item has no parent"); + let parent_def_id = tcx.parent(def_id); if def_kind == DefKind::Field && tcx.def_kind(parent_def_id) == DefKind::Variant { - tcx.parent(parent_def_id).expect("variant has no parent") + tcx.parent(parent_def_id) } else { parent_def_id } @@ -2336,14 +2336,10 @@ fn handle_variant( cx: &DocContext<'_>, res: Res, ) -> Result<(Res, Option<ItemFragment>), ErrorKind<'static>> { - cx.tcx - .parent(res.def_id(cx.tcx)) - .map(|parent| { - let parent_def = Res::Def(DefKind::Enum, parent); - let variant = cx.tcx.expect_variant_res(res.as_hir_res().unwrap()); - (parent_def, Some(ItemFragment(FragmentKind::Variant, variant.def_id))) - }) - .ok_or_else(|| ResolutionFailure::NoParentItem.into()) + let parent = cx.tcx.parent(res.def_id(cx.tcx)); + let parent_def = Res::Def(DefKind::Enum, parent); + let variant = cx.tcx.expect_variant_res(res.as_hir_res().unwrap()); + Ok((parent_def, Some(ItemFragment(FragmentKind::Variant, variant.def_id)))) } /// Resolve a primitive type or value. diff --git a/src/librustdoc/passes/collect_intra_doc_links/early.rs b/src/librustdoc/passes/collect_intra_doc_links/early.rs index 3858c1cb056..1d2ef832db7 100644 --- a/src/librustdoc/passes/collect_intra_doc_links/early.rs +++ b/src/librustdoc/passes/collect_intra_doc_links/early.rs @@ -191,7 +191,7 @@ impl<'ra> EarlyDocLinkResolver<'_, 'ra> { return; } // FIXME: actually resolve links, not just add traits in scope. - if let Some(parent_id) = self.resolver.parent(scope_id) { + if let Some(parent_id) = self.resolver.opt_parent(scope_id) { self.add_traits_in_scope(parent_id); } } @@ -286,7 +286,7 @@ impl<'ra> EarlyDocLinkResolver<'_, 'ra> { { if let Some(def_id) = child.res.opt_def_id() && !def_id.is_local() { let scope_id = match child.res { - Res::Def(DefKind::Variant, ..) => self.resolver.parent(def_id).unwrap(), + Res::Def(DefKind::Variant, ..) => self.resolver.parent(def_id), _ => def_id, }; self.resolve_doc_links_extern_outer(def_id, scope_id); // Outer attribute scope diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index 9644e3d15fd..d245c3750ec 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -49,7 +49,7 @@ crate fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate let _prof_timer = cx.tcx.sess.prof.generic_activity("build_local_trait_impls"); let mut attr_buf = Vec::new(); for &impl_def_id in all_trait_impls.iter().take_while(|def_id| def_id.is_local()) { - let mut parent = cx.tcx.parent(impl_def_id); + let mut parent = Some(cx.tcx.parent(impl_def_id)); while let Some(did) = parent { attr_buf.extend( cx.tcx @@ -65,7 +65,7 @@ crate fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate }) .cloned(), ); - parent = cx.tcx.parent(did); + parent = cx.tcx.opt_parent(did); } inline::build_impl(cx, None, impl_def_id, Some(&attr_buf), &mut new_items_local); attr_buf.clear(); |
