Compute has_pub_restricted in the resolver.
This commit is contained in:
parent
88de3e52e4
commit
9861bc8d52
4 changed files with 13 additions and 12 deletions
|
@ -131,6 +131,8 @@ pub struct ResolverOutputs {
|
||||||
pub definitions: rustc_hir::definitions::Definitions,
|
pub definitions: rustc_hir::definitions::Definitions,
|
||||||
pub cstore: Box<CrateStoreDyn>,
|
pub cstore: Box<CrateStoreDyn>,
|
||||||
pub visibilities: FxHashMap<LocalDefId, Visibility>,
|
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 access_levels: AccessLevels,
|
||||||
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
|
pub extern_crate_map: FxHashMap<LocalDefId, CrateNum>,
|
||||||
pub maybe_unused_trait_imports: FxHashSet<LocalDefId>,
|
pub maybe_unused_trait_imports: FxHashSet<LocalDefId>,
|
||||||
|
|
|
@ -1661,7 +1661,6 @@ struct SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
||||||
item_def_id: LocalDefId,
|
item_def_id: LocalDefId,
|
||||||
/// The visitor checks that each component type is at least this visible.
|
/// The visitor checks that each component type is at least this visible.
|
||||||
required_visibility: ty::Visibility,
|
required_visibility: ty::Visibility,
|
||||||
has_pub_restricted: bool,
|
|
||||||
has_old_errors: bool,
|
has_old_errors: bool,
|
||||||
in_assoc_ty: bool,
|
in_assoc_ty: bool,
|
||||||
}
|
}
|
||||||
|
@ -1750,7 +1749,10 @@ impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
||||||
};
|
};
|
||||||
let make_msg = || format!("{} {} `{}` in public interface", vis_descr, kind, descr);
|
let make_msg = || format!("{} {} `{}` in public interface", vis_descr, kind, descr);
|
||||||
let span = self.tcx.def_span(self.item_def_id.to_def_id());
|
let span = self.tcx.def_span(self.item_def_id.to_def_id());
|
||||||
if self.has_pub_restricted || self.has_old_errors || self.in_assoc_ty {
|
if self.has_old_errors
|
||||||
|
|| self.in_assoc_ty
|
||||||
|
|| self.tcx.resolutions(()).has_pub_restricted
|
||||||
|
{
|
||||||
let mut err = if kind == "trait" {
|
let mut err = if kind == "trait" {
|
||||||
struct_span_err!(self.tcx.sess, span, E0445, "{}", make_msg())
|
struct_span_err!(self.tcx.sess, span, E0445, "{}", make_msg())
|
||||||
} else {
|
} else {
|
||||||
|
@ -1809,7 +1811,6 @@ impl<'tcx> DefIdVisitor<'tcx> for SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
||||||
|
|
||||||
struct PrivateItemsInPublicInterfacesVisitor<'tcx> {
|
struct PrivateItemsInPublicInterfacesVisitor<'tcx> {
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
has_pub_restricted: bool,
|
|
||||||
old_error_set_ancestry: LocalDefIdSet,
|
old_error_set_ancestry: LocalDefIdSet,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1823,7 +1824,6 @@ impl<'tcx> PrivateItemsInPublicInterfacesVisitor<'tcx> {
|
||||||
tcx: self.tcx,
|
tcx: self.tcx,
|
||||||
item_def_id: def_id,
|
item_def_id: def_id,
|
||||||
required_visibility,
|
required_visibility,
|
||||||
has_pub_restricted: self.has_pub_restricted,
|
|
||||||
has_old_errors: self.old_error_set_ancestry.contains(&def_id),
|
has_old_errors: self.old_error_set_ancestry.contains(&def_id),
|
||||||
in_assoc_ty: false,
|
in_assoc_ty: false,
|
||||||
}
|
}
|
||||||
|
@ -2061,13 +2061,6 @@ fn check_private_in_public(tcx: TyCtxt<'_>, (): ()) {
|
||||||
};
|
};
|
||||||
tcx.hir().walk_toplevel_module(&mut visitor);
|
tcx.hir().walk_toplevel_module(&mut visitor);
|
||||||
|
|
||||||
let has_pub_restricted = tcx.resolutions(()).visibilities.iter().any(|(&def_id, &v)| match v {
|
|
||||||
ty::Visibility::Public | ty::Visibility::Invisible => false,
|
|
||||||
ty::Visibility::Restricted(module) => {
|
|
||||||
module != tcx.parent_module_from_def_id(def_id).to_def_id()
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut old_error_set_ancestry = HirIdSet::default();
|
let mut old_error_set_ancestry = HirIdSet::default();
|
||||||
for mut id in visitor.old_error_set.iter().copied() {
|
for mut id in visitor.old_error_set.iter().copied() {
|
||||||
loop {
|
loop {
|
||||||
|
@ -2085,7 +2078,6 @@ fn check_private_in_public(tcx: TyCtxt<'_>, (): ()) {
|
||||||
// Check for private types and traits in public interfaces.
|
// Check for private types and traits in public interfaces.
|
||||||
let mut visitor = PrivateItemsInPublicInterfacesVisitor {
|
let mut visitor = PrivateItemsInPublicInterfacesVisitor {
|
||||||
tcx,
|
tcx,
|
||||||
has_pub_restricted,
|
|
||||||
// Only definition IDs are ever searched in `old_error_set_ancestry`,
|
// Only definition IDs are ever searched in `old_error_set_ancestry`,
|
||||||
// so we can filter away all non-definition IDs at this point.
|
// so we can filter away all non-definition IDs at this point.
|
||||||
old_error_set_ancestry: old_error_set_ancestry
|
old_error_set_ancestry: old_error_set_ancestry
|
||||||
|
|
|
@ -265,6 +265,8 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
ast::VisibilityKind::Restricted { ref path, id, .. } => {
|
ast::VisibilityKind::Restricted { ref path, id, .. } => {
|
||||||
|
// Make `PRIVATE_IN_PUBLIC` lint a hard error.
|
||||||
|
self.r.has_pub_restricted = true;
|
||||||
// For visibilities we are not ready to provide correct implementation of "uniform
|
// For visibilities we are not ready to provide correct implementation of "uniform
|
||||||
// paths" right now, so on 2018 edition we only allow module-relative paths for now.
|
// paths" right now, so on 2018 edition we only allow module-relative paths for now.
|
||||||
// On 2015 edition visibilities are resolved as crate-relative by default,
|
// On 2015 edition visibilities are resolved as crate-relative by default,
|
||||||
|
|
|
@ -934,6 +934,7 @@ pub struct Resolver<'a> {
|
||||||
glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
|
glob_map: FxHashMap<LocalDefId, FxHashSet<Symbol>>,
|
||||||
/// Visibilities in "lowered" form, for all entities that have them.
|
/// Visibilities in "lowered" form, for all entities that have them.
|
||||||
visibilities: FxHashMap<LocalDefId, ty::Visibility>,
|
visibilities: FxHashMap<LocalDefId, ty::Visibility>,
|
||||||
|
has_pub_restricted: bool,
|
||||||
used_imports: FxHashSet<NodeId>,
|
used_imports: FxHashSet<NodeId>,
|
||||||
maybe_unused_trait_imports: FxHashSet<LocalDefId>,
|
maybe_unused_trait_imports: FxHashSet<LocalDefId>,
|
||||||
maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
|
maybe_unused_extern_crates: Vec<(LocalDefId, Span)>,
|
||||||
|
@ -1313,6 +1314,7 @@ impl<'a> Resolver<'a> {
|
||||||
|
|
||||||
glob_map: Default::default(),
|
glob_map: Default::default(),
|
||||||
visibilities,
|
visibilities,
|
||||||
|
has_pub_restricted: false,
|
||||||
used_imports: FxHashSet::default(),
|
used_imports: FxHashSet::default(),
|
||||||
maybe_unused_trait_imports: Default::default(),
|
maybe_unused_trait_imports: Default::default(),
|
||||||
maybe_unused_extern_crates: Vec::new(),
|
maybe_unused_extern_crates: Vec::new(),
|
||||||
|
@ -1423,6 +1425,7 @@ impl<'a> Resolver<'a> {
|
||||||
let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect();
|
let proc_macros = self.proc_macros.iter().map(|id| self.local_def_id(*id)).collect();
|
||||||
let definitions = self.definitions;
|
let definitions = self.definitions;
|
||||||
let visibilities = self.visibilities;
|
let visibilities = self.visibilities;
|
||||||
|
let has_pub_restricted = self.has_pub_restricted;
|
||||||
let extern_crate_map = self.extern_crate_map;
|
let extern_crate_map = self.extern_crate_map;
|
||||||
let reexport_map = self.reexport_map;
|
let reexport_map = self.reexport_map;
|
||||||
let maybe_unused_trait_imports = self.maybe_unused_trait_imports;
|
let maybe_unused_trait_imports = self.maybe_unused_trait_imports;
|
||||||
|
@ -1435,6 +1438,7 @@ impl<'a> Resolver<'a> {
|
||||||
definitions,
|
definitions,
|
||||||
cstore: Box::new(self.crate_loader.into_cstore()),
|
cstore: Box::new(self.crate_loader.into_cstore()),
|
||||||
visibilities,
|
visibilities,
|
||||||
|
has_pub_restricted,
|
||||||
access_levels,
|
access_levels,
|
||||||
extern_crate_map,
|
extern_crate_map,
|
||||||
reexport_map,
|
reexport_map,
|
||||||
|
@ -1461,6 +1465,7 @@ impl<'a> Resolver<'a> {
|
||||||
access_levels: self.access_levels.clone(),
|
access_levels: self.access_levels.clone(),
|
||||||
cstore: Box::new(self.cstore().clone()),
|
cstore: Box::new(self.cstore().clone()),
|
||||||
visibilities: self.visibilities.clone(),
|
visibilities: self.visibilities.clone(),
|
||||||
|
has_pub_restricted: self.has_pub_restricted,
|
||||||
extern_crate_map: self.extern_crate_map.clone(),
|
extern_crate_map: self.extern_crate_map.clone(),
|
||||||
reexport_map: self.reexport_map.clone(),
|
reexport_map: self.reexport_map.clone(),
|
||||||
glob_map: self.glob_map.clone(),
|
glob_map: self.glob_map.clone(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue