Modifies how Arg, Arm, Field, FieldPattern and Variant are visited
Part of the necessary work to accomplish #63468.
This commit is contained in:
parent
478464570e
commit
6a3d517314
11 changed files with 147 additions and 145 deletions
|
|
@ -154,7 +154,7 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
|
|||
});
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, v: &'a Variant, g: &'a Generics, item_id: NodeId) {
|
||||
fn visit_variant(&mut self, v: &'a Variant) {
|
||||
let def = self.create_def(v.id,
|
||||
DefPathData::TypeNs(v.ident.as_interned_str()),
|
||||
v.span);
|
||||
|
|
@ -162,12 +162,11 @@ impl<'a> visit::Visitor<'a> for DefCollector<'a> {
|
|||
if let Some(ctor_hir_id) = v.data.ctor_id() {
|
||||
this.create_def(ctor_hir_id, DefPathData::Ctor, v.span);
|
||||
}
|
||||
visit::walk_variant(this, v, g, item_id)
|
||||
visit::walk_variant(this, v)
|
||||
});
|
||||
}
|
||||
|
||||
fn visit_variant_data(&mut self, data: &'a VariantData, _: Ident,
|
||||
_: &'a Generics, _: NodeId, _: Span) {
|
||||
fn visit_variant_data(&mut self, data: &'a VariantData) {
|
||||
for (index, field) in data.fields().iter().enumerate() {
|
||||
let name = field.ident.map(|ident| ident.name)
|
||||
.unwrap_or_else(|| sym::integer(index));
|
||||
|
|
|
|||
|
|
@ -1040,13 +1040,13 @@ for LateContextAndPass<'a, 'tcx, T> {
|
|||
|
||||
fn visit_variant_data(&mut self,
|
||||
s: &'tcx hir::VariantData,
|
||||
name: ast::Name,
|
||||
g: &'tcx hir::Generics,
|
||||
item_id: hir::HirId,
|
||||
_: ast::Name,
|
||||
_: &'tcx hir::Generics,
|
||||
_: hir::HirId,
|
||||
_: Span) {
|
||||
lint_callback!(self, check_struct_def, s, name, g, item_id);
|
||||
lint_callback!(self, check_struct_def, s);
|
||||
hir_visit::walk_struct_def(self, s);
|
||||
lint_callback!(self, check_struct_def_post, s, name, g, item_id);
|
||||
lint_callback!(self, check_struct_def_post, s);
|
||||
}
|
||||
|
||||
fn visit_struct_field(&mut self, s: &'tcx hir::StructField) {
|
||||
|
|
@ -1061,9 +1061,9 @@ for LateContextAndPass<'a, 'tcx, T> {
|
|||
g: &'tcx hir::Generics,
|
||||
item_id: hir::HirId) {
|
||||
self.with_lint_attrs(v.id, &v.attrs, |cx| {
|
||||
lint_callback!(cx, check_variant, v, g);
|
||||
lint_callback!(cx, check_variant, v);
|
||||
hir_visit::walk_variant(cx, v, g, item_id);
|
||||
lint_callback!(cx, check_variant_post, v, g);
|
||||
lint_callback!(cx, check_variant_post, v);
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -1214,18 +1214,13 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
|
|||
run_early_pass!(self, check_fn_post, fk, decl, span, id);
|
||||
}
|
||||
|
||||
fn visit_variant_data(&mut self,
|
||||
s: &'a ast::VariantData,
|
||||
ident: ast::Ident,
|
||||
g: &'a ast::Generics,
|
||||
item_id: ast::NodeId,
|
||||
_: Span) {
|
||||
run_early_pass!(self, check_struct_def, s, ident, g, item_id);
|
||||
fn visit_variant_data(&mut self, s: &'a ast::VariantData) {
|
||||
run_early_pass!(self, check_struct_def, s);
|
||||
if let Some(ctor_hir_id) = s.ctor_id() {
|
||||
self.check_id(ctor_hir_id);
|
||||
}
|
||||
ast_visit::walk_struct_def(self, s);
|
||||
run_early_pass!(self, check_struct_def_post, s, ident, g, item_id);
|
||||
run_early_pass!(self, check_struct_def_post, s);
|
||||
}
|
||||
|
||||
fn visit_struct_field(&mut self, s: &'a ast::StructField) {
|
||||
|
|
@ -1235,11 +1230,11 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T>
|
|||
})
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, v: &'a ast::Variant, g: &'a ast::Generics, item_id: ast::NodeId) {
|
||||
self.with_lint_attrs(item_id, &v.attrs, |cx| {
|
||||
run_early_pass!(cx, check_variant, v, g);
|
||||
ast_visit::walk_variant(cx, v, g, item_id);
|
||||
run_early_pass!(cx, check_variant_post, v, g);
|
||||
fn visit_variant(&mut self, v: &'a ast::Variant) {
|
||||
self.with_lint_attrs(v.id, &v.attrs, |cx| {
|
||||
run_early_pass!(cx, check_variant, v);
|
||||
ast_visit::walk_variant(cx, v);
|
||||
run_early_pass!(cx, check_variant_post, v);
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -248,21 +248,11 @@ macro_rules! late_lint_methods {
|
|||
fn check_trait_item_post(a: &$hir hir::TraitItem);
|
||||
fn check_impl_item(a: &$hir hir::ImplItem);
|
||||
fn check_impl_item_post(a: &$hir hir::ImplItem);
|
||||
fn check_struct_def(
|
||||
a: &$hir hir::VariantData,
|
||||
b: ast::Name,
|
||||
c: &$hir hir::Generics,
|
||||
d: hir::HirId
|
||||
);
|
||||
fn check_struct_def_post(
|
||||
a: &$hir hir::VariantData,
|
||||
b: ast::Name,
|
||||
c: &$hir hir::Generics,
|
||||
d: hir::HirId
|
||||
);
|
||||
fn check_struct_def(a: &$hir hir::VariantData);
|
||||
fn check_struct_def_post(a: &$hir hir::VariantData);
|
||||
fn check_struct_field(a: &$hir hir::StructField);
|
||||
fn check_variant(a: &$hir hir::Variant, b: &$hir hir::Generics);
|
||||
fn check_variant_post(a: &$hir hir::Variant, b: &$hir hir::Generics);
|
||||
fn check_variant(a: &$hir hir::Variant);
|
||||
fn check_variant_post(a: &$hir hir::Variant);
|
||||
fn check_lifetime(a: &$hir hir::Lifetime);
|
||||
fn check_path(a: &$hir hir::Path, b: hir::HirId);
|
||||
fn check_attribute(a: &$hir ast::Attribute);
|
||||
|
|
@ -395,21 +385,11 @@ macro_rules! early_lint_methods {
|
|||
fn check_trait_item_post(a: &ast::TraitItem);
|
||||
fn check_impl_item(a: &ast::ImplItem);
|
||||
fn check_impl_item_post(a: &ast::ImplItem);
|
||||
fn check_struct_def(
|
||||
a: &ast::VariantData,
|
||||
b: ast::Ident,
|
||||
c: &ast::Generics,
|
||||
d: ast::NodeId
|
||||
);
|
||||
fn check_struct_def_post(
|
||||
a: &ast::VariantData,
|
||||
b: ast::Ident,
|
||||
c: &ast::Generics,
|
||||
d: ast::NodeId
|
||||
);
|
||||
fn check_struct_def(a: &ast::VariantData);
|
||||
fn check_struct_def_post(a: &ast::VariantData);
|
||||
fn check_struct_field(a: &ast::StructField);
|
||||
fn check_variant(a: &ast::Variant, b: &ast::Generics);
|
||||
fn check_variant_post(a: &ast::Variant, b: &ast::Generics);
|
||||
fn check_variant(a: &ast::Variant);
|
||||
fn check_variant_post(a: &ast::Variant);
|
||||
fn check_lifetime(a: &ast::Lifetime);
|
||||
fn check_path(a: &ast::Path, b: ast::NodeId);
|
||||
fn check_attribute(a: &ast::Attribute);
|
||||
|
|
|
|||
|
|
@ -482,7 +482,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for MissingDoc {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_variant(&mut self, cx: &LateContext<'_, '_>, v: &hir::Variant, _: &hir::Generics) {
|
||||
fn check_variant(&mut self, cx: &LateContext<'_, '_>, v: &hir::Variant) {
|
||||
self.check_missing_docs_attrs(cx,
|
||||
Some(v.id),
|
||||
&v.attrs,
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ impl EarlyLintPass for NonCamelCaseTypes {
|
|||
}
|
||||
}
|
||||
|
||||
fn check_variant(&mut self, cx: &EarlyContext<'_>, v: &ast::Variant, _: &ast::Generics) {
|
||||
fn check_variant(&mut self, cx: &EarlyContext<'_>, v: &ast::Variant) {
|
||||
self.check_case(cx, "variant", &v.ident);
|
||||
}
|
||||
|
||||
|
|
@ -350,9 +350,6 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for NonSnakeCase {
|
|||
&mut self,
|
||||
cx: &LateContext<'_, '_>,
|
||||
s: &hir::VariantData,
|
||||
_: ast::Name,
|
||||
_: &hir::Generics,
|
||||
_: hir::HirId,
|
||||
) {
|
||||
for sf in s.fields() {
|
||||
self.check_snake_case(cx, "structure field", &sf.ident);
|
||||
|
|
|
|||
|
|
@ -813,8 +813,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||
visit::walk_poly_trait_ref(self, t, m);
|
||||
}
|
||||
|
||||
fn visit_variant_data(&mut self, s: &'a VariantData, _: Ident,
|
||||
_: &'a Generics, _: NodeId, _: Span) {
|
||||
fn visit_variant_data(&mut self, s: &'a VariantData) {
|
||||
self.with_banned_assoc_ty_bound(|this| visit::walk_struct_def(this, s))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -334,12 +334,9 @@ impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> {
|
|||
ast_visit::walk_struct_field(self, s)
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self,
|
||||
v: &'v ast::Variant,
|
||||
g: &'v ast::Generics,
|
||||
item_id: NodeId) {
|
||||
fn visit_variant(&mut self, v: &'v ast::Variant) {
|
||||
self.record("Variant", Id::None, v);
|
||||
ast_visit::walk_variant(self, v, g, item_id)
|
||||
ast_visit::walk_variant(self, v)
|
||||
}
|
||||
|
||||
fn visit_lifetime(&mut self, lifetime: &'v ast::Lifetime) {
|
||||
|
|
|
|||
|
|
@ -1210,9 +1210,13 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> {
|
|||
}
|
||||
}
|
||||
|
||||
fn visit_generic_params(&mut self, params: &mut Vec<ast::GenericParam>) {
|
||||
self.cfg.configure_generic_params(params);
|
||||
noop_visit_generic_params(params, self);
|
||||
fn flat_map_generic_param(
|
||||
&mut self,
|
||||
param: ast::GenericParam
|
||||
) -> SmallVec<[ast::GenericParam; 1]>
|
||||
{
|
||||
let param = configure!(self, param);
|
||||
noop_flat_map_generic_param(param, self)
|
||||
}
|
||||
|
||||
fn visit_attribute(&mut self, at: &mut ast::Attribute) {
|
||||
|
|
|
|||
|
|
@ -98,8 +98,8 @@ pub trait MutVisitor: Sized {
|
|||
noop_visit_fn_header(header, self);
|
||||
}
|
||||
|
||||
fn visit_struct_field(&mut self, sf: &mut StructField) {
|
||||
noop_visit_struct_field(sf, self);
|
||||
fn flat_map_struct_field(&mut self, sf: StructField) -> SmallVec<[StructField; 1]> {
|
||||
noop_flat_map_struct_field(sf, self)
|
||||
}
|
||||
|
||||
fn visit_item_kind(&mut self, i: &mut ItemKind) {
|
||||
|
|
@ -130,8 +130,8 @@ pub trait MutVisitor: Sized {
|
|||
noop_flat_map_stmt(s, self)
|
||||
}
|
||||
|
||||
fn visit_arm(&mut self, a: &mut Arm) {
|
||||
noop_visit_arm(a, self);
|
||||
fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> {
|
||||
noop_flat_map_arm(arm, self)
|
||||
}
|
||||
|
||||
fn visit_pat(&mut self, p: &mut P<Pat>) {
|
||||
|
|
@ -174,8 +174,8 @@ pub trait MutVisitor: Sized {
|
|||
noop_visit_foreign_mod(nm, self);
|
||||
}
|
||||
|
||||
fn visit_variant(&mut self, v: &mut Variant) {
|
||||
noop_visit_variant(v, self);
|
||||
fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
|
||||
noop_flat_map_variant(v, self)
|
||||
}
|
||||
|
||||
fn visit_ident(&mut self, i: &mut Ident) {
|
||||
|
|
@ -225,8 +225,8 @@ pub trait MutVisitor: Sized {
|
|||
noop_visit_attribute(at, self);
|
||||
}
|
||||
|
||||
fn visit_arg(&mut self, a: &mut Arg) {
|
||||
noop_visit_arg(a, self);
|
||||
fn flat_map_arg(&mut self, arg: Arg) -> SmallVec<[Arg; 1]> {
|
||||
noop_flat_map_arg(arg, self)
|
||||
}
|
||||
|
||||
fn visit_generics(&mut self, generics: &mut Generics) {
|
||||
|
|
@ -245,12 +245,8 @@ pub trait MutVisitor: Sized {
|
|||
noop_visit_variant_data(vdata, self);
|
||||
}
|
||||
|
||||
fn visit_generic_param(&mut self, param: &mut GenericParam) {
|
||||
noop_visit_generic_param(param, self);
|
||||
}
|
||||
|
||||
fn visit_generic_params(&mut self, params: &mut Vec<GenericParam>) {
|
||||
noop_visit_generic_params(params, self);
|
||||
fn flat_map_generic_param(&mut self, param: GenericParam) -> SmallVec<[GenericParam; 1]> {
|
||||
noop_flat_map_generic_param(param, self)
|
||||
}
|
||||
|
||||
fn visit_tt(&mut self, tt: &mut TokenTree) {
|
||||
|
|
@ -277,8 +273,8 @@ pub trait MutVisitor: Sized {
|
|||
noop_visit_mt(mt, self);
|
||||
}
|
||||
|
||||
fn visit_field(&mut self, field: &mut Field) {
|
||||
noop_visit_field(field, self);
|
||||
fn flat_map_field(&mut self, f: Field) -> SmallVec<[Field; 1]> {
|
||||
noop_flat_map_field(f, self)
|
||||
}
|
||||
|
||||
fn visit_where_clause(&mut self, where_clause: &mut WhereClause) {
|
||||
|
|
@ -300,6 +296,10 @@ pub trait MutVisitor: Sized {
|
|||
fn visit_span(&mut self, _sp: &mut Span) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
fn flat_map_field_pattern(&mut self, fp: FieldPat) -> SmallVec<[FieldPat; 1]> {
|
||||
noop_flat_map_field_pattern(fp, self)
|
||||
}
|
||||
}
|
||||
|
||||
/// Use a map-style function (`FnOnce(T) -> T`) to overwrite a `&mut T`. Useful
|
||||
|
|
@ -362,6 +362,26 @@ pub fn visit_method_sig<T: MutVisitor>(MethodSig { header, decl }: &mut MethodSi
|
|||
vis.visit_fn_decl(decl);
|
||||
}
|
||||
|
||||
pub fn noop_flat_map_field_pattern<T: MutVisitor>(
|
||||
mut fp: FieldPat,
|
||||
vis: &mut T,
|
||||
) -> SmallVec<[FieldPat; 1]> {
|
||||
let FieldPat {
|
||||
attrs,
|
||||
id,
|
||||
ident,
|
||||
is_shorthand: _,
|
||||
pat,
|
||||
span,
|
||||
} = &mut fp;
|
||||
vis.visit_id(id);
|
||||
vis.visit_ident(ident);
|
||||
vis.visit_pat(pat);
|
||||
vis.visit_span(span);
|
||||
visit_thin_attrs(attrs, vis);
|
||||
smallvec![fp]
|
||||
}
|
||||
|
||||
pub fn noop_visit_use_tree<T: MutVisitor>(use_tree: &mut UseTree, vis: &mut T) {
|
||||
let UseTree { prefix, kind, span } = use_tree;
|
||||
vis.visit_path(prefix);
|
||||
|
|
@ -382,16 +402,18 @@ pub fn noop_visit_use_tree<T: MutVisitor>(use_tree: &mut UseTree, vis: &mut T) {
|
|||
vis.visit_span(span);
|
||||
}
|
||||
|
||||
pub fn noop_visit_arm<T: MutVisitor>(
|
||||
Arm { attrs, pats, guard, body, span, id }: &mut Arm,
|
||||
pub fn noop_flat_map_arm<T: MutVisitor>(
|
||||
mut arm: Arm,
|
||||
vis: &mut T,
|
||||
) {
|
||||
) -> SmallVec<[Arm; 1]> {
|
||||
let Arm { attrs, pats, guard, body, span, id } = &mut arm;
|
||||
visit_attrs(attrs, vis);
|
||||
vis.visit_id(id);
|
||||
visit_vec(pats, |pat| vis.visit_pat(pat));
|
||||
visit_opt(guard, |guard| vis.visit_expr(guard));
|
||||
vis.visit_expr(body);
|
||||
vis.visit_span(span);
|
||||
smallvec![arm]
|
||||
}
|
||||
|
||||
pub fn noop_visit_ty_constraint<T: MutVisitor>(
|
||||
|
|
@ -425,7 +447,7 @@ pub fn noop_visit_ty<T: MutVisitor>(ty: &mut P<Ty>, vis: &mut T) {
|
|||
}
|
||||
TyKind::BareFn(bft) => {
|
||||
let BareFnTy { unsafety: _, abi: _, generic_params, decl } = bft.deref_mut();
|
||||
vis.visit_generic_params(generic_params);
|
||||
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
|
||||
vis.visit_fn_decl(decl);
|
||||
}
|
||||
TyKind::Tup(tys) => visit_vec(tys, |ty| vis.visit_ty(ty)),
|
||||
|
|
@ -455,14 +477,17 @@ pub fn noop_visit_foreign_mod<T: MutVisitor>(foreign_mod: &mut ForeignMod, vis:
|
|||
items.flat_map_in_place(|item| vis.flat_map_foreign_item(item));
|
||||
}
|
||||
|
||||
pub fn noop_visit_variant<T: MutVisitor>(variant: &mut Variant, vis: &mut T) {
|
||||
let Variant { ident, attrs, id, data, disr_expr, span } = variant;
|
||||
pub fn noop_flat_map_variant<T: MutVisitor>(mut variant: Variant, vis: &mut T)
|
||||
-> SmallVec<[Variant; 1]>
|
||||
{
|
||||
let Variant { ident, attrs, id, data, disr_expr, span } = &mut variant;
|
||||
vis.visit_ident(ident);
|
||||
visit_attrs(attrs, vis);
|
||||
vis.visit_id(id);
|
||||
vis.visit_variant_data(data);
|
||||
visit_opt(disr_expr, |disr_expr| vis.visit_anon_const(disr_expr));
|
||||
vis.visit_span(span);
|
||||
smallvec![variant]
|
||||
}
|
||||
|
||||
pub fn noop_visit_ident<T: MutVisitor>(Ident { name: _, span }: &mut Ident, vis: &mut T) {
|
||||
|
|
@ -562,12 +587,14 @@ pub fn noop_visit_meta_item<T: MutVisitor>(mi: &mut MetaItem, vis: &mut T) {
|
|||
vis.visit_span(span);
|
||||
}
|
||||
|
||||
pub fn noop_visit_arg<T: MutVisitor>(Arg { attrs, id, pat, span, ty }: &mut Arg, vis: &mut T) {
|
||||
pub fn noop_flat_map_arg<T: MutVisitor>(mut arg: Arg, vis: &mut T) -> SmallVec<[Arg; 1]> {
|
||||
let Arg { attrs, id, pat, span, ty } = &mut arg;
|
||||
vis.visit_id(id);
|
||||
visit_thin_attrs(attrs, vis);
|
||||
vis.visit_pat(pat);
|
||||
vis.visit_span(span);
|
||||
vis.visit_ty(ty);
|
||||
smallvec![arg]
|
||||
}
|
||||
|
||||
pub fn noop_visit_tt<T: MutVisitor>(tt: &mut TokenTree, vis: &mut T) {
|
||||
|
|
@ -693,7 +720,7 @@ pub fn noop_visit_asyncness<T: MutVisitor>(asyncness: &mut IsAsync, vis: &mut T)
|
|||
|
||||
pub fn noop_visit_fn_decl<T: MutVisitor>(decl: &mut P<FnDecl>, vis: &mut T) {
|
||||
let FnDecl { inputs, output, c_variadic: _ } = decl.deref_mut();
|
||||
visit_vec(inputs, |input| vis.visit_arg(input));
|
||||
inputs.flat_map_in_place(|arg| vis.flat_map_arg(arg));
|
||||
match output {
|
||||
FunctionRetTy::Default(span) => vis.visit_span(span),
|
||||
FunctionRetTy::Ty(ty) => vis.visit_ty(ty),
|
||||
|
|
@ -707,8 +734,12 @@ pub fn noop_visit_param_bound<T: MutVisitor>(pb: &mut GenericBound, vis: &mut T)
|
|||
}
|
||||
}
|
||||
|
||||
pub fn noop_visit_generic_param<T: MutVisitor>(param: &mut GenericParam, vis: &mut T) {
|
||||
let GenericParam { id, ident, attrs, bounds, kind } = param;
|
||||
pub fn noop_flat_map_generic_param<T: MutVisitor>(
|
||||
mut param: GenericParam,
|
||||
vis: &mut T
|
||||
) -> SmallVec<[GenericParam; 1]>
|
||||
{
|
||||
let GenericParam { id, ident, attrs, bounds, kind } = &mut param;
|
||||
vis.visit_id(id);
|
||||
vis.visit_ident(ident);
|
||||
visit_thin_attrs(attrs, vis);
|
||||
|
|
@ -722,10 +753,7 @@ pub fn noop_visit_generic_param<T: MutVisitor>(param: &mut GenericParam, vis: &m
|
|||
vis.visit_ty(ty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn noop_visit_generic_params<T: MutVisitor>(params: &mut Vec<GenericParam>, vis: &mut T){
|
||||
visit_vec(params, |param| vis.visit_generic_param(param));
|
||||
smallvec![param]
|
||||
}
|
||||
|
||||
pub fn noop_visit_label<T: MutVisitor>(Label { ident }: &mut Label, vis: &mut T) {
|
||||
|
|
@ -739,7 +767,7 @@ fn noop_visit_lifetime<T: MutVisitor>(Lifetime { id, ident }: &mut Lifetime, vis
|
|||
|
||||
pub fn noop_visit_generics<T: MutVisitor>(generics: &mut Generics, vis: &mut T) {
|
||||
let Generics { params, where_clause, span } = generics;
|
||||
vis.visit_generic_params(params);
|
||||
params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
|
||||
vis.visit_where_clause(where_clause);
|
||||
vis.visit_span(span);
|
||||
}
|
||||
|
|
@ -755,7 +783,7 @@ pub fn noop_visit_where_predicate<T: MutVisitor>(pred: &mut WherePredicate, vis:
|
|||
WherePredicate::BoundPredicate(bp) => {
|
||||
let WhereBoundPredicate { span, bound_generic_params, bounded_ty, bounds } = bp;
|
||||
vis.visit_span(span);
|
||||
vis.visit_generic_params(bound_generic_params);
|
||||
bound_generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
|
||||
vis.visit_ty(bounded_ty);
|
||||
visit_vec(bounds, |bound| vis.visit_param_bound(bound));
|
||||
}
|
||||
|
|
@ -777,9 +805,11 @@ pub fn noop_visit_where_predicate<T: MutVisitor>(pred: &mut WherePredicate, vis:
|
|||
|
||||
pub fn noop_visit_variant_data<T: MutVisitor>(vdata: &mut VariantData, vis: &mut T) {
|
||||
match vdata {
|
||||
VariantData::Struct(fields, ..) => visit_vec(fields, |field| vis.visit_struct_field(field)),
|
||||
VariantData::Struct(fields, ..) => {
|
||||
fields.flat_map_in_place(|field| vis.flat_map_struct_field(field));
|
||||
},
|
||||
VariantData::Tuple(fields, id) => {
|
||||
visit_vec(fields, |field| vis.visit_struct_field(field));
|
||||
fields.flat_map_in_place(|field| vis.flat_map_struct_field(field));
|
||||
vis.visit_id(id);
|
||||
},
|
||||
VariantData::Unit(id) => vis.visit_id(id),
|
||||
|
|
@ -793,28 +823,32 @@ pub fn noop_visit_trait_ref<T: MutVisitor>(TraitRef { path, ref_id }: &mut Trait
|
|||
|
||||
pub fn noop_visit_poly_trait_ref<T: MutVisitor>(p: &mut PolyTraitRef, vis: &mut T) {
|
||||
let PolyTraitRef { bound_generic_params, trait_ref, span } = p;
|
||||
vis.visit_generic_params(bound_generic_params);
|
||||
bound_generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
|
||||
vis.visit_trait_ref(trait_ref);
|
||||
vis.visit_span(span);
|
||||
}
|
||||
|
||||
pub fn noop_visit_struct_field<T: MutVisitor>(f: &mut StructField, visitor: &mut T) {
|
||||
let StructField { span, ident, vis, id, ty, attrs } = f;
|
||||
pub fn noop_flat_map_struct_field<T: MutVisitor>(mut sf: StructField, visitor: &mut T)
|
||||
-> SmallVec<[StructField; 1]>
|
||||
{
|
||||
let StructField { span, ident, vis, id, ty, attrs } = &mut sf;
|
||||
visitor.visit_span(span);
|
||||
visit_opt(ident, |ident| visitor.visit_ident(ident));
|
||||
visitor.visit_vis(vis);
|
||||
visitor.visit_id(id);
|
||||
visitor.visit_ty(ty);
|
||||
visit_attrs(attrs, visitor);
|
||||
smallvec![sf]
|
||||
}
|
||||
|
||||
pub fn noop_visit_field<T: MutVisitor>(f: &mut Field, vis: &mut T) {
|
||||
let Field { ident, expr, span, is_shorthand: _, attrs, id } = f;
|
||||
pub fn noop_flat_map_field<T: MutVisitor>(mut f: Field, vis: &mut T) -> SmallVec<[Field; 1]> {
|
||||
let Field { ident, expr, span, is_shorthand: _, attrs, id } = &mut f;
|
||||
vis.visit_ident(ident);
|
||||
vis.visit_expr(expr);
|
||||
vis.visit_id(id);
|
||||
vis.visit_span(span);
|
||||
visit_thin_attrs(attrs, vis);
|
||||
smallvec![f]
|
||||
}
|
||||
|
||||
pub fn noop_visit_mt<T: MutVisitor>(MutTy { ty, mutbl: _ }: &mut MutTy, vis: &mut T) {
|
||||
|
|
@ -858,7 +892,7 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
|
|||
vis.visit_generics(generics);
|
||||
}
|
||||
ItemKind::Enum(EnumDef { variants }, generics) => {
|
||||
visit_vec(variants, |variant| vis.visit_variant(variant));
|
||||
variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
|
||||
vis.visit_generics(generics);
|
||||
}
|
||||
ItemKind::Struct(variant_data, generics) |
|
||||
|
|
@ -1042,13 +1076,7 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
|
|||
}
|
||||
PatKind::Struct(path, fields, _etc) => {
|
||||
vis.visit_path(path);
|
||||
for FieldPat { ident, pat, is_shorthand: _, attrs, id, span } in fields {
|
||||
vis.visit_ident(ident);
|
||||
vis.visit_id(id);
|
||||
vis.visit_pat(pat);
|
||||
visit_thin_attrs(attrs, vis);
|
||||
vis.visit_span(span);
|
||||
};
|
||||
fields.flat_map_in_place(|field| vis.flat_map_field_pattern(field));
|
||||
}
|
||||
PatKind::Box(inner) => vis.visit_pat(inner),
|
||||
PatKind::Ref(inner, _mutbl) => vis.visit_pat(inner),
|
||||
|
|
@ -1130,7 +1158,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { node, id, span, attrs }: &mut Expr,
|
|||
}
|
||||
ExprKind::Match(expr, arms) => {
|
||||
vis.visit_expr(expr);
|
||||
visit_vec(arms, |arm| vis.visit_arm(arm));
|
||||
arms.flat_map_in_place(|arm| vis.flat_map_arm(arm));
|
||||
}
|
||||
ExprKind::Closure(_capture_by, asyncness, _movability, decl, body, span) => {
|
||||
vis.visit_asyncness(asyncness);
|
||||
|
|
@ -1193,7 +1221,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { node, id, span, attrs }: &mut Expr,
|
|||
ExprKind::Mac(mac) => vis.visit_mac(mac),
|
||||
ExprKind::Struct(path, fields, expr) => {
|
||||
vis.visit_path(path);
|
||||
visit_vec(fields, |field| vis.visit_field(field));
|
||||
fields.flat_map_in_place(|field| vis.flat_map_field(field));
|
||||
visit_opt(expr, |expr| vis.visit_expr(expr));
|
||||
},
|
||||
ExprKind::Paren(expr) => {
|
||||
|
|
|
|||
|
|
@ -93,8 +93,7 @@ impl<'ast> Visitor<'ast> for NodeCounter {
|
|||
self.count += 1;
|
||||
walk_poly_trait_ref(self, t, m)
|
||||
}
|
||||
fn visit_variant_data(&mut self, s: &VariantData, _: Ident,
|
||||
_: &Generics, _: NodeId, _: Span) {
|
||||
fn visit_variant_data(&mut self, s: &VariantData) {
|
||||
self.count += 1;
|
||||
walk_struct_def(self, s)
|
||||
}
|
||||
|
|
@ -107,9 +106,9 @@ impl<'ast> Visitor<'ast> for NodeCounter {
|
|||
self.count += 1;
|
||||
walk_enum_def(self, enum_definition, generics, item_id)
|
||||
}
|
||||
fn visit_variant(&mut self, v: &Variant, g: &Generics, item_id: NodeId) {
|
||||
fn visit_variant(&mut self, v: &Variant) {
|
||||
self.count += 1;
|
||||
walk_variant(self, v, g, item_id)
|
||||
walk_variant(self, v)
|
||||
}
|
||||
fn visit_lifetime(&mut self, lifetime: &Lifetime) {
|
||||
self.count += 1;
|
||||
|
|
|
|||
|
|
@ -92,8 +92,7 @@ pub trait Visitor<'ast>: Sized {
|
|||
fn visit_poly_trait_ref(&mut self, t: &'ast PolyTraitRef, m: &'ast TraitBoundModifier) {
|
||||
walk_poly_trait_ref(self, t, m)
|
||||
}
|
||||
fn visit_variant_data(&mut self, s: &'ast VariantData, _: Ident,
|
||||
_: &'ast Generics, _: NodeId, _: Span) {
|
||||
fn visit_variant_data(&mut self, s: &'ast VariantData) {
|
||||
walk_struct_def(self, s)
|
||||
}
|
||||
fn visit_struct_field(&mut self, s: &'ast StructField) { walk_struct_field(self, s) }
|
||||
|
|
@ -101,8 +100,8 @@ pub trait Visitor<'ast>: Sized {
|
|||
generics: &'ast Generics, item_id: NodeId, _: Span) {
|
||||
walk_enum_def(self, enum_definition, generics, item_id)
|
||||
}
|
||||
fn visit_variant(&mut self, v: &'ast Variant, g: &'ast Generics, item_id: NodeId) {
|
||||
walk_variant(self, v, g, item_id)
|
||||
fn visit_variant(&mut self, v: &'ast Variant) {
|
||||
walk_variant(self, v)
|
||||
}
|
||||
fn visit_label(&mut self, label: &'ast Label) {
|
||||
walk_label(self, label)
|
||||
|
|
@ -163,6 +162,12 @@ pub trait Visitor<'ast>: Sized {
|
|||
fn visit_fn_header(&mut self, _header: &'ast FnHeader) {
|
||||
// Nothing to do
|
||||
}
|
||||
fn visit_field(&mut self, f: &'ast Field) {
|
||||
walk_field(self, f)
|
||||
}
|
||||
fn visit_field_pattern(&mut self, fp: &'ast FieldPat) {
|
||||
walk_field_pattern(self, fp)
|
||||
}
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
|
|
@ -280,8 +285,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
|||
ItemKind::Struct(ref struct_definition, ref generics) |
|
||||
ItemKind::Union(ref struct_definition, ref generics) => {
|
||||
visitor.visit_generics(generics);
|
||||
visitor.visit_variant_data(struct_definition, item.ident,
|
||||
generics, item.id, item.span);
|
||||
visitor.visit_variant_data(struct_definition);
|
||||
}
|
||||
ItemKind::Trait(.., ref generics, ref bounds, ref methods) => {
|
||||
visitor.visit_generics(generics);
|
||||
|
|
@ -300,24 +304,32 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
|
|||
|
||||
pub fn walk_enum_def<'a, V: Visitor<'a>>(visitor: &mut V,
|
||||
enum_definition: &'a EnumDef,
|
||||
generics: &'a Generics,
|
||||
item_id: NodeId) {
|
||||
walk_list!(visitor, visit_variant, &enum_definition.variants, generics, item_id);
|
||||
_: &'a Generics,
|
||||
_: NodeId) {
|
||||
walk_list!(visitor, visit_variant, &enum_definition.variants);
|
||||
}
|
||||
|
||||
pub fn walk_variant<'a, V>(visitor: &mut V,
|
||||
variant: &'a Variant,
|
||||
generics: &'a Generics,
|
||||
item_id: NodeId)
|
||||
pub fn walk_variant<'a, V: Visitor<'a>>(visitor: &mut V, variant: &'a Variant)
|
||||
where V: Visitor<'a>,
|
||||
{
|
||||
visitor.visit_ident(variant.ident);
|
||||
visitor.visit_variant_data(&variant.data, variant.ident,
|
||||
generics, item_id, variant.span);
|
||||
visitor.visit_variant_data(&variant.data);
|
||||
walk_list!(visitor, visit_anon_const, &variant.disr_expr);
|
||||
walk_list!(visitor, visit_attribute, &variant.attrs);
|
||||
}
|
||||
|
||||
pub fn walk_field<'a, V: Visitor<'a>>(visitor: &mut V, f: &'a Field) {
|
||||
visitor.visit_expr(&f.expr);
|
||||
visitor.visit_ident(f.ident);
|
||||
walk_list!(visitor, visit_attribute, f.attrs.iter());
|
||||
}
|
||||
|
||||
pub fn walk_field_pattern<'a, V: Visitor<'a>>(visitor: &mut V, fp: &'a FieldPat) {
|
||||
visitor.visit_ident(fp.ident);
|
||||
visitor.visit_pat(&fp.pat);
|
||||
walk_list!(visitor, visit_attribute, fp.attrs.iter());
|
||||
}
|
||||
|
||||
pub fn walk_ty<'a, V: Visitor<'a>>(visitor: &mut V, typ: &'a Ty) {
|
||||
match typ.node {
|
||||
TyKind::Slice(ref ty) | TyKind::Paren(ref ty) => {
|
||||
|
|
@ -441,11 +453,7 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
|
|||
}
|
||||
PatKind::Struct(ref path, ref fields, _) => {
|
||||
visitor.visit_path(path, pattern.id);
|
||||
for field in fields {
|
||||
walk_list!(visitor, visit_attribute, field.attrs.iter());
|
||||
visitor.visit_ident(field.ident);
|
||||
visitor.visit_pat(&field.pat)
|
||||
}
|
||||
walk_list!(visitor, visit_field_pattern, fields);
|
||||
}
|
||||
PatKind::Box(ref subpattern) |
|
||||
PatKind::Ref(ref subpattern, _) |
|
||||
|
|
@ -686,11 +694,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) {
|
|||
}
|
||||
ExprKind::Struct(ref path, ref fields, ref optional_base) => {
|
||||
visitor.visit_path(path, expression.id);
|
||||
for field in fields {
|
||||
walk_list!(visitor, visit_attribute, field.attrs.iter());
|
||||
visitor.visit_ident(field.ident);
|
||||
visitor.visit_expr(&field.expr)
|
||||
}
|
||||
walk_list!(visitor, visit_field, fields);
|
||||
walk_list!(visitor, visit_expr, optional_base);
|
||||
}
|
||||
ExprKind::Tup(ref subexpressions) => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue