diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2022-04-25 22:08:45 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2022-05-02 01:56:50 +0300 |
| commit | 5b5964f569ca07ba54710cb440aacaa1cf1e5c1a (patch) | |
| tree | 2bfa7457d9fde6a513c41e9e7a7d10282e92bf39 /src | |
| parent | a933de83989471ac444a13d62996d30621542654 (diff) | |
| download | rust-5b5964f569ca07ba54710cb440aacaa1cf1e5c1a.tar.gz rust-5b5964f569ca07ba54710cb440aacaa1cf1e5c1a.zip | |
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')
| -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 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_lints/src/matches/redundant_pattern_match.rs | 2 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs | 8 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_lints/src/methods/chars_cmp.rs | 2 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_lints/src/methods/option_map_or_none.rs | 2 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_lints/src/missing_doc.rs | 2 | ||||
| -rw-r--r-- | src/tools/clippy/clippy_utils/src/lib.rs | 2 |
13 files changed, 27 insertions, 33 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 42e87f3f961..7a68a6e523b 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -333,7 +333,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) } } @@ -508,10 +508,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 } @@ -2333,14 +2333,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 68e10e3a18c..cd096c88003 100644 --- a/src/librustdoc/passes/collect_intra_doc_links/early.rs +++ b/src/librustdoc/passes/collect_intra_doc_links/early.rs @@ -188,7 +188,7 @@ impl EarlyDocLinkResolver<'_, '_> { 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); } } @@ -253,7 +253,7 @@ impl EarlyDocLinkResolver<'_, '_> { { 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(); diff --git a/src/tools/clippy/clippy_lints/src/matches/redundant_pattern_match.rs b/src/tools/clippy/clippy_lints/src/matches/redundant_pattern_match.rs index 777ec9b75bc..aa3552001f4 100644 --- a/src/tools/clippy/clippy_lints/src/matches/redundant_pattern_match.rs +++ b/src/tools/clippy/clippy_lints/src/matches/redundant_pattern_match.rs @@ -193,7 +193,7 @@ fn find_sugg_for_if_let<'tcx>( PatKind::TupleStruct(ref qpath, [sub_pat], _) => { if let PatKind::Wild = sub_pat.kind { let res = cx.typeck_results().qpath_res(qpath, check_pat.hir_id); - let Some(id) = res.opt_def_id().and_then(|ctor_id| cx.tcx.parent(ctor_id)) else { return }; + let Some(id) = res.opt_def_id().map(|ctor_id| cx.tcx.parent(ctor_id)) else { return }; let lang_items = cx.tcx.lang_items(); if Some(id) == lang_items.result_ok_variant() { ("is_ok()", try_get_generic_ty(op_ty, 0).unwrap_or(op_ty)) diff --git a/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs b/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs index eec232e6d09..b88ec0963f2 100644 --- a/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs +++ b/src/tools/clippy/clippy_lints/src/methods/bind_instead_of_map.rs @@ -42,7 +42,7 @@ pub(crate) trait BindInsteadOfMap { fn no_op_msg(cx: &LateContext<'_>) -> Option<String> { let variant_id = cx.tcx.lang_items().require(Self::VARIANT_LANG_ITEM).ok()?; - let item_id = cx.tcx.parent(variant_id)?; + let item_id = cx.tcx.parent(variant_id); Some(format!( "using `{}.{}({})`, which is a no-op", cx.tcx.item_name(item_id), @@ -53,7 +53,7 @@ pub(crate) trait BindInsteadOfMap { fn lint_msg(cx: &LateContext<'_>) -> Option<String> { let variant_id = cx.tcx.lang_items().require(Self::VARIANT_LANG_ITEM).ok()?; - let item_id = cx.tcx.parent(variant_id)?; + let item_id = cx.tcx.parent(variant_id); Some(format!( "using `{}.{}(|x| {}(y))`, which is more succinctly expressed as `{}(|x| y)`", cx.tcx.item_name(item_id), @@ -145,7 +145,7 @@ pub(crate) trait BindInsteadOfMap { if_chain! { if let Some(adt) = cx.typeck_results().expr_ty(recv).ty_adt_def(); if let Ok(vid) = cx.tcx.lang_items().require(Self::VARIANT_LANG_ITEM); - if Some(adt.did()) == cx.tcx.parent(vid); + if adt.did() == cx.tcx.parent(vid); then {} else { return false; } } @@ -182,7 +182,7 @@ pub(crate) trait BindInsteadOfMap { fn is_variant(cx: &LateContext<'_>, res: Res) -> bool { if let Res::Def(DefKind::Ctor(CtorOf::Variant, CtorKind::Fn), id) = res { if let Ok(variant_id) = cx.tcx.lang_items().require(Self::VARIANT_LANG_ITEM) { - return cx.tcx.parent(id) == Some(variant_id); + return cx.tcx.parent(id) == variant_id; } } false diff --git a/src/tools/clippy/clippy_lints/src/methods/chars_cmp.rs b/src/tools/clippy/clippy_lints/src/methods/chars_cmp.rs index 2cf2c5641bf..f7b79f0839b 100644 --- a/src/tools/clippy/clippy_lints/src/methods/chars_cmp.rs +++ b/src/tools/clippy/clippy_lints/src/methods/chars_cmp.rs @@ -19,7 +19,7 @@ pub(super) fn check( if_chain! { if let Some(args) = method_chain_args(info.chain, chain_methods); if let hir::ExprKind::Call(fun, [arg_char]) = info.other.kind; - if let Some(id) = path_def_id(cx, fun).and_then(|ctor_id| cx.tcx.parent(ctor_id)); + if let Some(id) = path_def_id(cx, fun).map(|ctor_id| cx.tcx.parent(ctor_id)); if Some(id) == cx.tcx.lang_items().option_some_variant(); then { let mut applicability = Applicability::MachineApplicable; diff --git a/src/tools/clippy/clippy_lints/src/methods/option_map_or_none.rs b/src/tools/clippy/clippy_lints/src/methods/option_map_or_none.rs index 2a5ab6e625c..76bc9466ed8 100644 --- a/src/tools/clippy/clippy_lints/src/methods/option_map_or_none.rs +++ b/src/tools/clippy/clippy_lints/src/methods/option_map_or_none.rs @@ -75,7 +75,7 @@ pub(super) fn check<'tcx>( let arg_snippet = snippet(cx, span, ".."); let body = cx.tcx.hir().body(id); if let Some((func, [arg_char])) = reduce_unit_expression(&body.value); - if let Some(id) = path_def_id(cx, func).and_then(|ctor_id| cx.tcx.parent(ctor_id)); + if let Some(id) = path_def_id(cx, func).map(|ctor_id| cx.tcx.parent(ctor_id)); if Some(id) == cx.tcx.lang_items().option_some_variant(); then { let func_snippet = snippet(cx, arg_char.span, ".."); diff --git a/src/tools/clippy/clippy_lints/src/missing_doc.rs b/src/tools/clippy/clippy_lints/src/missing_doc.rs index 5816a95dceb..a20377f320b 100644 --- a/src/tools/clippy/clippy_lints/src/missing_doc.rs +++ b/src/tools/clippy/clippy_lints/src/missing_doc.rs @@ -114,7 +114,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { hir::ItemKind::Fn(..) => { // ignore main() if it.ident.name == sym::main { - let at_root = cx.tcx.local_parent(it.def_id) == Some(CRATE_DEF_ID); + let at_root = cx.tcx.local_parent(it.def_id) == CRATE_DEF_ID; if at_root { return; } diff --git a/src/tools/clippy/clippy_utils/src/lib.rs b/src/tools/clippy/clippy_utils/src/lib.rs index 74978720424..7d46952d971 100644 --- a/src/tools/clippy/clippy_utils/src/lib.rs +++ b/src/tools/clippy/clippy_utils/src/lib.rs @@ -235,7 +235,7 @@ pub fn is_lang_ctor(cx: &LateContext<'_>, qpath: &QPath<'_>, lang_item: LangItem if let QPath::Resolved(_, path) = qpath { if let Res::Def(DefKind::Ctor(..), ctor_id) = path.res { if let Ok(item_id) = cx.tcx.lang_items().require(lang_item) { - return cx.tcx.parent(ctor_id) == Some(item_id); + return cx.tcx.parent(ctor_id) == item_id; } } } |
