Use {Local}ModDefId
in many queries
This commit is contained in:
parent
40de40e094
commit
c75fc573aa
26 changed files with 177 additions and 98 deletions
|
@ -20,7 +20,7 @@ use rustc_errors::{DiagnosticMessage, SubdiagnosticMessage};
|
|||
use rustc_fluent_macro::fluent_messages;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_ID};
|
||||
use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId, CRATE_DEF_ID};
|
||||
use rustc_hir::intravisit::{self, Visitor};
|
||||
use rustc_hir::{AssocItemKind, ForeignItemKind, HirIdSet, ItemId, Node, PatKind};
|
||||
use rustc_middle::bug;
|
||||
|
@ -382,8 +382,9 @@ impl VisibilityLike for EffectiveVisibility {
|
|||
) -> Self {
|
||||
let effective_vis =
|
||||
find.effective_visibilities.effective_vis(def_id).copied().unwrap_or_else(|| {
|
||||
let private_vis =
|
||||
ty::Visibility::Restricted(find.tcx.parent_module_from_def_id(def_id));
|
||||
let private_vis = ty::Visibility::Restricted(
|
||||
find.tcx.parent_module_from_def_id(def_id).to_local_def_id(),
|
||||
);
|
||||
EffectiveVisibility::from_vis(private_vis)
|
||||
});
|
||||
|
||||
|
@ -412,7 +413,7 @@ struct EmbargoVisitor<'tcx> {
|
|||
/// pub macro m() {
|
||||
/// n::p::f()
|
||||
/// }
|
||||
macro_reachable: FxHashSet<(LocalDefId, LocalDefId)>,
|
||||
macro_reachable: FxHashSet<(LocalModDefId, LocalModDefId)>,
|
||||
/// Preliminary pass for marking all underlying types of `impl Trait`s as reachable.
|
||||
impl_trait_pass: bool,
|
||||
/// Has something changed in the level map?
|
||||
|
@ -449,7 +450,9 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
max_vis: Option<ty::Visibility>,
|
||||
level: Level,
|
||||
) {
|
||||
let private_vis = ty::Visibility::Restricted(self.tcx.parent_module_from_def_id(def_id));
|
||||
// FIXME(typed_def_id): Make `Visibility::Restricted` use a `LocalModDefId` by default.
|
||||
let private_vis =
|
||||
ty::Visibility::Restricted(self.tcx.parent_module_from_def_id(def_id).into());
|
||||
if max_vis != Some(private_vis) {
|
||||
self.changed |= self.effective_visibilities.update(
|
||||
def_id,
|
||||
|
@ -508,6 +511,8 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
// The macro's parent doesn't correspond to a `mod`, return early (#63164, #65252).
|
||||
return;
|
||||
}
|
||||
// FIXME(typed_def_id): Introduce checked constructors that check def_kind.
|
||||
let macro_module_def_id = LocalModDefId::new_unchecked(macro_module_def_id);
|
||||
|
||||
if self.effective_visibilities.public_at_level(local_def_id).is_none() {
|
||||
return;
|
||||
|
@ -522,7 +527,7 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
if changed_reachability || module_def_id == LocalModDefId::CRATE_DEF_ID {
|
||||
break;
|
||||
}
|
||||
module_def_id = self.tcx.local_parent(module_def_id);
|
||||
module_def_id = LocalModDefId::new_unchecked(self.tcx.local_parent(module_def_id));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -530,8 +535,8 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
/// module. Returns `true` if the level has changed.
|
||||
fn update_macro_reachable(
|
||||
&mut self,
|
||||
module_def_id: LocalDefId,
|
||||
defining_mod: LocalDefId,
|
||||
module_def_id: LocalModDefId,
|
||||
defining_mod: LocalModDefId,
|
||||
macro_ev: EffectiveVisibility,
|
||||
) -> bool {
|
||||
if self.macro_reachable.insert((module_def_id, defining_mod)) {
|
||||
|
@ -544,8 +549,8 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
|
||||
fn update_macro_reachable_mod(
|
||||
&mut self,
|
||||
module_def_id: LocalDefId,
|
||||
defining_mod: LocalDefId,
|
||||
module_def_id: LocalModDefId,
|
||||
defining_mod: LocalModDefId,
|
||||
macro_ev: EffectiveVisibility,
|
||||
) {
|
||||
let module = self.tcx.hir().get_module(module_def_id).0;
|
||||
|
@ -560,7 +565,7 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
macro_ev,
|
||||
);
|
||||
}
|
||||
for child in self.tcx.module_children_local(module_def_id) {
|
||||
for child in self.tcx.module_children_local(module_def_id.to_local_def_id()) {
|
||||
// FIXME: Use module children for the logic above too.
|
||||
if !child.reexport_chain.is_empty()
|
||||
&& child.vis.is_accessible_from(defining_mod, self.tcx)
|
||||
|
@ -577,7 +582,7 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
def_id: LocalDefId,
|
||||
def_kind: DefKind,
|
||||
vis: ty::Visibility,
|
||||
module: LocalDefId,
|
||||
module: LocalModDefId,
|
||||
macro_ev: EffectiveVisibility,
|
||||
) {
|
||||
self.update(def_id, macro_ev, Level::Reachable);
|
||||
|
@ -608,7 +613,11 @@ impl<'tcx> EmbargoVisitor<'tcx> {
|
|||
// the module, however may be reachable.
|
||||
DefKind::Mod => {
|
||||
if vis.is_accessible_from(module, self.tcx) {
|
||||
self.update_macro_reachable(def_id, module, macro_ev);
|
||||
self.update_macro_reachable(
|
||||
LocalModDefId::new_unchecked(def_id),
|
||||
module,
|
||||
macro_ev,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -892,7 +901,7 @@ fn vis_to_string<'tcx>(def_id: LocalDefId, vis: ty::Visibility, tcx: TyCtxt<'tcx
|
|||
ty::Visibility::Restricted(restricted_id) => {
|
||||
if restricted_id.is_top_level_module() {
|
||||
"pub(crate)".to_string()
|
||||
} else if restricted_id == tcx.parent_module_from_def_id(def_id) {
|
||||
} else if restricted_id == tcx.parent_module_from_def_id(def_id).to_local_def_id() {
|
||||
"pub(self)".to_string()
|
||||
} else {
|
||||
format!("pub({})", tcx.item_name(restricted_id.to_def_id()))
|
||||
|
@ -1800,7 +1809,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
|||
let vis_descr = match vis {
|
||||
ty::Visibility::Public => "public",
|
||||
ty::Visibility::Restricted(vis_def_id) => {
|
||||
if vis_def_id == self.tcx.parent_module(hir_id) {
|
||||
if vis_def_id == self.tcx.parent_module(hir_id).to_local_def_id() {
|
||||
"private"
|
||||
} else if vis_def_id.is_top_level_module() {
|
||||
"crate-private"
|
||||
|
@ -2196,7 +2205,7 @@ fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility {
|
|||
kind: hir::ItemKind::Use(_, hir::UseKind::ListStem)
|
||||
| hir::ItemKind::OpaqueTy(..),
|
||||
..
|
||||
}) => ty::Visibility::Restricted(tcx.parent_module(hir_id)),
|
||||
}) => ty::Visibility::Restricted(tcx.parent_module(hir_id).to_local_def_id()),
|
||||
// Visibilities of trait impl items are inherited from their traits
|
||||
// and are not filled in resolve.
|
||||
Node::ImplItem(impl_item) => {
|
||||
|
@ -2224,18 +2233,25 @@ fn local_visibility(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Visibility {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_mod_privacy(tcx: TyCtxt<'_>, module_def_id: LocalDefId) {
|
||||
fn check_mod_privacy(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
|
||||
// Check privacy of names not checked in previous compilation stages.
|
||||
let mut visitor =
|
||||
NamePrivacyVisitor { tcx, maybe_typeck_results: None, current_item: module_def_id };
|
||||
let mut visitor = NamePrivacyVisitor {
|
||||
tcx,
|
||||
maybe_typeck_results: None,
|
||||
current_item: module_def_id.to_local_def_id(),
|
||||
};
|
||||
let (module, span, hir_id) = tcx.hir().get_module(module_def_id);
|
||||
|
||||
intravisit::walk_mod(&mut visitor, module, hir_id);
|
||||
|
||||
// Check privacy of explicitly written types and traits as well as
|
||||
// inferred types of expressions and patterns.
|
||||
let mut visitor =
|
||||
TypePrivacyVisitor { tcx, maybe_typeck_results: None, current_item: module_def_id, span };
|
||||
let mut visitor = TypePrivacyVisitor {
|
||||
tcx,
|
||||
maybe_typeck_results: None,
|
||||
current_item: module_def_id.to_local_def_id(),
|
||||
span,
|
||||
};
|
||||
intravisit::walk_mod(&mut visitor, module, hir_id);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue