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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user