From 542d813475eeac7cac1bae5de32fe7809b4bf771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Tue, 11 Feb 2020 14:38:16 +0100 Subject: [PATCH] Add a `parent_module_from_def_id` query --- src/librustc/hir/mod.rs | 11 ++++++++++- src/librustc/query/mod.rs | 4 ++++ src/librustc/ty/mod.rs | 6 ++---- src/librustc_lint/unused.rs | 3 +-- src/librustc_mir_build/hair/pattern/check_match.rs | 2 +- src/librustc_passes/liveness.rs | 4 ++-- src/librustc_privacy/lib.rs | 2 +- src/librustc_typeck/check/method/suggest.rs | 4 ++-- src/librustdoc/passes/collect_intra_doc_links.rs | 2 +- 9 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/librustc/hir/mod.rs b/src/librustc/hir/mod.rs index 7d48280661a..4ce335d0c95 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.get_module_parent(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 69698eabac4..542a0033ade 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 dae9f945ce0..8105f4faa0f 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 7870b9da4cb..60316a8db4f 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 3dfe826ad2a..6dd6f8ad43f 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 f0bb3cd08ad..4a7df8b3f0e 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 ef1e99c5a64..6867aac9f8f 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 ea83b40a1cb..76614ca4fe2 100644 --- a/src/librustc_typeck/check/method/suggest.rs +++ b/src/librustc_typeck/check/method/suggest.rs @@ -426,7 +426,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 { @@ -685,7 +685,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 0b27e5cf806..5a2706ae20a 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, }