Skip to content

Commit b8c6b0f

Browse files
committed
expand: Use Option instead of SmallVec<1> where possible.
For most of the AST fragment kinds involved in expansion, we use `SmallVec<[T; 1]>` for the type produced. This is necessary for things like items and statements, but for many other things like arms, variants, and params, we never produce more than one, so an `Option` is sufficient. Specifics: - Numerous `flat_map_foo` methods that currently return a `SmallVec` are renamed as `filter_map_foo` and now return an `Option`. (This mirrors the existing `filter_map_expr`.) - Likewise, numerous plural `make_foos` methods that are also renamed as singular `make_foo`. - Also, various AST fragment kinds are renamed from plural to singular. - The `ast_fragments!` macro gets a new `option` kind, to augment the existing `one` and `many` kinds. - `visit_clobber_opt` is added. It's similar to `visit_clobber`. - In `expect_from_annotables`, it now checks that there aren't any excess elements in the iterator. - The associated type `InvocationCollectorNode::OutputTy` no longer has a default value, because it now varies more. It used to mostly be `SmallVec`, but not it is sometimes `SmallVec`, sometimes `Option`, and sometimes something else.
1 parent 59372f2 commit b8c6b0f

File tree

6 files changed

+310
-287
lines changed

6 files changed

+310
-287
lines changed

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 61 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ pub trait WalkItemKind {
4848
pub trait MutVisitor: Sized {
4949
// Methods in this trait have one of three forms:
5050
//
51-
// fn visit_t(&mut self, t: &mut T); // common
52-
// fn flat_map_t(&mut self, t: T) -> SmallVec<[T; 1]>; // rare
53-
// fn filter_map_t(&mut self, t: T) -> Option<T>; // rarest
51+
// fn visit_t(&mut self, t: &mut T);
52+
// fn filter_map_t(&mut self, t: T) -> Option<T>;
53+
// fn flat_map_t(&mut self, t: T) -> SmallVec<[T; 1]>;
5454
//
5555
// Any additions to this trait should happen in form of a call to a public
5656
// `noop_*` function that only calls out to the visitor again, not other
@@ -119,8 +119,8 @@ pub trait MutVisitor: Sized {
119119
walk_field_def(self, fd);
120120
}
121121

122-
fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]> {
123-
walk_flat_map_field_def(self, fd)
122+
fn filter_map_field_def(&mut self, fd: FieldDef) -> Option<FieldDef> {
123+
walk_filter_map_field_def(self, fd)
124124
}
125125

126126
fn visit_assoc_item(&mut self, i: &mut P<AssocItem>, ctxt: AssocCtxt) {
@@ -168,8 +168,8 @@ pub trait MutVisitor: Sized {
168168
walk_arm(self, arm);
169169
}
170170

171-
fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> {
172-
walk_flat_map_arm(self, arm)
171+
fn filter_map_arm(&mut self, arm: Arm) -> Option<Arm> {
172+
walk_filter_map_arm(self, arm)
173173
}
174174

175175
fn visit_pat(&mut self, p: &mut P<Pat>) {
@@ -222,8 +222,8 @@ pub trait MutVisitor: Sized {
222222
walk_variant(self, v);
223223
}
224224

225-
fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
226-
walk_flat_map_variant(self, v)
225+
fn filter_map_variant(&mut self, v: Variant) -> Option<Variant> {
226+
walk_filter_map_variant(self, v)
227227
}
228228

229229
fn visit_ident(&mut self, i: &mut Ident) {
@@ -282,8 +282,8 @@ pub trait MutVisitor: Sized {
282282
walk_param(self, param);
283283
}
284284

285-
fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]> {
286-
walk_flat_map_param(self, param)
285+
fn filter_map_param(&mut self, param: Param) -> Option<Param> {
286+
walk_filter_map_param(self, param)
287287
}
288288

289289
fn visit_generics(&mut self, generics: &mut Generics) {
@@ -306,8 +306,8 @@ pub trait MutVisitor: Sized {
306306
walk_generic_param(self, param)
307307
}
308308

309-
fn flat_map_generic_param(&mut self, param: GenericParam) -> SmallVec<[GenericParam; 1]> {
310-
walk_flat_map_generic_param(self, param)
309+
fn filter_map_generic_param(&mut self, param: GenericParam) -> Option<GenericParam> {
310+
walk_filter_map_generic_param(self, param)
311311
}
312312

313313
fn visit_param_bound(&mut self, tpb: &mut GenericBound, _ctxt: BoundKind) {
@@ -326,19 +326,19 @@ pub trait MutVisitor: Sized {
326326
walk_expr_field(self, f);
327327
}
328328

329-
fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]> {
330-
walk_flat_map_expr_field(self, f)
329+
fn filter_map_expr_field(&mut self, f: ExprField) -> Option<ExprField> {
330+
walk_filter_map_expr_field(self, f)
331331
}
332332

333333
fn visit_where_clause(&mut self, where_clause: &mut WhereClause) {
334334
walk_where_clause(self, where_clause);
335335
}
336336

337-
fn flat_map_where_predicate(
337+
fn filter_map_where_predicate(
338338
&mut self,
339339
where_predicate: WherePredicate,
340-
) -> SmallVec<[WherePredicate; 1]> {
341-
walk_flat_map_where_predicate(self, where_predicate)
340+
) -> Option<WherePredicate> {
341+
walk_filter_map_where_predicate(self, where_predicate)
342342
}
343343

344344
fn visit_where_predicate_kind(&mut self, kind: &mut WherePredicateKind) {
@@ -363,8 +363,8 @@ pub trait MutVisitor: Sized {
363363
walk_pat_field(self, fp)
364364
}
365365

366-
fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]> {
367-
walk_flat_map_pat_field(self, fp)
366+
fn filter_map_pat_field(&mut self, fp: PatField) -> Option<PatField> {
367+
walk_filter_map_pat_field(self, fp)
368368
}
369369

370370
fn visit_inline_asm(&mut self, asm: &mut InlineAsm) {
@@ -400,6 +400,11 @@ pub fn visit_clobber<T: DummyAstNode>(t: &mut T, f: impl FnOnce(T) -> T) {
400400
*t = f(old_t);
401401
}
402402

403+
pub fn visit_clobber_opt<T>(t: &mut Option<T>, f: impl FnOnce(T) -> Option<T>) {
404+
let old_t = std::mem::replace(t, None);
405+
*t = old_t.and_then(|new_t| f(new_t));
406+
}
407+
403408
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
404409
#[inline]
405410
fn visit_vec<T, F>(elems: &mut Vec<T>, mut visit_elem: F)
@@ -485,12 +490,9 @@ pub fn walk_pat_field<T: MutVisitor>(vis: &mut T, fp: &mut PatField) {
485490
vis.visit_span(span);
486491
}
487492

488-
pub fn walk_flat_map_pat_field<T: MutVisitor>(
489-
vis: &mut T,
490-
mut fp: PatField,
491-
) -> SmallVec<[PatField; 1]> {
493+
pub fn walk_filter_map_pat_field<T: MutVisitor>(vis: &mut T, mut fp: PatField) -> Option<PatField> {
492494
vis.visit_pat_field(&mut fp);
493-
smallvec![fp]
495+
Some(fp)
494496
}
495497

496498
fn walk_use_tree<T: MutVisitor>(vis: &mut T, use_tree: &mut UseTree) {
@@ -520,9 +522,9 @@ pub fn walk_arm<T: MutVisitor>(vis: &mut T, arm: &mut Arm) {
520522
vis.visit_span(span);
521523
}
522524

523-
pub fn walk_flat_map_arm<T: MutVisitor>(vis: &mut T, mut arm: Arm) -> SmallVec<[Arm; 1]> {
525+
pub fn walk_filter_map_arm<T: MutVisitor>(vis: &mut T, mut arm: Arm) -> Option<Arm> {
524526
vis.visit_arm(&mut arm);
525-
smallvec![arm]
527+
Some(arm)
526528
}
527529

528530
fn walk_assoc_item_constraint<T: MutVisitor>(
@@ -560,13 +562,13 @@ pub fn walk_ty<T: MutVisitor>(vis: &mut T, ty: &mut P<Ty>) {
560562
TyKind::BareFn(bft) => {
561563
let BareFnTy { safety, ext: _, generic_params, decl, decl_span } = bft.deref_mut();
562564
visit_safety(vis, safety);
563-
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
565+
generic_params.flat_map_in_place(|param| vis.filter_map_generic_param(param));
564566
vis.visit_fn_decl(decl);
565567
vis.visit_span(decl_span);
566568
}
567569
TyKind::UnsafeBinder(binder) => {
568570
let UnsafeBinderTy { generic_params, inner_ty } = binder.deref_mut();
569-
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
571+
generic_params.flat_map_in_place(|param| vis.filter_map_generic_param(param));
570572
vis.visit_ty(inner_ty);
571573
}
572574
TyKind::Tup(tys) => visit_thin_vec(tys, |ty| vis.visit_ty(ty)),
@@ -627,12 +629,12 @@ pub fn walk_variant<T: MutVisitor>(visitor: &mut T, variant: &mut Variant) {
627629
visitor.visit_span(span);
628630
}
629631

630-
pub fn walk_flat_map_variant<T: MutVisitor>(
632+
pub fn walk_filter_map_variant<T: MutVisitor>(
631633
vis: &mut T,
632634
mut variant: Variant,
633-
) -> SmallVec<[Variant; 1]> {
635+
) -> Option<Variant> {
634636
vis.visit_variant(&mut variant);
635-
smallvec![variant]
637+
Some(variant)
636638
}
637639

638640
fn walk_ident<T: MutVisitor>(vis: &mut T, Ident { name: _, span }: &mut Ident) {
@@ -766,9 +768,9 @@ pub fn walk_param<T: MutVisitor>(vis: &mut T, param: &mut Param) {
766768
vis.visit_span(span);
767769
}
768770

769-
pub fn walk_flat_map_param<T: MutVisitor>(vis: &mut T, mut param: Param) -> SmallVec<[Param; 1]> {
771+
pub fn walk_filter_map_param<T: MutVisitor>(vis: &mut T, mut param: Param) -> Option<Param> {
770772
vis.visit_param(&mut param);
771-
smallvec![param]
773+
Some(param)
772774
}
773775

774776
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
@@ -791,7 +793,7 @@ fn walk_closure_binder<T: MutVisitor>(vis: &mut T, binder: &mut ClosureBinder) {
791793
match binder {
792794
ClosureBinder::NotPresent => {}
793795
ClosureBinder::For { span: _, generic_params } => {
794-
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
796+
generic_params.flat_map_in_place(|param| vis.filter_map_generic_param(param));
795797
}
796798
}
797799
}
@@ -860,7 +862,7 @@ fn walk_contract<T: MutVisitor>(vis: &mut T, contract: &mut P<FnContract>) {
860862

861863
fn walk_fn_decl<T: MutVisitor>(vis: &mut T, decl: &mut P<FnDecl>) {
862864
let FnDecl { inputs, output } = decl.deref_mut();
863-
inputs.flat_map_in_place(|param| vis.flat_map_param(param));
865+
inputs.flat_map_in_place(|param| vis.filter_map_param(param));
864866
vis.visit_fn_ret_ty(output);
865867
}
866868

@@ -917,17 +919,17 @@ pub fn walk_generic_param<T: MutVisitor>(vis: &mut T, param: &mut GenericParam)
917919
}
918920
}
919921

920-
pub fn walk_flat_map_generic_param<T: MutVisitor>(
922+
pub fn walk_filter_map_generic_param<T: MutVisitor>(
921923
vis: &mut T,
922924
mut param: GenericParam,
923-
) -> SmallVec<[GenericParam; 1]> {
925+
) -> Option<GenericParam> {
924926
vis.visit_generic_param(&mut param);
925-
smallvec![param]
927+
Some(param)
926928
}
927929

928930
fn walk_generics<T: MutVisitor>(vis: &mut T, generics: &mut Generics) {
929931
let Generics { params, where_clause, span } = generics;
930-
params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
932+
params.flat_map_in_place(|param| vis.filter_map_generic_param(param));
931933
vis.visit_where_clause(where_clause);
932934
vis.visit_span(span);
933935
}
@@ -942,27 +944,27 @@ fn walk_ty_alias_where_clauses<T: MutVisitor>(vis: &mut T, tawcs: &mut TyAliasWh
942944

943945
fn walk_where_clause<T: MutVisitor>(vis: &mut T, wc: &mut WhereClause) {
944946
let WhereClause { has_where_token: _, predicates, span } = wc;
945-
predicates.flat_map_in_place(|predicate| vis.flat_map_where_predicate(predicate));
947+
predicates.flat_map_in_place(|predicate| vis.filter_map_where_predicate(predicate));
946948
vis.visit_span(span);
947949
}
948950

949-
pub fn walk_flat_map_where_predicate<T: MutVisitor>(
951+
pub fn walk_filter_map_where_predicate<T: MutVisitor>(
950952
vis: &mut T,
951953
mut pred: WherePredicate,
952-
) -> SmallVec<[WherePredicate; 1]> {
954+
) -> Option<WherePredicate> {
953955
let WherePredicate { attrs, kind, id, span, is_placeholder: _ } = &mut pred;
954956
vis.visit_id(id);
955957
visit_attrs(vis, attrs);
956958
vis.visit_where_predicate_kind(kind);
957959
vis.visit_span(span);
958-
smallvec![pred]
960+
Some(pred)
959961
}
960962

961963
pub fn walk_where_predicate_kind<T: MutVisitor>(vis: &mut T, kind: &mut WherePredicateKind) {
962964
match kind {
963965
WherePredicateKind::BoundPredicate(bp) => {
964966
let WhereBoundPredicate { bound_generic_params, bounded_ty, bounds } = bp;
965-
bound_generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
967+
bound_generic_params.flat_map_in_place(|param| vis.filter_map_generic_param(param));
966968
vis.visit_ty(bounded_ty);
967969
visit_vec(bounds, |bound| vis.visit_param_bound(bound, BoundKind::Bound));
968970
}
@@ -982,11 +984,11 @@ pub fn walk_where_predicate_kind<T: MutVisitor>(vis: &mut T, kind: &mut WherePre
982984
fn walk_variant_data<T: MutVisitor>(vis: &mut T, vdata: &mut VariantData) {
983985
match vdata {
984986
VariantData::Struct { fields, recovered: _ } => {
985-
fields.flat_map_in_place(|field| vis.flat_map_field_def(field));
987+
fields.flat_map_in_place(|field| vis.filter_map_field_def(field));
986988
}
987989
VariantData::Tuple(fields, id) => {
988990
vis.visit_id(id);
989-
fields.flat_map_in_place(|field| vis.flat_map_field_def(field));
991+
fields.flat_map_in_place(|field| vis.filter_map_field_def(field));
990992
}
991993
VariantData::Unit(id) => vis.visit_id(id),
992994
}
@@ -1000,7 +1002,7 @@ fn walk_trait_ref<T: MutVisitor>(vis: &mut T, TraitRef { path, ref_id }: &mut Tr
10001002
fn walk_poly_trait_ref<T: MutVisitor>(vis: &mut T, p: &mut PolyTraitRef) {
10011003
let PolyTraitRef { bound_generic_params, modifiers, trait_ref, span } = p;
10021004
vis.visit_modifiers(modifiers);
1003-
bound_generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
1005+
bound_generic_params.flat_map_in_place(|param| vis.filter_map_generic_param(param));
10041006
vis.visit_trait_ref(trait_ref);
10051007
vis.visit_span(span);
10061008
}
@@ -1033,12 +1035,9 @@ pub fn walk_field_def<T: MutVisitor>(visitor: &mut T, fd: &mut FieldDef) {
10331035
visitor.visit_span(span);
10341036
}
10351037

1036-
pub fn walk_flat_map_field_def<T: MutVisitor>(
1037-
vis: &mut T,
1038-
mut fd: FieldDef,
1039-
) -> SmallVec<[FieldDef; 1]> {
1038+
pub fn walk_filter_map_field_def<T: MutVisitor>(vis: &mut T, mut fd: FieldDef) -> Option<FieldDef> {
10401039
vis.visit_field_def(&mut fd);
1041-
smallvec![fd]
1040+
Some(fd)
10421041
}
10431042

10441043
pub fn walk_expr_field<T: MutVisitor>(vis: &mut T, f: &mut ExprField) {
@@ -1050,12 +1049,12 @@ pub fn walk_expr_field<T: MutVisitor>(vis: &mut T, f: &mut ExprField) {
10501049
vis.visit_span(span);
10511050
}
10521051

1053-
pub fn walk_flat_map_expr_field<T: MutVisitor>(
1052+
pub fn walk_filter_map_expr_field<T: MutVisitor>(
10541053
vis: &mut T,
10551054
mut f: ExprField,
1056-
) -> SmallVec<[ExprField; 1]> {
1055+
) -> Option<ExprField> {
10571056
vis.visit_expr_field(&mut f);
1058-
smallvec![f]
1057+
Some(f)
10591058
}
10601059

10611060
fn walk_mt<T: MutVisitor>(vis: &mut T, MutTy { ty, mutbl: _ }: &mut MutTy) {
@@ -1149,7 +1148,7 @@ impl WalkItemKind for ItemKind {
11491148
ItemKind::Enum(ident, EnumDef { variants }, generics) => {
11501149
vis.visit_ident(ident);
11511150
vis.visit_generics(generics);
1152-
variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
1151+
variants.flat_map_in_place(|variant| vis.filter_map_variant(variant));
11531152
}
11541153
ItemKind::Struct(ident, variant_data, generics)
11551154
| ItemKind::Union(ident, variant_data, generics) => {
@@ -1439,7 +1438,7 @@ pub fn walk_pat<T: MutVisitor>(vis: &mut T, pat: &mut P<Pat>) {
14391438
PatKind::Struct(qself, path, fields, _etc) => {
14401439
vis.visit_qself(qself);
14411440
vis.visit_path(path);
1442-
fields.flat_map_in_place(|field| vis.flat_map_pat_field(field));
1441+
fields.flat_map_in_place(|field| vis.filter_map_pat_field(field));
14431442
}
14441443
PatKind::Box(inner) => vis.visit_pat(inner),
14451444
PatKind::Deref(inner) => vis.visit_pat(inner),
@@ -1595,7 +1594,7 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
15951594
}
15961595
ExprKind::Match(expr, arms, _kind) => {
15971596
vis.visit_expr(expr);
1598-
arms.flat_map_in_place(|arm| vis.flat_map_arm(arm));
1597+
arms.flat_map_in_place(|arm| vis.filter_map_arm(arm));
15991598
}
16001599
ExprKind::Closure(box Closure {
16011600
binder,
@@ -1684,7 +1683,7 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
16841683
let StructExpr { qself, path, fields, rest } = se.deref_mut();
16851684
vis.visit_qself(qself);
16861685
vis.visit_path(path);
1687-
fields.flat_map_in_place(|field| vis.flat_map_expr_field(field));
1686+
fields.flat_map_in_place(|field| vis.filter_map_expr_field(field));
16881687
match rest {
16891688
StructRest::Base(expr) => vis.visit_expr(expr),
16901689
StructRest::Rest(_span) => {}
@@ -1717,10 +1716,8 @@ pub fn walk_expr<T: MutVisitor>(vis: &mut T, Expr { kind, id, span, attrs, token
17171716
}
17181717

17191718
pub fn noop_filter_map_expr<T: MutVisitor>(vis: &mut T, mut e: P<Expr>) -> Option<P<Expr>> {
1720-
Some({
1721-
vis.visit_expr(&mut e);
1722-
e
1723-
})
1719+
vis.visit_expr(&mut e);
1720+
Some(e)
17241721
}
17251722

17261723
pub fn walk_flat_map_stmt<T: MutVisitor>(

0 commit comments

Comments
 (0)