Skip to content

Commit 2946ce2

Browse files
Rollup merge of #142086 - fee1-dead-contrib:ast-visitor-dedup, r=oli-obk
duduplicate more AST visitor methods r? oli-obk
2 parents 4ce2db5 + 8a7262c commit 2946ce2

File tree

5 files changed

+314
-397
lines changed

5 files changed

+314
-397
lines changed

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 39 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,7 @@ pub trait MutVisitor: Sized {
208208
}
209209

210210
fn visit_ident(&mut self, i: &mut Ident) {
211-
walk_ident(self, i);
212-
}
213-
214-
fn visit_modifiers(&mut self, m: &mut TraitBoundModifiers) {
215-
walk_modifiers(self, m);
211+
self.visit_span(&mut i.span);
216212
}
217213

218214
fn visit_path(&mut self, p: &mut Path) {
@@ -367,6 +363,33 @@ pub trait MutVisitor: Sized {
367363

368364
super::common_visitor_and_walkers!((mut) MutVisitor);
369365

366+
macro_rules! generate_flat_map_visitor_fns {
367+
($($name:ident, $Ty:ty, $flat_map_fn:ident$(, $param:ident: $ParamTy:ty)*;)+) => {
368+
$(
369+
fn $name<V: MutVisitor>(
370+
vis: &mut V,
371+
values: &mut ThinVec<$Ty>,
372+
$(
373+
$param: $ParamTy,
374+
)*
375+
) {
376+
values.flat_map_in_place(|value| vis.$flat_map_fn(value$(,$param)*));
377+
}
378+
)+
379+
}
380+
}
381+
382+
generate_flat_map_visitor_fns! {
383+
visit_items, P<Item>, flat_map_item;
384+
visit_foreign_items, P<ForeignItem>, flat_map_foreign_item;
385+
visit_generic_params, GenericParam, flat_map_generic_param;
386+
visit_stmts, Stmt, flat_map_stmt;
387+
visit_exprs, P<Expr>, filter_map_expr;
388+
visit_pat_fields, PatField, flat_map_pat_field;
389+
visit_variants, Variant, flat_map_variant;
390+
visit_assoc_items, P<AssocItem>, flat_map_assoc_item, ctxt: AssocCtxt;
391+
}
392+
370393
#[inline]
371394
fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F)
372395
where
@@ -403,15 +426,6 @@ fn visit_attrs<T: MutVisitor>(vis: &mut T, attrs: &mut AttrVec) {
403426
}
404427
}
405428

