diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index b2088265605..4f7c4153ea1 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -746,15 +746,9 @@ impl<'hir> Map<'hir> { hir_id } - /// Returns the `DefId` of `id`'s nearest module parent, or `id` itself if no - /// module parent is in this map. - pub fn get_module_parent(&self, id: HirId) -> DefId { - self.local_def_id(self.get_module_parent_node(id)) - } - /// Returns the `HirId` of `id`'s nearest module parent, or `id` itself if no /// module parent is in this map. - pub fn get_module_parent_node(&self, hir_id: HirId) -> HirId { + pub(super) fn get_module_parent_node(&self, hir_id: HirId) -> HirId { for (hir_id, node) in self.parent_iter(hir_id) { if let Node::Item(&Item { kind: ItemKind::Mod(_), .. }) = node { return hir_id; diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index 7d48280661a..1aa3b27bd1a 100644 --- a/src/librustc/hir/mod.rs +++ b/src/librustc/hir/mod.rs @@ -7,9 +7,10 @@ pub mod map; use crate::ty::query::Providers; use crate::ty::TyCtxt; -use rustc_hir::def_id::LOCAL_CRATE; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_hir::print; use rustc_hir::Crate; +use rustc_hir::HirId; use std::ops::Deref; /// A wrapper type which allows you to access HIR. @@ -45,9 +46,17 @@ impl<'tcx> TyCtxt<'tcx> { pub fn hir(self) -> Hir<'tcx> { Hir { tcx: self, map: &self.hir_map } } + + pub fn parent_module(self, id: HirId) -> DefId { + self.parent_module_from_def_id(DefId::local(id.owner)) + } } pub fn provide(providers: &mut Providers<'_>) { + providers.parent_module_from_def_id = |tcx, id| { + let hir = tcx.hir(); + hir.local_def_id(hir.get_module_parent_node(hir.as_local_hir_id(id).unwrap())) + }; providers.hir_crate = |tcx, _| tcx.hir_map.untracked_krate(); map::provide(providers); } diff --git a/src/librustc/query/mod.rs b/src/librustc/query/mod.rs index f3249f5014d..b3315cc3701 100644 --- a/src/librustc/query/mod.rs +++ b/src/librustc/query/mod.rs @@ -98,6 +98,10 @@ rustc_queries! { eval_always desc { "computing the lint levels for items in this crate" } } + + query parent_module_from_def_id(_: DefId) -> DefId { + eval_always + } } Codegen { diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index 89ff0b2a0cc..c9e58b6c771 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -385,9 +385,7 @@ impl Visibility { Res::Err => Visibility::Public, def => Visibility::Restricted(def.def_id()), }, - hir::VisibilityKind::Inherited => { - Visibility::Restricted(tcx.hir().get_module_parent(id)) - } + hir::VisibilityKind::Inherited => Visibility::Restricted(tcx.parent_module(id)), } } @@ -3087,7 +3085,7 @@ impl<'tcx> TyCtxt<'tcx> { Some(actual_expansion) => { self.hir().definitions().parent_module_of_macro_def(actual_expansion) } - None => self.hir().get_module_parent(block), + None => self.parent_module(block), }; (ident, scope) } diff --git a/src/librustc_lint/unused.rs b/src/librustc_lint/unused.rs index 7b6741954d9..02f04b23459 100644 --- a/src/librustc_lint/unused.rs +++ b/src/librustc_lint/unused.rs @@ -124,8 +124,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnusedResults { descr_post: &str, plural_len: usize, ) -> bool { - if ty.is_unit() - || cx.tcx.is_ty_uninhabited_from(cx.tcx.hir().get_module_parent(expr.hir_id), ty) + if ty.is_unit() || cx.tcx.is_ty_uninhabited_from(cx.tcx.parent_module(expr.hir_id), ty) { return true; } diff --git a/src/librustc_mir_build/hair/pattern/check_match.rs b/src/librustc_mir_build/hair/pattern/check_match.rs index edd05ee0aa9..d0eefb2e4d1 100644 --- a/src/librustc_mir_build/hair/pattern/check_match.rs +++ b/src/librustc_mir_build/hair/pattern/check_match.rs @@ -142,7 +142,7 @@ impl<'tcx> MatchVisitor<'_, 'tcx> { } fn check_in_cx(&self, hir_id: HirId, f: impl FnOnce(MatchCheckCtxt<'_, 'tcx>)) { - let module = self.tcx.hir().get_module_parent(hir_id); + let module = self.tcx.parent_module(hir_id); MatchCheckCtxt::create_and_enter(self.tcx, self.param_env, module, |cx| f(cx)); } diff --git a/src/librustc_passes/liveness.rs b/src/librustc_passes/liveness.rs index 43b615dee98..5b6d0fc74e8 100644 --- a/src/librustc_passes/liveness.rs +++ b/src/librustc_passes/liveness.rs @@ -1125,7 +1125,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { } hir::ExprKind::Call(ref f, ref args) => { - let m = self.ir.tcx.hir().get_module_parent(expr.hir_id); + let m = self.ir.tcx.parent_module(expr.hir_id); let succ = if self.ir.tcx.is_ty_uninhabited_from(m, self.tables.expr_ty(expr)) { self.s.exit_ln } else { @@ -1136,7 +1136,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { } hir::ExprKind::MethodCall(.., ref args) => { - let m = self.ir.tcx.hir().get_module_parent(expr.hir_id); + let m = self.ir.tcx.parent_module(expr.hir_id); let succ = if self.ir.tcx.is_ty_uninhabited_from(m, self.tables.expr_ty(expr)) { self.s.exit_ln } else { diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 0a27c323644..24696b20332 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -327,7 +327,7 @@ fn def_id_visibility<'tcx>( } Node::Expr(expr) => { return ( - ty::Visibility::Restricted(tcx.hir().get_module_parent(expr.hir_id)), + ty::Visibility::Restricted(tcx.parent_module(expr.hir_id)), expr.span, "private", ); diff --git a/src/librustc_typeck/check/method/suggest.rs b/src/librustc_typeck/check/method/suggest.rs index cd96a3ad9f1..95faa353e9b 100644 --- a/src/librustc_typeck/check/method/suggest.rs +++ b/src/librustc_typeck/check/method/suggest.rs @@ -427,7 +427,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { }); if let Some((field, field_ty)) = field_receiver { - let scope = self.tcx.hir().get_module_parent(self.body_id); + let scope = self.tcx.parent_module(self.body_id); let is_accessible = field.vis.is_accessible_from(scope, self.tcx); if is_accessible { @@ -824,7 +824,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { mut msg: String, candidates: Vec, ) { - let module_did = self.tcx.hir().get_module_parent(self.body_id); + let module_did = self.tcx.parent_module(self.body_id); let module_id = self.tcx.hir().as_local_hir_id(module_did).unwrap(); let krate = self.tcx.hir().krate(); let (span, found_use) = UsePlacementFinder::check(self.tcx, krate, module_id); diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index ad121a667da..7aa90d66781 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -348,7 +348,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { let parent_node = self.cx.as_local_hir_id(item.def_id).and_then(|hir_id| { // FIXME: this fails hard for impls in non-module scope, but is necessary for the // current `resolve()` implementation. - match self.cx.tcx.hir().get_module_parent_node(hir_id) { + match self.cx.as_local_hir_id(self.cx.tcx.parent_module(hir_id)).unwrap() { id if id != hir_id => Some(id), _ => None, }