mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Stop visiting visibility.
This commit is contained in:
parent
64c5deb0e3
commit
10d10efb21
@ -290,18 +290,6 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
|
||||
self.insert(lifetime.span, lifetime.hir_id, Node::Lifetime(lifetime));
|
||||
}
|
||||
|
||||
fn visit_vis(&mut self, visibility: &'hir Visibility<'hir>) {
|
||||
match visibility.node {
|
||||
VisibilityKind::Public | VisibilityKind::Crate(_) | VisibilityKind::Inherited => {}
|
||||
VisibilityKind::Restricted { hir_id, .. } => {
|
||||
self.insert(visibility.span, hir_id, Node::Visibility(visibility));
|
||||
self.with_parent(hir_id, |this| {
|
||||
intravisit::walk_vis(this, visibility);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, v: &'hir Variant<'hir>, g: &'hir Generics<'hir>, item_id: HirId) {
|
||||
self.insert(v.span, v.id, Node::Variant(v));
|
||||
self.with_parent(v.id, |this| {
|
||||
|
@ -3210,7 +3210,6 @@ pub enum Node<'hir> {
|
||||
|
||||
Lifetime(&'hir Lifetime),
|
||||
GenericParam(&'hir GenericParam<'hir>),
|
||||
Visibility(&'hir Visibility<'hir>),
|
||||
|
||||
Crate(&'hir Mod<'hir>),
|
||||
|
||||
@ -3253,7 +3252,6 @@ impl<'hir> Node<'hir> {
|
||||
| Node::Binding(..)
|
||||
| Node::Arm(..)
|
||||
| Node::Local(..)
|
||||
| Node::Visibility(..)
|
||||
| Node::Crate(..)
|
||||
| Node::Ty(..)
|
||||
| Node::TraitRef(..)
|
||||
@ -3318,18 +3316,18 @@ impl<'hir> Node<'hir> {
|
||||
match self {
|
||||
Node::Item(i) => match i.kind {
|
||||
ItemKind::Fn(ref sig, ref generics, _) => {
|
||||
Some(FnKind::ItemFn(i.ident, generics, sig.header, &i.vis))
|
||||
Some(FnKind::ItemFn(i.ident, generics, sig.header))
|
||||
}
|
||||
_ => None,
|
||||
},
|
||||
Node::TraitItem(ti) => match ti.kind {
|
||||
TraitItemKind::Fn(ref sig, TraitFn::Provided(_)) => {
|
||||
Some(FnKind::Method(ti.ident, sig, None))
|
||||
Some(FnKind::Method(ti.ident, sig))
|
||||
}
|
||||
_ => None,
|
||||
},
|
||||
Node::ImplItem(ii) => match ii.kind {
|
||||
ImplItemKind::Fn(ref sig, _) => Some(FnKind::Method(ii.ident, sig, Some(&ii.vis))),
|
||||
ImplItemKind::Fn(ref sig, _) => Some(FnKind::Method(ii.ident, sig)),
|
||||
_ => None,
|
||||
},
|
||||
Node::Expr(e) => match e.kind {
|
||||
|
@ -100,10 +100,10 @@ where
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum FnKind<'a> {
|
||||
/// `#[xxx] pub async/const/extern "Abi" fn foo()`
|
||||
ItemFn(Ident, &'a Generics<'a>, FnHeader, &'a Visibility<'a>),
|
||||
ItemFn(Ident, &'a Generics<'a>, FnHeader),
|
||||
|
||||
/// `fn foo(&self)`
|
||||
Method(Ident, &'a FnSig<'a>, Option<&'a Visibility<'a>>),
|
||||
Method(Ident, &'a FnSig<'a>),
|
||||
|
||||
/// `|x, y| {}`
|
||||
Closure,
|
||||
@ -112,8 +112,8 @@ pub enum FnKind<'a> {
|
||||
impl<'a> FnKind<'a> {
|
||||
pub fn header(&self) -> Option<&FnHeader> {
|
||||
match *self {
|
||||
FnKind::ItemFn(_, _, ref header, _) => Some(header),
|
||||
FnKind::Method(_, ref sig, _) => Some(&sig.header),
|
||||
FnKind::ItemFn(_, _, ref header) => Some(header),
|
||||
FnKind::Method(_, ref sig) => Some(&sig.header),
|
||||
FnKind::Closure => None,
|
||||
}
|
||||
}
|
||||
@ -475,9 +475,6 @@ pub trait Visitor<'v>: Sized {
|
||||
walk_assoc_type_binding(self, type_binding)
|
||||
}
|
||||
fn visit_attribute(&mut self, _id: HirId, _attr: &'v Attribute) {}
|
||||
fn visit_vis(&mut self, vis: &'v Visibility<'v>) {
|
||||
walk_vis(self, vis)
|
||||
}
|
||||
fn visit_associated_item_kind(&mut self, kind: &'v AssocItemKind) {
|
||||
walk_associated_item_kind(self, kind);
|
||||
}
|
||||
@ -554,7 +551,6 @@ pub fn walk_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Param<'v>) {
|
||||
}
|
||||
|
||||
pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
|
||||
visitor.visit_vis(&item.vis);
|
||||
visitor.visit_ident(item.ident);
|
||||
match item.kind {
|
||||
ItemKind::ExternCrate(orig_name) => {
|
||||
@ -572,7 +568,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
|
||||
visitor.visit_nested_body(body);
|
||||
}
|
||||
ItemKind::Fn(ref sig, ref generics, body_id) => visitor.visit_fn(
|
||||
FnKind::ItemFn(item.ident, generics, sig.header, &item.vis),
|
||||
FnKind::ItemFn(item.ident, generics, sig.header),
|
||||
&sig.decl,
|
||||
body_id,
|
||||
item.span,
|
||||
@ -859,7 +855,6 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat<'v>) {
|
||||
|
||||
pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItem<'v>) {
|
||||
visitor.visit_id(foreign_item.hir_id());
|
||||
visitor.visit_vis(&foreign_item.vis);
|
||||
visitor.visit_ident(foreign_item.ident);
|
||||
|
||||
match foreign_item.kind {
|
||||
@ -999,7 +994,7 @@ pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v Trai
|
||||
}
|
||||
TraitItemKind::Fn(ref sig, TraitFn::Provided(body_id)) => {
|
||||
visitor.visit_fn(
|
||||
FnKind::Method(trait_item.ident, sig, None),
|
||||
FnKind::Method(trait_item.ident, sig),
|
||||
&sig.decl,
|
||||
body_id,
|
||||
trait_item.span,
|
||||
@ -1025,10 +1020,9 @@ pub fn walk_trait_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, trait_item_ref:
|
||||
|
||||
pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplItem<'v>) {
|
||||
// N.B., deliberately force a compilation error if/when new fields are added.
|
||||
let ImplItem { def_id: _, ident, ref vis, ref generics, ref kind, span: _ } = *impl_item;
|
||||
let ImplItem { def_id: _, ident, ref generics, ref kind, span: _, vis: _ } = *impl_item;
|
||||
|
||||
visitor.visit_ident(ident);
|
||||
visitor.visit_vis(vis);
|
||||
visitor.visit_generics(generics);
|
||||
match *kind {
|
||||
ImplItemKind::Const(ref ty, body) => {
|
||||
@ -1038,7 +1032,7 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
|
||||
}
|
||||
ImplItemKind::Fn(ref sig, body_id) => {
|
||||
visitor.visit_fn(
|
||||
FnKind::Method(impl_item.ident, sig, Some(&impl_item.vis)),
|
||||
FnKind::Method(impl_item.ident, sig),
|
||||
&sig.decl,
|
||||
body_id,
|
||||
impl_item.span,
|
||||
@ -1082,7 +1076,6 @@ pub fn walk_struct_def<'v, V: Visitor<'v>>(
|
||||
|
||||
pub fn walk_field_def<'v, V: Visitor<'v>>(visitor: &mut V, field: &'v FieldDef<'v>) {
|
||||
visitor.visit_id(field.hir_id);
|
||||
visitor.visit_vis(&field.vis);
|
||||
visitor.visit_ident(field.ident);
|
||||
visitor.visit_ty(&field.ty);
|
||||
}
|
||||
@ -1250,13 +1243,6 @@ pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm<'v>) {
|
||||
visitor.visit_expr(&arm.body);
|
||||
}
|
||||
|
||||
pub fn walk_vis<'v, V: Visitor<'v>>(visitor: &mut V, vis: &'v Visibility<'v>) {
|
||||
if let VisibilityKind::Restricted { ref path, hir_id } = vis.node {
|
||||
visitor.visit_id(hir_id);
|
||||
visitor.visit_path(path, hir_id)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn walk_associated_item_kind<'v, V: Visitor<'v>>(_: &mut V, _: &'v AssocItemKind) {
|
||||
// No visitable content here: this fn exists so you can call it if
|
||||
// the right thing to do, should content be added in the future,
|
||||
|
@ -98,7 +98,6 @@ impl<'a> State<'a> {
|
||||
self.print_block(&a)
|
||||
}
|
||||
Node::Lifetime(a) => self.print_lifetime(&a),
|
||||
Node::Visibility(a) => self.print_visibility(&a),
|
||||
Node::GenericParam(_) => panic!("cannot print Node::GenericParam"),
|
||||
Node::Field(_) => panic!("cannot print Node::Field"),
|
||||
// These cases do not carry enough information in the
|
||||
|
@ -406,7 +406,7 @@ impl<'tcx> LateLintPass<'tcx> for NonSnakeCase {
|
||||
}
|
||||
_ => (),
|
||||
},
|
||||
FnKind::ItemFn(ident, _, header, _) => {
|
||||
FnKind::ItemFn(ident, _, header) => {
|
||||
// Skip foreign-ABI #[no_mangle] functions (Issue #31924)
|
||||
if header.abi != Abi::Rust && cx.sess().contains_name(attrs, sym::no_mangle) {
|
||||
return;
|
||||
|
@ -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,
|
||||
};
|
||||
@ -1232,7 +1225,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),
|
||||
}
|
||||
|
@ -295,28 +295,6 @@ fn min(vis1: ty::Visibility, vis2: ty::Visibility, tcx: TyCtxt<'_>) -> ty::Visib
|
||||
if vis1.is_at_least(vis2, tcx) { vis2 } else { vis1 }
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Visitor used to determine if pub(restricted) is used anywhere in the crate.
|
||||
///
|
||||
/// This is done so that `private_in_public` warnings can be turned into hard errors
|
||||
/// in crates that have been updated to use pub(restricted).
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
struct PubRestrictedVisitor<'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
has_pub_restricted: bool,
|
||||
}
|
||||
|
||||
impl<'tcx> Visitor<'tcx> for PubRestrictedVisitor<'tcx> {
|
||||
type NestedFilter = nested_filter::All;
|
||||
|
||||
fn nested_visit_map(&mut self) -> Self::Map {
|
||||
self.tcx.hir()
|
||||
}
|
||||
fn visit_vis(&mut self, vis: &'tcx hir::Visibility<'tcx>) {
|
||||
self.has_pub_restricted = self.has_pub_restricted || vis.node.is_pub_restricted();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// Visitor used to determine impl visibility and reachability.
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
@ -2083,11 +2061,12 @@ fn check_private_in_public(tcx: TyCtxt<'_>, (): ()) {
|
||||
};
|
||||
tcx.hir().walk_toplevel_module(&mut visitor);
|
||||
|
||||
let has_pub_restricted = {
|
||||
let mut pub_restricted_visitor = PubRestrictedVisitor { tcx, has_pub_restricted: false };
|
||||
tcx.hir().walk_toplevel_module(&mut pub_restricted_visitor);
|
||||
pub_restricted_visitor.has_pub_restricted
|
||||
};
|
||||
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();
|
||||
for mut id in visitor.old_error_set.iter().copied() {
|
||||
|
@ -685,8 +685,8 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
|
||||
hir_id: hir::HirId,
|
||||
) {
|
||||
let name = match fk {
|
||||
intravisit::FnKind::ItemFn(id, _, _, _) => id.name,
|
||||
intravisit::FnKind::Method(id, _, _) => id.name,
|
||||
intravisit::FnKind::ItemFn(id, _, _) => id.name,
|
||||
intravisit::FnKind::Method(id, _) => id.name,
|
||||
intravisit::FnKind::Closure => sym::closure,
|
||||
};
|
||||
let name = name.as_str();
|
||||
|
@ -27,7 +27,6 @@ use rustc_middle::{bug, span_bug};
|
||||
use rustc_session::config::{CrateType, Input, OutputType};
|
||||
use rustc_session::cstore::ExternCrate;
|
||||
use rustc_session::output::{filename_for_metadata, out_filename};
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::*;
|
||||
|
||||
@ -595,11 +594,6 @@ impl<'tcx> SaveContext<'tcx> {
|
||||
Node::TraitRef(tr) => tr.path.res,
|
||||
|
||||
Node::Item(&hir::Item { kind: hir::ItemKind::Use(path, _), .. }) => path.res,
|
||||
Node::Visibility(&Spanned {
|
||||
node: hir::VisibilityKind::Restricted { ref path, .. },
|
||||
..
|
||||
}) => path.res,
|
||||
|
||||
Node::PathSegment(seg) => match seg.res {
|
||||
Some(res) if res != Res::Err => res,
|
||||
_ => {
|
||||
|
@ -257,7 +257,6 @@ impl<'a, 'tcx> DropRangeVisitor<'a, 'tcx> {
|
||||
| hir::Node::Ctor(..)
|
||||
| hir::Node::Lifetime(..)
|
||||
| hir::Node::GenericParam(..)
|
||||
| hir::Node::Visibility(..)
|
||||
| hir::Node::Crate(..)
|
||||
| hir::Node::Infer(..) => bug!("Unsupported branch target: {:?}", node),
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ impl CognitiveComplexity {
|
||||
|
||||
if rust_cc > self.limit.limit() {
|
||||
let fn_span = match kind {
|
||||
FnKind::ItemFn(ident, _, _, _) | FnKind::Method(ident, _, _) => ident.span,
|
||||
FnKind::ItemFn(ident, _, _) | FnKind::Method(ident, _) => ident.span,
|
||||
FnKind::Closure => {
|
||||
let header_span = body_span.with_hi(decl.output.span().lo());
|
||||
let pos = snippet_opt(cx, header_span).and_then(|snip| {
|
||||
|
@ -17,8 +17,8 @@ pub(super) fn check_fn<'tcx>(
|
||||
hir_id: hir::HirId,
|
||||
) {
|
||||
let unsafety = match kind {
|
||||
intravisit::FnKind::ItemFn(_, _, hir::FnHeader { unsafety, .. }, _) => unsafety,
|
||||
intravisit::FnKind::Method(_, sig, _) => sig.header.unsafety,
|
||||
intravisit::FnKind::ItemFn(_, _, hir::FnHeader { unsafety, .. }) => unsafety,
|
||||
intravisit::FnKind::Method(_, sig) => sig.header.unsafety,
|
||||
intravisit::FnKind::Closure => return,
|
||||
};
|
||||
|
||||
|
@ -26,9 +26,8 @@ pub(super) fn check_fn(
|
||||
header: hir::FnHeader { abi: Abi::Rust, .. },
|
||||
..
|
||||
},
|
||||
_,
|
||||
)
|
||||
| intravisit::FnKind::ItemFn(_, _, hir::FnHeader { abi: Abi::Rust, .. }, _) => check_arg_number(
|
||||
| intravisit::FnKind::ItemFn(_, _, hir::FnHeader { abi: Abi::Rust, .. }) => check_arg_number(
|
||||
cx,
|
||||
decl,
|
||||
span.with_hi(decl.output.span().hi()),
|
||||
|
@ -85,7 +85,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
|
||||
}
|
||||
|
||||
match kind {
|
||||
FnKind::ItemFn(.., header, _) => {
|
||||
FnKind::ItemFn(.., header) => {
|
||||
let attrs = cx.tcx.hir().attrs(hir_id);
|
||||
if header.abi != Abi::Rust || requires_exact_signature(attrs) {
|
||||
return;
|
||||
|
@ -251,7 +251,7 @@ impl<'tcx> LateLintPass<'tcx> for PassByRefOrValue {
|
||||
}
|
||||
|
||||
match kind {
|
||||
FnKind::ItemFn(.., header, _) => {
|
||||
FnKind::ItemFn(.., header) => {
|
||||
if header.abi != Abi::Rust {
|
||||
return;
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ impl<'tcx> LateLintPass<'tcx> for ReturnSelfNotMustUse {
|
||||
) {
|
||||
if_chain! {
|
||||
// We are only interested in methods, not in functions or associated functions.
|
||||
if matches!(kind, FnKind::Method(_, _, _));
|
||||
if matches!(kind, FnKind::Method(_, _));
|
||||
if let Some(fn_def) = cx.tcx.hir().opt_local_def_id(hir_id);
|
||||
if let Some(impl_def) = cx.tcx.impl_of_method(fn_def.to_def_id());
|
||||
// We don't want this method to be te implementation of a trait because the
|
||||
|
@ -67,7 +67,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedAsync {
|
||||
span: Span,
|
||||
hir_id: HirId,
|
||||
) {
|
||||
if let FnKind::ItemFn(_, _, FnHeader { asyncness, .. }, _) = &fn_kind {
|
||||
if let FnKind::ItemFn(_, _, FnHeader { asyncness, .. }) = &fn_kind {
|
||||
if matches!(asyncness, IsAsync::Async) {
|
||||
let mut visitor = AsyncFnVisitor { cx, found_await: false };
|
||||
walk_fn(&mut visitor, fn_kind, fn_decl, body.id(), span, hir_id);
|
||||
|
@ -1690,7 +1690,7 @@ pub fn if_sequence<'tcx>(mut expr: &'tcx Expr<'tcx>) -> (Vec<&'tcx Expr<'tcx>>,
|
||||
|
||||
/// Checks if the given function kind is an async function.
|
||||
pub fn is_async_fn(kind: FnKind<'_>) -> bool {
|
||||
matches!(kind, FnKind::ItemFn(_, _, header, _) if header.asyncness == IsAsync::Async)
|
||||
matches!(kind, FnKind::ItemFn(_, _, header) if header.asyncness == IsAsync::Async)
|
||||
}
|
||||
|
||||
/// Peels away all the compiler generated code surrounding the body of an async function,
|
||||
|
Loading…
Reference in New Issue
Block a user