Drop vis in FieldDef.

This commit is contained in:
Camille GILLOT 2022-02-13 01:54:13 +01:00
parent 4e8046f67a
commit a62680d108
7 changed files with 81 additions and 63 deletions

View File

@ -851,7 +851,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
// FIXME(jseyfried): positional field hygiene. // FIXME(jseyfried): positional field hygiene.
None => Ident::new(sym::integer(index), self.lower_span(f.span)), None => Ident::new(sym::integer(index), self.lower_span(f.span)),
}, },
vis: self.lower_visibility(&f.vis), vis_span: self.lower_span(f.vis.span),
ty, ty,
} }
} }

View File

@ -2671,8 +2671,8 @@ impl VisibilityKind<'_> {
#[derive(Debug, HashStable_Generic)] #[derive(Debug, HashStable_Generic)]
pub struct FieldDef<'hir> { pub struct FieldDef<'hir> {
pub span: Span, pub span: Span,
pub vis_span: Span,
pub ident: Ident, pub ident: Ident,
pub vis: Visibility<'hir>,
pub hir_id: HirId, pub hir_id: HirId,
pub ty: &'hir Ty<'hir>, pub ty: &'hir Ty<'hir>,
} }

View File

@ -1384,17 +1384,15 @@ impl UnreachablePub {
cx: &LateContext<'_>, cx: &LateContext<'_>,
what: &str, what: &str,
def_id: LocalDefId, def_id: LocalDefId,
vis: &hir::Visibility<'_>, vis_span: Span,
span: Span,
exportable: bool, exportable: bool,
) { ) {
let mut applicability = Applicability::MachineApplicable; let mut applicability = Applicability::MachineApplicable;
match vis.node { if !cx.access_levels.is_reachable(def_id) {
hir::VisibilityKind::Public if !cx.access_levels.is_reachable(def_id) => { if vis_span.from_expansion() {
if span.from_expansion() {
applicability = Applicability::MaybeIncorrect; applicability = Applicability::MaybeIncorrect;
} }
let def_span = cx.tcx.sess.source_map().guess_head_span(span); let def_span = cx.tcx.def_span(def_id);
cx.struct_span_lint(UNREACHABLE_PUB, def_span, |lint| { cx.struct_span_lint(UNREACHABLE_PUB, def_span, |lint| {
let mut err = lint.build(&format!("unreachable `pub` {}", what)); let mut err = lint.build(&format!("unreachable `pub` {}", what));
let replacement = if cx.tcx.features().crate_visibility_modifier { let replacement = if cx.tcx.features().crate_visibility_modifier {
@ -1405,7 +1403,7 @@ impl UnreachablePub {
.to_owned(); .to_owned();
err.span_suggestion( err.span_suggestion(
vis.span, vis_span,
"consider restricting its visibility", "consider restricting its visibility",
replacement, replacement,
applicability, applicability,
@ -1416,34 +1414,33 @@ impl UnreachablePub {
err.emit(); err.emit();
}); });
} }
_ => {}
}
} }
} }
impl<'tcx> LateLintPass<'tcx> for UnreachablePub { impl<'tcx> LateLintPass<'tcx> for UnreachablePub {
fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) { fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) {
self.perform_lint(cx, "item", item.def_id, &item.vis, item.span, true); if cx.tcx.visibility(item.def_id).is_public() {
self.perform_lint(cx, "item", item.def_id, item.vis.span, true);
}
} }
fn check_foreign_item(&mut self, cx: &LateContext<'_>, foreign_item: &hir::ForeignItem<'tcx>) { fn check_foreign_item(&mut self, cx: &LateContext<'_>, foreign_item: &hir::ForeignItem<'tcx>) {
self.perform_lint( if cx.tcx.visibility(foreign_item.def_id).is_public() {
cx, self.perform_lint(cx, "item", foreign_item.def_id, foreign_item.vis.span, true);
"item", }
foreign_item.def_id,
&foreign_item.vis,
foreign_item.span,
true,
);
} }
fn check_field_def(&mut self, cx: &LateContext<'_>, field: &hir::FieldDef<'_>) { fn check_field_def(&mut self, cx: &LateContext<'_>, field: &hir::FieldDef<'_>) {
let def_id = cx.tcx.hir().local_def_id(field.hir_id); let def_id = cx.tcx.hir().local_def_id(field.hir_id);
self.perform_lint(cx, "field", def_id, &field.vis, field.span, false); if cx.tcx.visibility(def_id).is_public() {
self.perform_lint(cx, "field", def_id, field.vis_span, false);
}
} }
fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &hir::ImplItem<'_>) { fn check_impl_item(&mut self, cx: &LateContext<'_>, impl_item: &hir::ImplItem<'_>) {
self.perform_lint(cx, "item", impl_item.def_id, &impl_item.vis, impl_item.span, false); if cx.tcx.visibility(impl_item.def_id).is_public() {
self.perform_lint(cx, "item", impl_item.def_id, impl_item.vis.span, false);
}
} }
} }

