Trait aliases are rare large ast nodes, box them
This commit is contained in:
@@ -3540,8 +3540,9 @@ impl Item {
|
||||
ItemKind::Const(i) => Some(&i.generics),
|
||||
ItemKind::Fn(i) => Some(&i.generics),
|
||||
ItemKind::TyAlias(i) => Some(&i.generics),
|
||||
ItemKind::TraitAlias(_, generics, _)
|
||||
| ItemKind::Enum(_, generics, _)
|
||||
ItemKind::TraitAlias(i) => Some(&i.generics),
|
||||
|
||||
ItemKind::Enum(_, generics, _)
|
||||
| ItemKind::Struct(_, generics, _)
|
||||
| ItemKind::Union(_, generics, _) => Some(&generics),
|
||||
ItemKind::Trait(i) => Some(&i.generics),
|
||||
@@ -3623,6 +3624,14 @@ impl Default for FnHeader {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug, Walkable)]
|
||||
pub struct TraitAlias {
|
||||
pub ident: Ident,
|
||||
pub generics: Generics,
|
||||
#[visitable(extra = BoundKind::Bound)]
|
||||
pub bounds: GenericBounds,
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug, Walkable)]
|
||||
pub struct Trait {
|
||||
pub constness: Const,
|
||||
@@ -3795,7 +3804,7 @@ pub enum ItemKind {
|
||||
/// Trait alias.
|
||||
///
|
||||
/// E.g., `trait Foo = Bar + Quux;`.
|
||||
TraitAlias(Ident, Generics, GenericBounds),
|
||||
TraitAlias(Box<TraitAlias>),
|
||||
/// An implementation.
|
||||
///
|
||||
/// E.g., `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`.
|
||||
@@ -3828,7 +3837,7 @@ impl ItemKind {
|
||||
| ItemKind::Struct(ident, ..)
|
||||
| ItemKind::Union(ident, ..)
|
||||
| ItemKind::Trait(box Trait { ident, .. })
|
||||
| ItemKind::TraitAlias(ident, ..)
|
||||
| ItemKind::TraitAlias(box TraitAlias { ident, .. })
|
||||
| ItemKind::MacroDef(ident, _)
|
||||
| ItemKind::Delegation(box Delegation { ident, .. }) => Some(ident),
|
||||
|
||||
@@ -3885,7 +3894,7 @@ impl ItemKind {
|
||||
| Self::Struct(_, generics, _)
|
||||
| Self::Union(_, generics, _)
|
||||
| Self::Trait(box Trait { generics, .. })
|
||||
| Self::TraitAlias(_, generics, _)
|
||||
| Self::TraitAlias(box TraitAlias { generics, .. })
|
||||
| Self::Impl(Impl { generics, .. }) => Some(generics),
|
||||
_ => None,
|
||||
}
|
||||
@@ -4047,8 +4056,8 @@ mod size_asserts {
|
||||
static_assert_size!(GenericBound, 88);
|
||||
static_assert_size!(Generics, 40);
|
||||
static_assert_size!(Impl, 64);
|
||||
static_assert_size!(Item, 144);
|
||||
static_assert_size!(ItemKind, 80);
|
||||
static_assert_size!(Item, 136);
|
||||
static_assert_size!(ItemKind, 72);
|
||||
static_assert_size!(LitKind, 24);
|
||||
static_assert_size!(Local, 96);
|
||||
static_assert_size!(MetaItemLit, 40);
|
||||
|
||||
@@ -833,7 +833,7 @@ macro_rules! common_visitor_and_walkers {
|
||||
visit_visitable!($($mut)? vis, impl_),
|
||||
ItemKind::Trait(trait_) =>
|
||||
visit_visitable!($($mut)? vis, trait_),
|
||||
ItemKind::TraitAlias(ident, generics, bounds) => {
|
||||
ItemKind::TraitAlias(box TraitAlias { ident, generics, bounds }) => {
|
||||
visit_visitable!($($mut)? vis, ident, generics);
|
||||
visit_visitable_with!($($mut)? vis, bounds, BoundKind::Bound)
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
||||
);
|
||||
hir::ItemKind::Trait(constness, *is_auto, safety, ident, generics, bounds, items)
|
||||
}
|
||||
ItemKind::TraitAlias(ident, generics, bounds) => {
|
||||
ItemKind::TraitAlias(box TraitAlias { ident, generics, bounds }) => {
|
||||
let ident = self.lower_ident(*ident);
|
||||
let (generics, bounds) = self.lower_generics(
|
||||
generics,
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
use ast::StaticItem;
|
||||
use itertools::{Itertools, Position};
|
||||
use rustc_ast as ast;
|
||||
use rustc_ast::ModKind;
|
||||
use rustc_ast::{self as ast, ModKind, TraitAlias};
|
||||
use rustc_span::Ident;
|
||||
|
||||
use crate::pp::BoxMarker;
|
||||
@@ -386,7 +385,7 @@ impl<'a> State<'a> {
|
||||
let empty = item.attrs.is_empty() && items.is_empty();
|
||||
self.bclose(item.span, empty, cb);
|
||||
}
|
||||
ast::ItemKind::TraitAlias(ident, generics, bounds) => {
|
||||
ast::ItemKind::TraitAlias(box TraitAlias { ident, generics, bounds }) => {
|
||||
let (cb, ib) = self.head(visibility_qualified(&item.vis, "trait"));
|
||||
self.print_ident(*ident);
|
||||
self.print_generic_params(&generics.params);
|
||||
|
||||
@@ -160,7 +160,9 @@ impl EarlyLintPass for NonCamelCaseTypes {
|
||||
ast::ItemKind::Trait(box ast::Trait { ident, .. }) => {
|
||||
self.check_case(cx, "trait", ident)
|
||||
}
|
||||
ast::ItemKind::TraitAlias(ident, _, _) => self.check_case(cx, "trait alias", ident),
|
||||
ast::ItemKind::TraitAlias(box ast::TraitAlias { ident, .. }) => {
|
||||
self.check_case(cx, "trait alias", ident)
|
||||
}
|
||||
|
||||
// N.B. This check is only for inherent associated types, so that we don't lint against
|
||||
// trait impls where we should have warned for the trait definition already.
|
||||
|
||||
@@ -955,7 +955,7 @@ impl<'a> Parser<'a> {
|
||||
|
||||
self.psess.gated_spans.gate(sym::trait_alias, whole_span);
|
||||
|
||||
Ok(ItemKind::TraitAlias(ident, generics, bounds))
|
||||
Ok(ItemKind::TraitAlias(Box::new(TraitAlias { ident, generics, bounds })))
|
||||
} else {
|
||||
// It's a normal trait.
|
||||
generics.where_clause = self.parse_where_clause()?;
|
||||
|
||||
@@ -10,7 +10,7 @@ use std::sync::Arc;
|
||||
use rustc_ast::visit::{self, AssocCtxt, Visitor, WalkItemKind};
|
||||
use rustc_ast::{
|
||||
self as ast, AssocItem, AssocItemKind, Block, ConstItem, Delegation, Fn, ForeignItem,
|
||||
ForeignItemKind, Inline, Item, ItemKind, NodeId, StaticItem, StmtKind, TyAlias,
|
||||
ForeignItemKind, Inline, Item, ItemKind, NodeId, StaticItem, StmtKind, TraitAlias, TyAlias,
|
||||
};
|
||||
use rustc_attr_parsing as attr;
|
||||
use rustc_attr_parsing::AttributeParser;
|
||||
@@ -844,7 +844,8 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
|
||||
}
|
||||
|
||||
// These items live in the type namespace.
|
||||
ItemKind::TyAlias(box TyAlias { ident, .. }) | ItemKind::TraitAlias(ident, ..) => {
|
||||
ItemKind::TyAlias(box TyAlias { ident, .. })
|
||||
| ItemKind::TraitAlias(box TraitAlias { ident, .. }) => {
|
||||
self.r.define_local(parent, ident, TypeNS, res, vis, sp, expansion);
|
||||
}
|
||||
|
||||
|
||||
@@ -2645,7 +2645,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
|
||||
);
|
||||
}
|
||||
|
||||
ItemKind::TraitAlias(_, ref generics, ref bounds) => {
|
||||
ItemKind::TraitAlias(box TraitAlias { ref generics, ref bounds, .. }) => {
|
||||
// Create a new rib for the trait-wide type parameters.
|
||||
self.with_generic_param_rib(
|
||||
&generics.params,
|
||||
@@ -5164,7 +5164,7 @@ impl<'ast> Visitor<'ast> for ItemInfoCollector<'_, '_, '_> {
|
||||
| ItemKind::Union(_, generics, _)
|
||||
| ItemKind::Impl(Impl { generics, .. })
|
||||
| ItemKind::Trait(box Trait { generics, .. })
|
||||
| ItemKind::TraitAlias(_, generics, _) => {
|
||||
| ItemKind::TraitAlias(box TraitAlias { generics, .. }) => {
|
||||
if let ItemKind::Fn(box Fn { sig, .. }) = &item.kind {
|
||||
self.collect_fn_info(sig.header, &sig.decl, item.id, &item.attrs);
|
||||
}
|
||||
|
||||
@@ -473,9 +473,18 @@ pub fn eq_item_kind(l: &ItemKind, r: &ItemKind) -> bool {
|
||||
&& over(lb, rb, eq_generic_bound)
|
||||
&& over(lis, ris, |l, r| eq_item(l, r, eq_assoc_item_kind))
|
||||
},
|
||||
(TraitAlias(li, lg, lb), TraitAlias(ri, rg, rb)) => {
|
||||
eq_id(*li, *ri) && eq_generics(lg, rg) && over(lb, rb, eq_generic_bound)
|
||||
},
|
||||
(
|
||||
TraitAlias(box ast::TraitAlias {
|
||||
ident: li,
|
||||
generics: lg,
|
||||
bounds: lb,
|
||||
}),
|
||||
TraitAlias(box ast::TraitAlias {
|
||||
ident: ri,
|
||||
generics: rg,
|
||||
bounds: rb,
|
||||
}),
|
||||
) => eq_id(*li, *ri) && eq_generics(lg, rg) && over(lb, rb, eq_generic_bound),
|
||||
(
|
||||
Impl(ast::Impl {
|
||||
generics: lg,
|
||||
|
||||
@@ -497,14 +497,14 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
|
||||
let rw = self.with_context(|ctx| format_trait(ctx, item, block_indent));
|
||||
self.push_rewrite(item.span, rw);
|
||||
}
|
||||
ast::ItemKind::TraitAlias(ident, ref generics, ref generic_bounds) => {
|
||||
ast::ItemKind::TraitAlias(ref ta) => {
|
||||
let shape = Shape::indented(self.block_indent, self.config);
|
||||
let rw = format_trait_alias(
|
||||
&self.get_context(),
|
||||
ident,
|
||||
ta.ident,
|
||||
&item.vis,
|
||||
generics,
|
||||
generic_bounds,
|
||||
&ta.generics,
|
||||
&ta.bounds,
|
||||
shape,
|
||||
);
|
||||
self.push_rewrite(item.span, rw);
|
||||
|
||||
@@ -2,14 +2,14 @@ ast-stats ================================================================
|
||||
ast-stats POST EXPANSION AST STATS: input_stats
|
||||
ast-stats Name Accumulated Size Count Item Size
|
||||
ast-stats ----------------------------------------------------------------
|
||||
ast-stats Item 1_584 (NN.N%) 11 144
|
||||
ast-stats - Enum 144 (NN.N%) 1
|
||||
ast-stats - ExternCrate 144 (NN.N%) 1
|
||||
ast-stats - ForeignMod 144 (NN.N%) 1
|
||||
ast-stats - Impl 144 (NN.N%) 1
|
||||
ast-stats - Trait 144 (NN.N%) 1
|
||||
ast-stats - Fn 288 (NN.N%) 2
|
||||
ast-stats - Use 576 (NN.N%) 4
|
||||
ast-stats Item 1_496 (NN.N%) 11 136
|
||||
ast-stats - Enum 136 (NN.N%) 1
|
||||
ast-stats - ExternCrate 136 (NN.N%) 1
|
||||
ast-stats - ForeignMod 136 (NN.N%) 1
|
||||
ast-stats - Impl 136 (NN.N%) 1
|
||||
ast-stats - Trait 136 (NN.N%) 1
|
||||
ast-stats - Fn 272 (NN.N%) 2
|
||||
ast-stats - Use 544 (NN.N%) 4
|
||||
ast-stats Ty 896 (NN.N%) 14 64
|
||||
ast-stats - Ptr 64 (NN.N%) 1
|
||||
ast-stats - Ref 64 (NN.N%) 1
|
||||
@@ -57,7 +57,7 @@ ast-stats GenericArgs 40 (NN.N%) 1 40
|
||||
ast-stats - AngleBracketed 40 (NN.N%) 1
|
||||
ast-stats Crate 40 (NN.N%) 1 40
|
||||
ast-stats ----------------------------------------------------------------
|
||||
ast-stats Total 7_528 129
|
||||
ast-stats Total 7_440 129
|
||||
ast-stats ================================================================
|
||||
hir-stats ================================================================
|
||||
hir-stats HIR STATS: input_stats
|
||||
|
||||
Reference in New Issue
Block a user