diff --git a/compiler/rustc_resolve/src/effective_visibilities.rs b/compiler/rustc_resolve/src/effective_visibilities.rs
index b5614106fe997..c182e0877dad3 100644
--- a/compiler/rustc_resolve/src/effective_visibilities.rs
+++ b/compiler/rustc_resolve/src/effective_visibilities.rs
@@ -3,6 +3,7 @@ use std::mem;
use rustc_ast::visit::Visitor;
use rustc_ast::{Crate, EnumDef, ast, visit};
use rustc_data_structures::fx::FxHashSet;
+use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{CRATE_DEF_ID, LocalDefId};
use rustc_middle::middle::privacy::{EffectiveVisibilities, EffectiveVisibility, Level};
use rustc_middle::ty::Visibility;
@@ -11,17 +12,154 @@ use tracing::info;
use crate::{Decl, DeclKind, Resolver};
#[derive(Clone, Copy)]
-enum ParentId<'ra> {
+enum UseChainId<'ra> {
Def(LocalDefId),
Import(Decl<'ra>),
}
-impl ParentId<'_> {
- fn level(self) -> Level {
+trait Id<'a, 'ra, 'tcx> {
+ fn level(&self) -> Level;
+ fn effective_vis_or_private(
+ self,
+ visitor: &mut EffectiveVisibilitiesVisitor<'a, 'ra, 'tcx>,
+ ) -> EffectiveVisibility;
+ fn may_update(
+ self,
+ nominal_vis: Visibility,
+ visitor: &EffectiveVisibilitiesVisitor<'a, 'ra, 'tcx>,
+ ) -> Option