Skip to content

Commit b87e1ec

Browse files
committed
Box the biggest ast::ItemKind variants
1 parent fee0d31 commit b87e1ec

File tree

34 files changed

+309
-204
lines changed

34 files changed

+309
-204
lines changed

compiler/rustc_ast/src/ast.rs

+54-35
Original file line numberDiff line numberDiff line change
@@ -2655,6 +2655,35 @@ impl Default for FnHeader {
26552655
}
26562656
}
26572657

2658+
#[derive(Clone, Encodable, Decodable, Debug)]
2659+
pub struct TraitKind(
2660+
pub IsAuto,
2661+
pub Unsafe,
2662+
pub Generics,
2663+
pub GenericBounds,
2664+
pub Vec<P<AssocItem>>,
2665+
);
2666+
#[derive(Clone, Encodable, Decodable, Debug)]
2667+
pub struct TyAliasKind(pub Defaultness, pub Generics, pub GenericBounds, pub Option<P<Ty>>);
2668+
2669+
#[derive(Clone, Encodable, Decodable, Debug)]
2670+
pub struct ImplKind {
2671+
pub unsafety: Unsafe,
2672+
pub polarity: ImplPolarity,
2673+
pub defaultness: Defaultness,
2674+
pub constness: Const,
2675+
pub generics: Generics,
2676+
2677+
/// The trait being implemented, if any.
2678+
pub of_trait: Option<TraitRef>,
2679+
2680+
pub self_ty: P<Ty>,
2681+
pub items: Vec<P<AssocItem>>,
2682+
}
2683+
2684+
#[derive(Clone, Encodable, Decodable, Debug)]
2685+
pub struct FnKind(pub Defaultness, pub FnSig, pub Generics, pub Option<P<Block>>);
2686+
26582687
#[derive(Clone, Encodable, Decodable, Debug)]
26592688
pub enum ItemKind {
26602689
/// An `extern crate` item, with the optional *original* crate name if the crate was renamed.
@@ -2676,7 +2705,7 @@ pub enum ItemKind {
26762705
/// A function declaration (`fn`).
26772706
///
26782707
/// E.g., `fn foo(bar: usize) -> usize { .. }`.
2679-
Fn(Defaultness, FnSig, Generics, Option<P<Block>>),
2708+
Fn(Box<FnKind>),
26802709
/// A module declaration (`mod`).
26812710
///
26822711
/// E.g., `mod foo;` or `mod foo { .. }`.
@@ -2690,7 +2719,7 @@ pub enum ItemKind {
26902719
/// A type alias (`type`).
26912720
///
26922721
/// E.g., `type Foo = Bar<u8>;`.
2693-
TyAlias(Defaultness, Generics, GenericBounds, Option<P<Ty>>),
2722+
TyAlias(Box<TyAliasKind>),
26942723
/// An enum definition (`enum`).
26952724
///
26962725
/// E.g., `enum Foo<A, B> { C<A>, D<B> }`.
@@ -2706,27 +2735,15 @@ pub enum ItemKind {
27062735
/// A trait declaration (`trait`).
27072736
///
27082737
/// E.g., `trait Foo { .. }`, `trait Foo<T> { .. }` or `auto trait Foo {}`.
2709-
Trait(IsAuto, Unsafe, Generics, GenericBounds, Vec<P<AssocItem>>),
2738+
Trait(Box<TraitKind>),
27102739
/// Trait alias
27112740
///
27122741
/// E.g., `trait Foo = Bar + Quux;`.
27132742
TraitAlias(Generics, GenericBounds),
27142743
/// An implementation.
27152744
///
27162745
/// E.g., `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`.
2717-
Impl {
2718-
unsafety: Unsafe,
2719-
polarity: ImplPolarity,
2720-
defaultness: Defaultness,
2721-
constness: Const,
2722-
generics: Generics,
2723-
2724-
/// The trait being implemented, if any.
2725-
of_trait: Option<TraitRef>,
2726-
2727-
self_ty: P<Ty>,
2728-
items: Vec<P<AssocItem>>,
2729-
},
2746+
Impl(Box<ImplKind>),
27302747
/// A macro invocation.
27312748
///
27322749
/// E.g., `foo!(..)`.
@@ -2770,14 +2787,14 @@ impl ItemKind {
27702787

27712788
pub fn generics(&self) -> Option<&Generics> {
27722789
match self {
2773-
Self::Fn(_, _, generics, _)
2774-
| Self::TyAlias(_, generics, ..)
2790+
Self::Fn(box FnKind(_, _, generics, _))
2791+
| Self::TyAlias(box TyAliasKind(_, generics, ..))
27752792
| Self::Enum(_, generics)
27762793
| Self::Struct(_, generics)
27772794
| Self::Union(_, generics)
2778-
| Self::Trait(_, _, generics, ..)
2795+
| Self::Trait(box TraitKind(_, _, generics, ..))
27792796
| Self::TraitAlias(generics, _)
2780-
| Self::Impl { generics, .. } => Some(generics),
2797+
| Self::Impl(box ImplKind { generics, .. }) => Some(generics),
27812798
_ => None,
27822799
}
27832800
}
@@ -2800,17 +2817,19 @@ pub enum AssocItemKind {
28002817
/// If `def` is parsed, then the constant is provided, and otherwise required.
28012818
Const(Defaultness, P<Ty>, Option<P<Expr>>),
28022819
/// An associated function.
2803-
Fn(Defaultness, FnSig, Generics, Option<P<Block>>),
2820+
Fn(Box<FnKind>),
28042821
/// An associated type.
2805-
TyAlias(Defaultness, Generics, GenericBounds, Option<P<Ty>>),
2822+
TyAlias(Box<TyAliasKind>),
28062823
/// A macro expanding to associated items.
28072824
MacCall(MacCall),
28082825
}
28092826

28102827
impl AssocItemKind {
28112828
pub fn defaultness(&self) -> Defaultness {
28122829
match *self {
2813-
Self::Const(def, ..) | Self::Fn(def, ..) | Self::TyAlias(def, ..) => def,
2830+
Self::Const(def, ..)
2831+
| Self::Fn(box FnKind(def, ..))
2832+
| Self::TyAlias(box TyAliasKind(def, ..)) => def,
28142833
Self::MacCall(..) => Defaultness::Final,
28152834
}
28162835
}
@@ -2820,8 +2839,8 @@ impl From<AssocItemKind> for ItemKind {
28202839
fn from(assoc_item_kind: AssocItemKind) -> ItemKind {
28212840
match assoc_item_kind {
28222841
AssocItemKind::Const(a, b, c) => ItemKind::Const(a, b, c),
2823-
AssocItemKind::Fn(a, b, c, d) => ItemKind::Fn(a, b, c, d),
2824-
AssocItemKind::TyAlias(a, b, c, d) => ItemKind::TyAlias(a, b, c, d),
2842+
AssocItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
2843+
AssocItemKind::TyAlias(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
28252844
AssocItemKind::MacCall(a) => ItemKind::MacCall(a),
28262845
}
28272846
}
@@ -2833,8 +2852,8 @@ impl TryFrom<ItemKind> for AssocItemKind {
28332852
fn try_from(item_kind: ItemKind) -> Result<AssocItemKind, ItemKind> {
28342853
Ok(match item_kind {
28352854
ItemKind::Const(a, b, c) => AssocItemKind::Const(a, b, c),
2836-
ItemKind::Fn(a, b, c, d) => AssocItemKind::Fn(a, b, c, d),
2837-
ItemKind::TyAlias(a, b, c, d) => AssocItemKind::TyAlias(a, b, c, d),
2855+
ItemKind::Fn(fn_kind) => AssocItemKind::Fn(fn_kind),
2856+
ItemKind::TyAlias(ty_alias_kind) => AssocItemKind::TyAlias(ty_alias_kind),
28382857
ItemKind::MacCall(a) => AssocItemKind::MacCall(a),
28392858
_ => return Err(item_kind),
28402859
})
@@ -2846,10 +2865,10 @@ impl TryFrom<ItemKind> for AssocItemKind {
28462865
pub enum ForeignItemKind {
28472866
/// A foreign static item (`static FOO: u8`).
28482867
Static(P<Ty>, Mutability, Option<P<Expr>>),
2849-
/// A foreign function.
2850-
Fn(Defaultness, FnSig, Generics, Option<P<Block>>),
2851-
/// A foreign type.
2852-
TyAlias(Defaultness, Generics, GenericBounds, Option<P<Ty>>),
2868+
/// An foreign function.
2869+
Fn(Box<FnKind>),
2870+
/// An foreign type.
2871+
TyAlias(Box<TyAliasKind>),
28532872
/// A macro expanding to foreign items.
28542873
MacCall(MacCall),
28552874
}
@@ -2858,8 +2877,8 @@ impl From<ForeignItemKind> for ItemKind {
28582877
fn from(foreign_item_kind: ForeignItemKind) -> ItemKind {
28592878
match foreign_item_kind {
28602879
ForeignItemKind::Static(a, b, c) => ItemKind::Static(a, b, c),
2861-
ForeignItemKind::Fn(a, b, c, d) => ItemKind::Fn(a, b, c, d),
2862-
ForeignItemKind::TyAlias(a, b, c, d) => ItemKind::TyAlias(a, b, c, d),
2880+
ForeignItemKind::Fn(fn_kind) => ItemKind::Fn(fn_kind),
2881+
ForeignItemKind::TyAlias(ty_alias_kind) => ItemKind::TyAlias(ty_alias_kind),
28632882
ForeignItemKind::MacCall(a) => ItemKind::MacCall(a),
28642883
}
28652884
}
@@ -2871,8 +2890,8 @@ impl TryFrom<ItemKind> for ForeignItemKind {
28712890
fn try_from(item_kind: ItemKind) -> Result<ForeignItemKind, ItemKind> {
28722891
Ok(match item_kind {
28732892
ItemKind::Static(a, b, c) => ForeignItemKind::Static(a, b, c),
2874-
ItemKind::Fn(a, b, c, d) => ForeignItemKind::Fn(a, b, c, d),
2875-
ItemKind::TyAlias(a, b, c, d) => ForeignItemKind::TyAlias(a, b, c, d),
2893+
ItemKind::Fn(fn_kind) => ForeignItemKind::Fn(fn_kind),
2894+
ItemKind::TyAlias(ty_alias_kind) => ForeignItemKind::TyAlias(ty_alias_kind),
28762895
ItemKind::MacCall(a) => ForeignItemKind::MacCall(a),
28772896
_ => return Err(item_kind),
28782897
})

compiler/rustc_ast/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
test(attr(deny(warnings)))
1010
)]
1111
#![feature(box_syntax)]
12+
#![feature(box_patterns)]
1213
#![feature(const_fn)] // For the `transmute` in `P::new`
1314
#![feature(const_fn_transmute)]
1415
#![feature(const_panic)]

compiler/rustc_ast/src/mut_visit.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -912,15 +912,15 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
912912
vis.visit_ty(ty);
913913
visit_opt(expr, |expr| vis.visit_expr(expr));
914914
}
915-
ItemKind::Fn(_, sig, generics, body) => {
915+
ItemKind::Fn(box FnKind(_, sig, generics, body)) => {
916916
visit_fn_sig(sig, vis);
917917
vis.visit_generics(generics);
918918
visit_opt(body, |body| vis.visit_block(body));
919919
}
920920
ItemKind::Mod(m) => vis.visit_mod(m),
921921
ItemKind::ForeignMod(nm) => vis.visit_foreign_mod(nm),
922922
ItemKind::GlobalAsm(_ga) => {}
923-
ItemKind::TyAlias(_, generics, bounds, ty) => {
923+
ItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
924924
vis.visit_generics(generics);
925925
visit_bounds(bounds, vis);
926926
visit_opt(ty, |ty| vis.visit_ty(ty));
@@ -933,7 +933,7 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
933933
vis.visit_variant_data(variant_data);
934934
vis.visit_generics(generics);
935935
}
936-
ItemKind::Impl {
936+
ItemKind::Impl(box ImplKind {
937937
unsafety: _,
938938
polarity: _,
939939
defaultness: _,
@@ -942,13 +942,13 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
942942
of_trait,
943943
self_ty,
944944
items,
945-
} => {
945+
}) => {
946946
vis.visit_generics(generics);
947947
visit_opt(of_trait, |trait_ref| vis.visit_trait_ref(trait_ref));
948948
vis.visit_ty(self_ty);
949949
items.flat_map_in_place(|item| vis.flat_map_impl_item(item));
950950
}
951-
ItemKind::Trait(_is_auto, _unsafety, generics, bounds, items) => {
951+
ItemKind::Trait(box TraitKind(.., generics, bounds, items)) => {
952952
vis.visit_generics(generics);
953953
visit_bounds(bounds, vis);
954954
items.flat_map_in_place(|item| vis.flat_map_trait_item(item));
@@ -976,12 +976,12 @@ pub fn noop_flat_map_assoc_item<T: MutVisitor>(
976976
visitor.visit_ty(ty);
977977
visit_opt(expr, |expr| visitor.visit_expr(expr));
978978
}
979-
AssocItemKind::Fn(_, sig, generics, body) => {
979+
AssocItemKind::Fn(box FnKind(_, sig, generics, body)) => {
980980
visitor.visit_generics(generics);
981981
visit_fn_sig(sig, visitor);
982982
visit_opt(body, |body| visitor.visit_block(body));
983983
}
984-
AssocItemKind::TyAlias(_, generics, bounds, ty) => {
984+
AssocItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
985985
visitor.visit_generics(generics);
986986
visit_bounds(bounds, visitor);
987987
visit_opt(ty, |ty| visitor.visit_ty(ty));
@@ -1066,12 +1066,12 @@ pub fn noop_flat_map_foreign_item<T: MutVisitor>(
10661066
visitor.visit_ty(ty);
10671067
visit_opt(expr, |expr| visitor.visit_expr(expr));
10681068
}
1069-
ForeignItemKind::Fn(_, sig, generics, body) => {
1069+
ForeignItemKind::Fn(box FnKind(_, sig, generics, body)) => {
10701070
visitor.visit_generics(generics);
10711071
visit_fn_sig(sig, visitor);
10721072
visit_opt(body, |body| visitor.visit_block(body));
10731073
}
1074-
ForeignItemKind::TyAlias(_, generics, bounds, ty) => {
1074+
ForeignItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
10751075
visitor.visit_generics(generics);
10761076
visit_bounds(bounds, visitor);
10771077
visit_opt(ty, |ty| visitor.visit_ty(ty));

compiler/rustc_ast/src/visit.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
292292
visitor.visit_ty(typ);
293293
walk_list!(visitor, visit_expr, expr);
294294
}
295-
ItemKind::Fn(_, ref sig, ref generics, ref body) => {
295+
ItemKind::Fn(box FnKind(_, ref sig, ref generics, ref body)) => {
296296
visitor.visit_generics(generics);
297297
let kind = FnKind::Fn(FnCtxt::Free, item.ident, sig, &item.vis, body.as_deref());
298298
visitor.visit_fn(kind, item.span, item.id)
@@ -302,7 +302,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
302302
walk_list!(visitor, visit_foreign_item, &foreign_module.items);
303303
}
304304
ItemKind::GlobalAsm(ref ga) => visitor.visit_global_asm(ga),
305-
ItemKind::TyAlias(_, ref generics, ref bounds, ref ty) => {
305+
ItemKind::TyAlias(box TyAliasKind(_, ref generics, ref bounds, ref ty)) => {
306306
visitor.visit_generics(generics);
307307
walk_list!(visitor, visit_param_bound, bounds);
308308
walk_list!(visitor, visit_ty, ty);
@@ -311,7 +311,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
311311
visitor.visit_generics(generics);
312312
visitor.visit_enum_def(enum_definition, generics, item.id, item.span)
313313
}
314-
ItemKind::Impl {
314+
ItemKind::Impl(box ImplKind {
315315
unsafety: _,
316316
polarity: _,
317317
defaultness: _,
@@ -320,7 +320,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
320320
ref of_trait,
321321
ref self_ty,
322322
ref items,
323-
} => {
323+
}) => {
324324
visitor.visit_generics(generics);
325325
walk_list!(visitor, visit_trait_ref, of_trait);
326326
visitor.visit_ty(self_ty);
@@ -331,7 +331,7 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
331331
visitor.visit_generics(generics);
332332
visitor.visit_variant_data(struct_definition);
333333
}
334-
ItemKind::Trait(.., ref generics, ref bounds, ref items) => {
334+
ItemKind::Trait(box TraitKind(.., ref generics, ref bounds, ref items)) => {
335335
visitor.visit_generics(generics);
336336
walk_list!(visitor, visit_param_bound, bounds);
337337
walk_list!(visitor, visit_assoc_item, items, AssocCtxt::Trait);
@@ -543,12 +543,12 @@ pub fn walk_foreign_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a ForeignI
543543
visitor.visit_ty(ty);
544544
walk_list!(visitor, visit_expr, expr);
545545
}
546-
ForeignItemKind::Fn(_, sig, generics, body) => {
546+
ForeignItemKind::Fn(box FnKind(_, sig, generics, body)) => {
547547
visitor.visit_generics(generics);
548548
let kind = FnKind::Fn(FnCtxt::Foreign, ident, sig, vis, body.as_deref());
549549
visitor.visit_fn(kind, span, id);
550550
}
551-
ForeignItemKind::TyAlias(_, generics, bounds, ty) => {
551+
ForeignItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
552552
visitor.visit_generics(generics);
553553
walk_list!(visitor, visit_param_bound, bounds);
554554
walk_list!(visitor, visit_ty, ty);
@@ -653,12 +653,12 @@ pub fn walk_assoc_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem,
653653
visitor.visit_ty(ty);
654654
walk_list!(visitor, visit_expr, expr);
655655
}
656-
AssocItemKind::Fn(_, sig, generics, body) => {
656+
AssocItemKind::Fn(box FnKind(_, sig, generics, body)) => {
657657
visitor.visit_generics(generics);
658658
let kind = FnKind::Fn(FnCtxt::Assoc(ctxt), ident, sig, vis, body.as_deref());
659659
visitor.visit_fn(kind, span, id);
660660
}
661-
AssocItemKind::TyAlias(_, generics, bounds, ty) => {
661+
AssocItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => {
662662
visitor.visit_generics(generics);
663663
walk_list!(visitor, visit_param_bound, bounds);
664664
walk_list!(visitor, visit_ty, ty);

0 commit comments

Comments
 (0)