406-
#[allow(unused)]
407-
fn visit_exprs<T: MutVisitor>(vis: &mut T, exprs: &mut Vec<P<Expr>>) {
408-
exprs.flat_map_in_place(|expr| vis.filter_map_expr(expr))
409-
}
410-
411-
fn visit_thin_exprs<T: MutVisitor>(vis: &mut T, exprs: &mut ThinVec<P<Expr>>) {
412-
exprs.flat_map_in_place(|expr| vis.filter_map_expr(expr))
413-
}
414-
415429
fn visit_attr_args<T: MutVisitor>(vis: &mut T, args: &mut AttrArgs) {
416430
match args {
417431
AttrArgs::Empty => {}
@@ -430,15 +444,6 @@ fn visit_delim_args<T: MutVisitor>(vis: &mut T, args: &mut DelimArgs) {
430444
vis.visit_span(close);
431445
}
432446

433-
pub fn walk_pat_field<T: MutVisitor>(vis: &mut T, fp: &mut PatField) {
434-
let PatField { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = fp;
435-
vis.visit_id(id);
436-
visit_attrs(vis, attrs);
437-
vis.visit_ident(ident);
438-
vis.visit_pat(pat);
439-
vis.visit_span(span);
440-
}
441-
442447
pub fn walk_flat_map_pat_field<T: MutVisitor>(
443448
vis: &mut T,
444449
mut fp: PatField,
@@ -447,21 +452,13 @@ pub fn walk_flat_map_pat_field<T: MutVisitor>(
447452
smallvec![fp]
448453
}
449454

450-
fn walk_use_tree<T: MutVisitor>(vis: &mut T, use_tree: &mut UseTree) {
451-
let UseTree { prefix, kind, span } = use_tree;
452-
vis.visit_path(prefix);
453-
match kind {
454-
UseTreeKind::Simple(rename) => visit_opt(rename, |rename| vis.visit_ident(rename)),
455-
UseTreeKind::Nested { items, span } => {
456-
for (tree, id) in items {
457-
vis.visit_id(id);
458-
vis.visit_use_tree(tree);
459-
}
460-
vis.visit_span(span);
461-
}
462-
UseTreeKind::Glob => {}
463-
}
464-
vis.visit_span(span);
455+
fn visit_nested_use_tree<V: MutVisitor>(
456+
vis: &mut V,
457+
nested_tree: &mut UseTree,
458+
nested_id: &mut NodeId,
459+
) {
460+
vis.visit_id(nested_id);
461+
vis.visit_use_tree(nested_tree);
465462
}
466463

467464
pub fn walk_arm<T: MutVisitor>(vis: &mut T, arm: &mut Arm) {
@@ -498,31 +495,6 @@ fn walk_assoc_item_constraint<T: MutVisitor>(
498495
vis.visit_span(span);
499496
}
500497

501-
pub fn walk_ty_pat<T: MutVisitor>(vis: &mut T, ty: &mut TyPat) {
502-
let TyPat { id, kind, span, tokens: _ } = ty;
503-
vis.visit_id(id);
504-
match kind {
505-
TyPatKind::Range(start, end, _include_end) => {
506-
visit_opt(start, |c| vis.visit_anon_const(c));
507-
visit_opt(end, |c| vis.visit_anon_const(c));
508-
}
509-
TyPatKind::Or(variants) => visit_thin_vec(variants, |p| vis.visit_ty_pat(p)),
510-
TyPatKind::Err(_) => {}
511-
}
512-
vis.visit_span(span);
513-
}
514-
515-
pub fn walk_variant<T: MutVisitor>(visitor: &mut T, variant: &mut Variant) {
516-
let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = variant;
517-
visitor.visit_id(id);
518-
visit_attrs(visitor, attrs);
519-
visitor.visit_vis(vis);
520-
visitor.visit_ident(ident);
521-
visitor.visit_variant_data(data);
522-
visit_opt(disr_expr, |disr_expr| visitor.visit_anon_const(disr_expr));
523-
visitor.visit_span(span);
524-
}
525-
526498
pub fn walk_flat_map_variant<T: MutVisitor>(
527499
vis: &mut T,
528500
mut variant: Variant,
@@ -531,25 +503,6 @@ pub fn walk_flat_map_variant<T: MutVisitor>(
531503
smallvec![variant]
532504
}
533505

534-
fn walk_ident<T: MutVisitor>(vis: &mut T, Ident { name: _, span }: &mut Ident) {
535-
vis.visit_span(span);
536-
}
537-
538-
fn walk_path<T: MutVisitor>(vis: &mut T, Path { segments, span, tokens: _ }: &mut Path) {
539-
for segment in segments {
540-
vis.visit_path_segment(segment);
541-
}
542-
vis.visit_span(span);
543-
}
544-
545-
fn walk_qself<T: MutVisitor>(vis: &mut T, qself: &mut Option<P<QSelf>>) {
546-
visit_opt(qself, |qself| {
547-
let QSelf { ty, path_span, position: _ } = &mut **qself;
548-
vis.visit_ty(ty);
549-
vis.visit_span(path_span);
550-
})
551-
}
552-
553506
fn walk_generic_args<T: MutVisitor>(vis: &mut T, generic_args: &mut GenericArgs) {
554507
match generic_args {
555508
GenericArgs::AngleBracketed(data) => vis.visit_angle_bracketed_parameter_data(data),
@@ -583,27 +536,6 @@ fn walk_parenthesized_parameter_data<T: MutVisitor>(vis: &mut T, args: &mut Pare
583536
vis.visit_span(inputs_span);
584537
}
585538

586-
fn walk_local<T: MutVisitor>(vis: &mut T, local: &mut Local) {
587-
let Local { id, super_, pat, ty, kind, span, colon_sp, attrs, tokens: _ } = local;
588-
visit_opt(super_, |sp| vis.visit_span(sp));
589-
vis.visit_id(id);
590-
visit_attrs(vis, attrs);
591-
vis.visit_pat(pat);
592-
visit_opt(ty, |ty| vis.visit_ty(ty));
593-
match kind {
594-
LocalKind::Decl => {}
595-
LocalKind::Init(init) => {
596-
vis.visit_expr(init);
597-
}
598-
LocalKind::InitElse(init, els) => {
599-
vis.visit_expr(init);
600-
vis.visit_block(els);
601-
}
602-
}
603-
visit_opt(colon_sp, |sp| vis.visit_span(sp));
604-
vis.visit_span(span);
605-
}
606-
607539
fn walk_attribute<T: MutVisitor>(vis: &mut T, attr: &mut Attribute) {
608540
let Attribute { kind, id: _, style: _, span } = attr;
609541
match kind {
@@ -853,35 +785,6 @@ fn walk_variant_data<T: MutVisitor>(vis: &mut T, vdata: &mut VariantData) {
853785
}
854786
}
855787

856-
fn walk_trait_ref<T: MutVisitor>(vis: &mut T, TraitRef { path, ref_id }: &mut TraitRef) {
857-
vis.visit_id(ref_id);
858-
vis.visit_path(path);
859-
}
860-
861-
fn walk_poly_trait_ref<T: MutVisitor>(vis: &mut T, p: &mut PolyTraitRef) {
862-
let PolyTraitRef { bound_generic_params, modifiers, trait_ref, span } = p;
863-
vis.visit_modifiers(modifiers);
864-
bound_generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
865-
vis.visit_trait_ref(trait_ref);
866-
vis.visit_span(span);
867-
}
868-
869-
fn walk_modifiers<V: MutVisitor>(vis: &mut V, m: &mut TraitBoundModifiers) {
870-
let TraitBoundModifiers { constness, asyncness, polarity } = m;
871-
match constness {
872-
BoundConstness::Never => {}
873-
BoundConstness::Always(span) | BoundConstness::Maybe(span) => vis.visit_span(span),
874-
}
875-
match asyncness {
876-
BoundAsyncness::Normal => {}
877-
BoundAsyncness::Async(span) => vis.visit_span(span),
878-
}
879-
match polarity {
880-
BoundPolarity::Positive => {}
881-
BoundPolarity::Negative(span) | BoundPolarity::Maybe(span) => vis.visit_span(span),
882-
}
883-
}
884-
885788
pub fn walk_field_def<T: MutVisitor>(visitor: &mut T, fd: &mut FieldDef) {
886789
let FieldDef { span, ident, vis, id, ty, attrs, is_placeholder: _, safety, default } = fd;
887790
visitor.visit_id(id);
@@ -902,15 +805,6 @@ pub fn walk_flat_map_field_def<T: MutVisitor>(
902805
smallvec![fd]
903806
}
904807

905-
pub fn walk_expr_field<T: MutVisitor>(vis: &mut T, f: &mut ExprField) {
906-
let ExprField { ident, expr, span, is_shorthand: _, attrs, id, is_placeholder: _ } = f;
907-
vis.visit_id(id);
908-
visit_attrs(vis, attrs);
909-
vis.visit_ident(ident);
910-
vis.visit_expr(expr);
911-
vis.visit_span(span);
912-
}
913-
914808
pub fn walk_flat_map_expr_field<T: MutVisitor>(
915809
vis: &mut T,
916810
mut f: ExprField,
@@ -930,16 +824,6 @@ pub fn walk_item_kind<K: WalkItemKind>(
930824
kind.walk(span, id, visibility, ctxt, vis)
931825
}
932826

933-
pub fn walk_crate<T: MutVisitor>(vis: &mut T, krate: &mut Crate) {
934-
let Crate { attrs, items, spans, id, is_placeholder: _ } = krate;
935-
vis.visit_id(id);
936-
visit_attrs(vis, attrs);
937-
items.flat_map_in_place(|item| vis.flat_map_item(item));
938-
let ModSpans { inner_span, inject_use_span } = spans;
939-
vis.visit_span(inner_span);
940-
vis.visit_span(inject_use_span);
941-
}
942-
943827
pub fn walk_flat_map_item(vis: &mut impl MutVisitor, mut item: P<Item>) -> SmallVec<[P<Item>; 1]> {
944828
vis.visit_item(&mut item);
945829
smallvec![item]
@@ -1021,18 +905,18 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1021905
vis.visit_id(id);
1022906
visit_attrs(vis, attrs);
1023907
match kind {
1024-
ExprKind::Array(exprs) => visit_thin_exprs(vis, exprs),
908+
ExprKind::Array(exprs) => visit_exprs(vis, exprs),
1025909
ExprKind::ConstBlock(anon_const) => {
1026910
vis.visit_anon_const(anon_const);
1027911
}
1028912
ExprKind::Repeat(expr, count) => {
1029913
vis.visit_expr(expr);
1030914
vis.visit_anon_const(count);
1031915
}
1032-
ExprKind::Tup(exprs) => visit_thin_exprs(vis, exprs),
916+
ExprKind::Tup(exprs) => visit_exprs(vis, exprs),
1033917
ExprKind::Call(f, args) => {
1034918
vis.visit_expr(f);
1035-
visit_thin_exprs(vis, args);
919+
visit_exprs(vis, args);
1036920
}
1037921
ExprKind::MethodCall(box MethodCall {
1038922
seg: PathSegment { ident, id, args: seg_args },
@@ -1044,7 +928,7 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
1044928
vis.visit_id(id);
1045929
vis.visit_ident(ident);
1046930
visit_opt(seg_args, |args| vis.visit_generic_args(args));
1047-
visit_thin_exprs(vis, call_args);
931+
visit_exprs(vis, call_args);
1048932
vis.visit_span(span);
1049933
}
1050934
ExprKind::Binary(binop, lhs, rhs) => {

0 commit comments

Comments
 (0)