View File

@ -354,14 +354,24 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> {
_: hir::HirId, _: hir::HirId,
_: rustc_span::Span, _: rustc_span::Span,
) { ) {
let tcx = self.tcx;
let has_repr_c = self.repr_has_repr_c; let has_repr_c = self.repr_has_repr_c;
let inherited_pub_visibility = self.inherited_pub_visibility; let inherited_pub_visibility = self.inherited_pub_visibility;
let pub_visibility = self.pub_visibility; let pub_visibility = self.pub_visibility;
let live_fields = def.fields().iter().filter(|f| { let live_fields = def.fields().iter().filter_map(|f| {
has_repr_c || (pub_visibility && (inherited_pub_visibility || f.vis.node.is_pub())) let def_id = tcx.hir().local_def_id(f.hir_id);
if has_repr_c {
return Some(def_id);
}
if !pub_visibility {
return None;
}
if inherited_pub_visibility {
return Some(def_id);
}
if tcx.visibility(def_id).is_public() { Some(def_id) } else { None }
}); });
let hir = self.tcx.hir(); self.live_symbols.extend(live_fields);
self.live_symbols.extend(live_fields.map(|f| hir.local_def_id(f.hir_id)));
intravisit::walk_struct_def(self, def); intravisit::walk_struct_def(self, def);
} }

View File

@ -660,7 +660,9 @@ impl<'tcx> Visitor<'tcx> for EmbargoVisitor<'tcx> {
self.update_with_hir_id(ctor_hir_id, item_level); self.update_with_hir_id(ctor_hir_id, item_level);
} }
for field in def.fields() { for field in def.fields() {
if field.vis.node.is_pub() { let def_id = self.tcx.hir().local_def_id(field.hir_id);
let vis = self.tcx.visibility(def_id);
if vis.is_public() {
self.update_with_hir_id(field.hir_id, item_level); self.update_with_hir_id(field.hir_id, item_level);
} }
} }
@ -1633,7 +1635,9 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
} }
fn visit_field_def(&mut self, s: &'tcx hir::FieldDef<'tcx>) { fn visit_field_def(&mut self, s: &'tcx hir::FieldDef<'tcx>) {
if s.vis.node.is_pub() || self.in_variant { let def_id = self.tcx.hir().local_def_id(s.hir_id);
let vis = self.tcx.visibility(def_id);
if vis.is_public() || self.in_variant {
intravisit::walk_field_def(self, s); intravisit::walk_field_def(self, s);
} }
} }

View File

@ -57,9 +57,9 @@ macro_rules! down_cast_data {
} }
macro_rules! access_from { macro_rules! access_from {
($save_ctxt:expr, $item:expr, $id:expr) => { ($save_ctxt:expr, $id:expr) => {
Access { Access {
public: $item.vis.node.is_pub(), public: $save_ctxt.tcx.visibility($id).is_public(),
reachable: $save_ctxt.access_levels.is_reachable($id), reachable: $save_ctxt.access_levels.is_reachable($id),
} }
}; };
@ -302,7 +302,7 @@ impl<'tcx> DumpVisitor<'tcx> {
let field_data = self.save_ctxt.get_field_data(field, parent_id); let field_data = self.save_ctxt.get_field_data(field, parent_id);
if let Some(field_data) = field_data { if let Some(field_data) = field_data {
self.dumper.dump_def( self.dumper.dump_def(
&access_from!(self.save_ctxt, field, self.tcx.hir().local_def_id(field.hir_id)), &access_from!(self.save_ctxt, self.tcx.hir().local_def_id(field.hir_id)),
field_data, field_data,
); );
} }
@ -369,7 +369,7 @@ impl<'tcx> DumpVisitor<'tcx> {
v.process_formals(body.params, &fn_data.qualname); v.process_formals(body.params, &fn_data.qualname);
v.process_generic_params(ty_params, &fn_data.qualname, item.hir_id()); v.process_generic_params(ty_params, &fn_data.qualname, item.hir_id());
v.dumper.dump_def(&access_from!(v.save_ctxt, item, item.def_id), fn_data); v.dumper.dump_def(&access_from!(v.save_ctxt, item.def_id), fn_data);
} }
for arg in decl.inputs { for arg in decl.inputs {
@ -393,7 +393,7 @@ impl<'tcx> DumpVisitor<'tcx> {
self.nest_typeck_results(item.def_id, |v| { self.nest_typeck_results(item.def_id, |v| {
if let Some(var_data) = v.save_ctxt.get_item_data(item) { if let Some(var_data) = v.save_ctxt.get_item_data(item) {
down_cast_data!(var_data, DefData, item.span); down_cast_data!(var_data, DefData, item.span);
v.dumper.dump_def(&access_from!(v.save_ctxt, item, item.def_id), var_data); v.dumper.dump_def(&access_from!(v.save_ctxt, item.def_id), var_data);
} }
v.visit_ty(&typ); v.visit_ty(&typ);
v.visit_expr(expr); v.visit_expr(expr);
@ -469,7 +469,11 @@ impl<'tcx> DumpVisitor<'tcx> {
let fields_str = fields let fields_str = fields
.iter() .iter()
.filter_map(|f| { .filter_map(|f| {
if include_priv_fields || f.vis.node.is_pub() { if include_priv_fields {
return Some(f.ident.to_string());
}
let def_id = self.save_ctxt.tcx.hir().local_def_id(f.hir_id);
if self.save_ctxt.tcx.visibility(def_id).is_public() {
Some(f.ident.to_string()) Some(f.ident.to_string())
} else { } else {
None None
@ -487,7 +491,7 @@ impl<'tcx> DumpVisitor<'tcx> {
let span = self.span_from_span(item.ident.span); let span = self.span_from_span(item.ident.span);
let attrs = self.tcx.hir().attrs(item.hir_id()); let attrs = self.tcx.hir().attrs(item.hir_id());
self.dumper.dump_def( self.dumper.dump_def(
&access_from!(self.save_ctxt, item, item.def_id), &access_from!(self.save_ctxt, item.def_id),
Def { Def {
kind, kind,
id: id_from_def_id(item.def_id.to_def_id()), id: id_from_def_id(item.def_id.to_def_id()),
@ -527,7 +531,7 @@ impl<'tcx> DumpVisitor<'tcx> {
}; };
down_cast_data!(enum_data, DefData, item.span); down_cast_data!(enum_data, DefData, item.span);
let access = access_from!(self.save_ctxt, item, item.def_id); let access = access_from!(self.save_ctxt, item.def_id);
for variant in enum_definition.variants { for variant in enum_definition.variants {
let name = variant.ident.name.to_string(); let name = variant.ident.name.to_string();
@ -662,7 +666,7 @@ impl<'tcx> DumpVisitor<'tcx> {
methods.iter().map(|i| id_from_def_id(i.id.def_id.to_def_id())).collect(); methods.iter().map(|i| id_from_def_id(i.id.def_id.to_def_id())).collect();
let attrs = self.tcx.hir().attrs(item.hir_id()); let attrs = self.tcx.hir().attrs(item.hir_id());
self.dumper.dump_def( self.dumper.dump_def(
&access_from!(self.save_ctxt, item, item.def_id), &access_from!(self.save_ctxt, item.def_id),
Def { Def {
kind: DefKind::Trait, kind: DefKind::Trait,
id, id,
@ -724,7 +728,7 @@ impl<'tcx> DumpVisitor<'tcx> {
fn process_mod(&mut self, item: &'tcx hir::Item<'tcx>) { fn process_mod(&mut self, item: &'tcx hir::Item<'tcx>) {
if let Some(mod_data) = self.save_ctxt.get_item_data(item) { if let Some(mod_data) = self.save_ctxt.get_item_data(item) {
down_cast_data!(mod_data, DefData, item.span); down_cast_data!(mod_data, DefData, item.span);
self.dumper.dump_def(&access_from!(self.save_ctxt, item, item.def_id), mod_data); self.dumper.dump_def(&access_from!(self.save_ctxt, item.def_id), mod_data);
} }
} }
@ -1147,7 +1151,7 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> {
hir::ItemKind::Use(path, hir::UseKind::Single) => { hir::ItemKind::Use(path, hir::UseKind::Single) => {
let sub_span = path.segments.last().unwrap().ident.span; let sub_span = path.segments.last().unwrap().ident.span;
if !self.span.filter_generated(sub_span) { if !self.span.filter_generated(sub_span) {
let access = access_from!(self.save_ctxt, item, item.def_id); let access = access_from!(self.save_ctxt, item.def_id);
let ref_id = self.lookup_def_id(item.hir_id()).map(id_from_def_id); let ref_id = self.lookup_def_id(item.hir_id()).map(id_from_def_id);
let span = self.span_from_span(sub_span); let span = self.span_from_span(sub_span);
let parent = let parent =
@ -1176,7 +1180,7 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> {
// we don't want to track anyway, since it's probably macro-internal `use` // we don't want to track anyway, since it's probably macro-internal `use`
if let Some(sub_span) = self.span.sub_span_of_star(item.span) { if let Some(sub_span) = self.span.sub_span_of_star(item.span) {
if !self.span.filter_generated(item.span) { if !self.span.filter_generated(item.span) {
let access = access_from!(self.save_ctxt, item, item.def_id); let access = access_from!(self.save_ctxt, item.def_id);
let span = self.span_from_span(sub_span); let span = self.span_from_span(sub_span);
let parent = let parent =
self.save_ctxt.tcx.parent(item.def_id.to_def_id()).map(id_from_def_id); self.save_ctxt.tcx.parent(item.def_id.to_def_id()).map(id_from_def_id);
@ -1249,7 +1253,7 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> {
let attrs = self.tcx.hir().attrs(item.hir_id()); let attrs = self.tcx.hir().attrs(item.hir_id());
self.dumper.dump_def( self.dumper.dump_def(
&access_from!(self.save_ctxt, item, item.def_id), &access_from!(self.save_ctxt, item.def_id),
Def { Def {
kind: DefKind::Type, kind: DefKind::Type,
id, id,
@ -1443,7 +1447,7 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> {
} }
fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) { fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) {
let access = access_from!(self.save_ctxt, item, item.def_id); let access = access_from!(self.save_ctxt, item.def_id);
match item.kind { match item.kind {
hir::ForeignItemKind::Fn(decl, _, ref generics) => { hir::ForeignItemKind::Fn(decl, _, ref generics) => {

View File

@ -78,7 +78,10 @@ impl LateLintPass<'_> for ExhaustiveItems {
if !attrs.iter().any(|a| a.has_name(sym::non_exhaustive)); if !attrs.iter().any(|a| a.has_name(sym::non_exhaustive));
then { then {
let (lint, msg) = if let ItemKind::Struct(ref v, ..) = item.kind { let (lint, msg) = if let ItemKind::Struct(ref v, ..) = item.kind {
if v.fields().iter().any(|f| !f.vis.node.is_pub()) { if v.fields().iter().any(|f| {
let def_id = cx.tcx.hir().local_def_id(f.hir_id);
!cx.tcx.visibility(def_id).is_public()
}) {
// skip structs with private fields // skip structs with private fields
return; return;
} }