1
Fork 0

Remove IntoDefIdTree

This commit is contained in:
Oli Scherer 2023-02-18 08:11:00 +00:00
parent 1ab14ea7c2
commit 2a47113efa
2 changed files with 15 additions and 29 deletions

View file

@ -194,11 +194,6 @@ impl EffectiveVisibilities {
} }
} }
pub trait IntoDefIdTree {
type Tree: DefIdTree;
fn tree(self) -> Self::Tree;
}
impl<Id: Eq + Hash> EffectiveVisibilities<Id> { impl<Id: Eq + Hash> EffectiveVisibilities<Id> {
pub fn iter(&self) -> impl Iterator<Item = (&Id, &EffectiveVisibility)> { pub fn iter(&self) -> impl Iterator<Item = (&Id, &EffectiveVisibility)> {
self.map.iter() self.map.iter()
@ -217,25 +212,21 @@ impl<Id: Eq + Hash> EffectiveVisibilities<Id> {
self.map.entry(id).or_insert_with(|| EffectiveVisibility::from_vis(lazy_private_vis())) self.map.entry(id).or_insert_with(|| EffectiveVisibility::from_vis(lazy_private_vis()))
} }
pub fn update<T: IntoDefIdTree>( pub fn update(
&mut self, &mut self,
id: Id, id: Id,
nominal_vis: Visibility, nominal_vis: Visibility,
lazy_private_vis: impl FnOnce(T) -> (Visibility, T), lazy_private_vis: impl FnOnce() -> Visibility,
inherited_effective_vis: EffectiveVisibility, inherited_effective_vis: EffectiveVisibility,
level: Level, level: Level,
mut into_tree: T, tree: impl DefIdTree,
) -> bool { ) -> bool {
let mut changed = false; let mut changed = false;
let mut current_effective_vis = match self.map.get(&id).copied() { let mut current_effective_vis = self
Some(eff_vis) => eff_vis, .map
None => { .get(&id)
let private_vis; .copied()
(private_vis, into_tree) = lazy_private_vis(into_tree); .unwrap_or_else(|| EffectiveVisibility::from_vis(lazy_private_vis()));
EffectiveVisibility::from_vis(private_vis)
}
};
let tree = into_tree.tree();
let mut inherited_effective_vis_at_prev_level = *inherited_effective_vis.at_level(level); let mut inherited_effective_vis_at_prev_level = *inherited_effective_vis.at_level(level);
let mut calculated_effective_vis = inherited_effective_vis_at_prev_level; let mut calculated_effective_vis = inherited_effective_vis_at_prev_level;

View file

@ -7,8 +7,8 @@ use rustc_ast::EnumDef;
use rustc_data_structures::intern::Interned; use rustc_data_structures::intern::Interned;
use rustc_hir::def_id::LocalDefId; use rustc_hir::def_id::LocalDefId;
use rustc_hir::def_id::CRATE_DEF_ID; use rustc_hir::def_id::CRATE_DEF_ID;
use rustc_middle::middle::privacy::Level;
use rustc_middle::middle::privacy::{EffectiveVisibilities, EffectiveVisibility}; use rustc_middle::middle::privacy::{EffectiveVisibilities, EffectiveVisibility};
use rustc_middle::middle::privacy::{IntoDefIdTree, Level};
use rustc_middle::ty::{DefIdTree, Visibility}; use rustc_middle::ty::{DefIdTree, Visibility};
use std::mem; use std::mem;
@ -67,13 +67,6 @@ impl Resolver<'_, '_> {
} }
} }
impl<'a, 'b, 'tcx> IntoDefIdTree for &'b mut Resolver<'a, 'tcx> {
type Tree = &'b Resolver<'a, 'tcx>;
fn tree(self) -> Self::Tree {
self
}
}
impl<'r, 'a, 'tcx> EffectiveVisibilitiesVisitor<'r, 'a, 'tcx> { impl<'r, 'a, 'tcx> EffectiveVisibilitiesVisitor<'r, 'a, 'tcx> {
/// Fills the `Resolver::effective_visibilities` table with public & exported items /// Fills the `Resolver::effective_visibilities` table with public & exported items
/// For now, this doesn't resolve macros (FIXME) and cannot resolve Impl, as we /// For now, this doesn't resolve macros (FIXME) and cannot resolve Impl, as we
@ -167,26 +160,28 @@ impl<'r, 'a, 'tcx> EffectiveVisibilitiesVisitor<'r, 'a, 'tcx> {
let nominal_vis = binding.vis.expect_local(); let nominal_vis = binding.vis.expect_local();
let private_vis = self.cheap_private_vis(parent_id); let private_vis = self.cheap_private_vis(parent_id);
let inherited_eff_vis = self.effective_vis_or_private(parent_id); let inherited_eff_vis = self.effective_vis_or_private(parent_id);
let tcx = self.r.tcx;
self.changed |= self.import_effective_visibilities.update( self.changed |= self.import_effective_visibilities.update(
binding, binding,
nominal_vis, nominal_vis,
|r| (private_vis.unwrap_or_else(|| r.private_vis_import(binding)), r), || private_vis.unwrap_or_else(|| self.r.private_vis_import(binding)),
inherited_eff_vis, inherited_eff_vis,
parent_id.level(), parent_id.level(),
&mut *self.r, tcx,
); );
} }
fn update_def(&mut self, def_id: LocalDefId, nominal_vis: Visibility, parent_id: ParentId<'a>) { fn update_def(&mut self, def_id: LocalDefId, nominal_vis: Visibility, parent_id: ParentId<'a>) {
let private_vis = self.cheap_private_vis(parent_id); let private_vis = self.cheap_private_vis(parent_id);
let inherited_eff_vis = self.effective_vis_or_private(parent_id); let inherited_eff_vis = self.effective_vis_or_private(parent_id);
let tcx = self.r.tcx;
self.changed |= self.def_effective_visibilities.update( self.changed |= self.def_effective_visibilities.update(
def_id, def_id,
nominal_vis, nominal_vis,
|r| (private_vis.unwrap_or_else(|| r.private_vis_def(def_id)), r), || private_vis.unwrap_or_else(|| self.r.private_vis_def(def_id)),
inherited_eff_vis, inherited_eff_vis,
parent_id.level(), parent_id.level(),
&mut *self.r, tcx,
); );
} }