Auto merge of #93970 - cjgillot:novis, r=petrochenkov
Remove visibility information from HIR The resolver exports all the necessary visibility information through the `tcx.visibility` query. This PR stops having a dedicated visibility field in HIR, in order to use this query. We keep a `vis_span` field for diagnostic purposes.
This commit is contained in:
commit
143eaa8d44
45 changed files with 312 additions and 550 deletions
|
@ -14,7 +14,6 @@ use rustc_hir::*;
|
|||
use rustc_index::vec::Idx;
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_span::def_id::StableCrateId;
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::Span;
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
@ -304,7 +303,6 @@ impl<'hir> Map<'hir> {
|
|||
| Node::Param(_)
|
||||
| Node::Arm(_)
|
||||
| Node::Lifetime(_)
|
||||
| Node::Visibility(_)
|
||||
| Node::Block(_) => return None,
|
||||
};
|
||||
Some(def_kind)
|
||||
|
@ -1000,12 +998,7 @@ impl<'hir> Map<'hir> {
|
|||
},
|
||||
Node::Lifetime(lifetime) => lifetime.span,
|
||||
Node::GenericParam(param) => param.span,
|
||||
Node::Visibility(&Spanned {
|
||||
node: VisibilityKind::Restricted { ref path, .. },
|
||||
..
|
||||
}) => path.span,
|
||||
Node::Infer(i) => i.span,
|
||||
Node::Visibility(v) => bug!("unexpected Visibility {:?}", v),
|
||||
Node::Local(local) => local.span,
|
||||
Node::Crate(item) => item.spans.inner_span,
|
||||
};
|
||||
|
@ -1128,6 +1121,10 @@ pub(super) fn crate_hash(tcx: TyCtxt<'_>, crate_num: CrateNum) -> Svh {
|
|||
}
|
||||
tcx.sess.opts.dep_tracking_hash(true).hash_stable(&mut hcx, &mut stable_hasher);
|
||||
tcx.sess.local_stable_crate_id().hash_stable(&mut hcx, &mut stable_hasher);
|
||||
// Hash visibility information since it does not appear in HIR.
|
||||
let resolutions = tcx.resolutions(());
|
||||
resolutions.visibilities.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
resolutions.has_pub_restricted.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
|
||||
let crate_hash: Fingerprint = stable_hasher.finish();
|
||||
Svh::new(crate_hash.to_smaller_hash())
|
||||
|
@ -1232,7 +1229,6 @@ fn hir_id_to_string(map: Map<'_>, id: HirId) -> String {
|
|||
Some(Node::Ctor(..)) => format!("ctor {}{}", path_str(), id_str),
|
||||
Some(Node::Lifetime(_)) => node_str("lifetime"),
|
||||
Some(Node::GenericParam(ref param)) => format!("generic_param {:?}{}", param, id_str),
|
||||
Some(Node::Visibility(ref vis)) => format!("visibility {:?}{}", vis, id_str),
|
||||
Some(Node::Crate(..)) => String::from("root_crate"),
|
||||
None => format!("unknown node{}", id_str),
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
|||
use rustc_data_structures::tagged_ptr::CopyTaggedPtr;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap, CRATE_DEF_ID};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LocalDefIdMap};
|
||||
use rustc_hir::Node;
|
||||
use rustc_macros::HashStable;
|
||||
use rustc_query_system::ich::StableHashingContext;
|
||||
|
@ -131,6 +131,8 @@ pub struct ResolverOutputs {
|
|||
pub definitions: rustc_hir::definitions::Definitions,
|
||||
pub cstore: Box<CrateStoreDyn>,
|
||||
pub visibilities: FxHashMap<LocalDefId, Visibility>,
|
||||
/// This field is used to decide whether we should make `PRIVATE_IN_PUBLIC` a hard error.
|
||||
pub has_pub_restricted: bool,
|
||||
pub access_levels: AccessLevels,
|
||||
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
|
||||
pub maybe_unused_trait_imports: FxHashSet<LocalDefId>,
|
||||
|
@ -317,22 +319,6 @@ impl<'tcx> DefIdTree for TyCtxt<'tcx> {
|
|||
}
|
||||
|
||||
impl Visibility {
|
||||
pub fn from_hir(visibility: &hir::Visibility<'_>, id: hir::HirId, tcx: TyCtxt<'_>) -> Self {
|
||||
match visibility.node {
|
||||
hir::VisibilityKind::Public => Visibility::Public,
|
||||
hir::VisibilityKind::Crate(_) => Visibility::Restricted(CRATE_DEF_ID.to_def_id()),
|
||||
hir::VisibilityKind::Restricted { ref path, .. } => match path.res {
|
||||
// If there is no resolution, `resolve` will have already reported an error, so
|
||||
// assume that the visibility is public to avoid reporting more privacy errors.
|
||||
Res::Err => Visibility::Public,
|
||||
def => Visibility::Restricted(def.def_id()),
|
||||
},
|
||||
hir::VisibilityKind::Inherited => {
|
||||
Visibility::Restricted(tcx.parent_module(id).to_def_id())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` if an item with this visibility is accessible from the given block.
|
||||
pub fn is_accessible_from<T: DefIdTree>(self, module: DefId, tree: T) -> bool {
|
||||
let restriction = match self {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue