Use ThinVec
in ast::Generics
and related types.
This commit is contained in:
parent
06228d6e93
commit
dd7aff5cc5
12 changed files with 97 additions and 97 deletions
|
@ -3698,6 +3698,7 @@ version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rustc_ast",
|
"rustc_ast",
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
|
"thin-vec",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -384,7 +384,7 @@ impl GenericParam {
|
||||||
/// a function, enum, trait, etc.
|
/// a function, enum, trait, etc.
|
||||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||||
pub struct Generics {
|
pub struct Generics {
|
||||||
pub params: Vec<GenericParam>,
|
pub params: ThinVec<GenericParam>,
|
||||||
pub where_clause: WhereClause,
|
pub where_clause: WhereClause,
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
@ -392,7 +392,7 @@ pub struct Generics {
|
||||||
impl Default for Generics {
|
impl Default for Generics {
|
||||||
/// Creates an instance of `Generics`.
|
/// Creates an instance of `Generics`.
|
||||||
fn default() -> Generics {
|
fn default() -> Generics {
|
||||||
Generics { params: Vec::new(), where_clause: Default::default(), span: DUMMY_SP }
|
Generics { params: ThinVec::new(), where_clause: Default::default(), span: DUMMY_SP }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -441,7 +441,7 @@ impl WherePredicate {
|
||||||
pub struct WhereBoundPredicate {
|
pub struct WhereBoundPredicate {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
/// Any generics from a `for` binding.
|
/// Any generics from a `for` binding.
|
||||||
pub bound_generic_params: Vec<GenericParam>,
|
pub bound_generic_params: ThinVec<GenericParam>,
|
||||||
/// The type being bounded.
|
/// The type being bounded.
|
||||||
pub bounded_ty: P<Ty>,
|
pub bounded_ty: P<Ty>,
|
||||||
/// Trait and lifetime bounds (`Clone + Send + 'static`).
|
/// Trait and lifetime bounds (`Clone + Send + 'static`).
|
||||||
|
@ -1169,7 +1169,7 @@ impl Expr {
|
||||||
pub fn to_bound(&self) -> Option<GenericBound> {
|
pub fn to_bound(&self) -> Option<GenericBound> {
|
||||||
match &self.kind {
|
match &self.kind {
|
||||||
ExprKind::Path(None, path) => Some(GenericBound::Trait(
|
ExprKind::Path(None, path) => Some(GenericBound::Trait(
|
||||||
PolyTraitRef::new(Vec::new(), path.clone(), self.span),
|
PolyTraitRef::new(ThinVec::new(), path.clone(), self.span),
|
||||||
TraitBoundModifier::None,
|
TraitBoundModifier::None,
|
||||||
)),
|
)),
|
||||||
_ => None,
|
_ => None,
|
||||||
|
@ -1574,7 +1574,7 @@ pub enum ClosureBinder {
|
||||||
/// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
|
/// for<'a, 'b> |_: &'a (), _: &'b ()| { ... }
|
||||||
/// ^^^^^^ -- this
|
/// ^^^^^^ -- this
|
||||||
/// ```
|
/// ```
|
||||||
generic_params: P<[GenericParam]>,
|
generic_params: ThinVec<GenericParam>,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2056,7 +2056,7 @@ impl Ty {
|
||||||
pub struct BareFnTy {
|
pub struct BareFnTy {
|
||||||
pub unsafety: Unsafe,
|
pub unsafety: Unsafe,
|
||||||
pub ext: Extern,
|
pub ext: Extern,
|
||||||
pub generic_params: Vec<GenericParam>,
|
pub generic_params: ThinVec<GenericParam>,
|
||||||
pub decl: P<FnDecl>,
|
pub decl: P<FnDecl>,
|
||||||
/// Span of the `fn(...) -> ...` part.
|
/// Span of the `fn(...) -> ...` part.
|
||||||
pub decl_span: Span,
|
pub decl_span: Span,
|
||||||
|
@ -2636,7 +2636,7 @@ pub struct TraitRef {
|
||||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||||
pub struct PolyTraitRef {
|
pub struct PolyTraitRef {
|
||||||
/// The `'a` in `for<'a> Foo<&'a T>`.
|
/// The `'a` in `for<'a> Foo<&'a T>`.
|
||||||
pub bound_generic_params: Vec<GenericParam>,
|
pub bound_generic_params: ThinVec<GenericParam>,
|
||||||
|
|
||||||
/// The `Foo<&'a T>` in `<'a> Foo<&'a T>`.
|
/// The `Foo<&'a T>` in `<'a> Foo<&'a T>`.
|
||||||
pub trait_ref: TraitRef,
|
pub trait_ref: TraitRef,
|
||||||
|
@ -2645,7 +2645,7 @@ pub struct PolyTraitRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PolyTraitRef {
|
impl PolyTraitRef {
|
||||||
pub fn new(generic_params: Vec<GenericParam>, path: Path, span: Span) -> Self {
|
pub fn new(generic_params: ThinVec<GenericParam>, path: Path, span: Span) -> Self {
|
||||||
PolyTraitRef {
|
PolyTraitRef {
|
||||||
bound_generic_params: generic_params,
|
bound_generic_params: generic_params,
|
||||||
trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID },
|
trait_ref: TraitRef { path, ref_id: DUMMY_NODE_ID },
|
||||||
|
@ -3115,15 +3115,15 @@ mod size_asserts {
|
||||||
static_assert_size!(Block, 48);
|
static_assert_size!(Block, 48);
|
||||||
static_assert_size!(Expr, 72);
|
static_assert_size!(Expr, 72);
|
||||||
static_assert_size!(ExprKind, 40);
|
static_assert_size!(ExprKind, 40);
|
||||||
static_assert_size!(Fn, 184);
|
static_assert_size!(Fn, 168);
|
||||||
static_assert_size!(ForeignItem, 96);
|
static_assert_size!(ForeignItem, 96);
|
||||||
static_assert_size!(ForeignItemKind, 24);
|
static_assert_size!(ForeignItemKind, 24);
|
||||||
static_assert_size!(GenericArg, 24);
|
static_assert_size!(GenericArg, 24);
|
||||||
static_assert_size!(GenericBound, 72);
|
static_assert_size!(GenericBound, 56);
|
||||||
static_assert_size!(Generics, 72);
|
static_assert_size!(Generics, 56);
|
||||||
static_assert_size!(Impl, 184);
|
static_assert_size!(Impl, 168);
|
||||||
static_assert_size!(Item, 184);
|
static_assert_size!(Item, 168);
|
||||||
static_assert_size!(ItemKind, 112);
|
static_assert_size!(ItemKind, 96);
|
||||||
static_assert_size!(LitKind, 24);
|
static_assert_size!(LitKind, 24);
|
||||||
static_assert_size!(Local, 72);
|
static_assert_size!(Local, 72);
|
||||||
static_assert_size!(MetaItemLit, 40);
|
static_assert_size!(MetaItemLit, 40);
|
||||||
|
|
|
@ -839,9 +839,7 @@ pub fn noop_visit_closure_binder<T: MutVisitor>(binder: &mut ClosureBinder, vis:
|
||||||
match binder {
|
match binder {
|
||||||
ClosureBinder::NotPresent => {}
|
ClosureBinder::NotPresent => {}
|
||||||
ClosureBinder::For { span: _, generic_params } => {
|
ClosureBinder::For { span: _, generic_params } => {
|
||||||
let mut vec = std::mem::take(generic_params).into_vec();
|
generic_params.flat_map_in_place(|param| vis.flat_map_generic_param(param));
|
||||||
vec.flat_map_in_place(|param| vis.flat_map_generic_param(param));
|
|
||||||
*generic_params = P::from_vec(vec);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,9 +66,9 @@ use rustc_span::hygiene::MacroKind;
|
||||||
use rustc_span::source_map::DesugaringKind;
|
use rustc_span::source_map::DesugaringKind;
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
|
|
||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
|
use thin_vec::ThinVec;
|
||||||
|
|
||||||
macro_rules! arena_vec {
|
macro_rules! arena_vec {
|
||||||
($this:expr; $($x:expr),*) => (
|
($this:expr; $($x:expr),*) => (
|
||||||
|
@ -1207,7 +1207,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
||||||
let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
|
let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
|
||||||
let bound = this.lower_poly_trait_ref(
|
let bound = this.lower_poly_trait_ref(
|
||||||
&PolyTraitRef {
|
&PolyTraitRef {
|
||||||
bound_generic_params: vec![],
|
bound_generic_params: ThinVec::new(),
|
||||||
trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
|
trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
|
||||||
span: t.span
|
span: t.span
|
||||||
},
|
},
|
||||||
|
|
|
@ -8,3 +8,4 @@ edition = "2021"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rustc_ast = { path = "../rustc_ast" }
|
rustc_ast = { path = "../rustc_ast" }
|
||||||
rustc_span = { path = "../rustc_span" }
|
rustc_span = { path = "../rustc_span" }
|
||||||
|
thin-vec = "0.2.12"
|
||||||
|
|
|
@ -4,7 +4,7 @@ mod item;
|
||||||
|
|
||||||
use crate::pp::Breaks::{Consistent, Inconsistent};
|
use crate::pp::Breaks::{Consistent, Inconsistent};
|
||||||
use crate::pp::{self, Breaks};
|
use crate::pp::{self, Breaks};
|
||||||
|
use rustc_ast::attr::AttrIdGenerator;
|
||||||
use rustc_ast::ptr::P;
|
use rustc_ast::ptr::P;
|
||||||
use rustc_ast::token::{self, BinOpToken, CommentKind, Delimiter, Nonterminal, Token, TokenKind};
|
use rustc_ast::token::{self, BinOpToken, CommentKind, Delimiter, Nonterminal, Token, TokenKind};
|
||||||
use rustc_ast::tokenstream::{TokenStream, TokenTree};
|
use rustc_ast::tokenstream::{TokenStream, TokenTree};
|
||||||
|
@ -20,9 +20,8 @@ use rustc_span::edition::Edition;
|
||||||
use rustc_span::source_map::{SourceMap, Spanned};
|
use rustc_span::source_map::{SourceMap, Spanned};
|
||||||
use rustc_span::symbol::{kw, sym, Ident, IdentPrinter, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, IdentPrinter, Symbol};
|
||||||
use rustc_span::{BytePos, FileName, Span, DUMMY_SP};
|
use rustc_span::{BytePos, FileName, Span, DUMMY_SP};
|
||||||
|
|
||||||
use rustc_ast::attr::AttrIdGenerator;
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
use thin_vec::ThinVec;
|
||||||
|
|
||||||
pub use self::delimited::IterDelimited;
|
pub use self::delimited::IterDelimited;
|
||||||
|
|
||||||
|
@ -1722,7 +1721,7 @@ impl<'a> State<'a> {
|
||||||
self.ibox(INDENT_UNIT);
|
self.ibox(INDENT_UNIT);
|
||||||
self.print_formal_generic_params(generic_params);
|
self.print_formal_generic_params(generic_params);
|
||||||
let generics = ast::Generics {
|
let generics = ast::Generics {
|
||||||
params: Vec::new(),
|
params: ThinVec::new(),
|
||||||
where_clause: ast::WhereClause {
|
where_clause: ast::WhereClause {
|
||||||
has_where_token: false,
|
has_where_token: false,
|
||||||
predicates: Vec::new(),
|
predicates: Vec::new(),
|
||||||
|
|
|
@ -177,7 +177,7 @@ use std::cell::RefCell;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::ops::Not;
|
use std::ops::Not;
|
||||||
use std::vec;
|
use std::vec;
|
||||||
use thin_vec::thin_vec;
|
use thin_vec::{thin_vec, ThinVec};
|
||||||
use ty::{Bounds, Path, Ref, Self_, Ty};
|
use ty::{Bounds, Path, Ref, Self_, Ty};
|
||||||
|
|
||||||
pub mod ty;
|
pub mod ty;
|
||||||
|
@ -318,7 +318,7 @@ pub fn combine_substructure(
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TypeParameter {
|
struct TypeParameter {
|
||||||
bound_generic_params: Vec<ast::GenericParam>,
|
bound_generic_params: ThinVec<ast::GenericParam>,
|
||||||
ty: P<ast::Ty>,
|
ty: P<ast::Ty>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ fn find_type_parameters(
|
||||||
struct Visitor<'a, 'b> {
|
struct Visitor<'a, 'b> {
|
||||||
cx: &'a ExtCtxt<'b>,
|
cx: &'a ExtCtxt<'b>,
|
||||||
ty_param_names: &'a [Symbol],
|
ty_param_names: &'a [Symbol],
|
||||||
bound_generic_params_stack: Vec<ast::GenericParam>,
|
bound_generic_params_stack: ThinVec<ast::GenericParam>,
|
||||||
type_params: Vec<TypeParameter>,
|
type_params: Vec<TypeParameter>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +422,7 @@ fn find_type_parameters(
|
||||||
let mut visitor = Visitor {
|
let mut visitor = Visitor {
|
||||||
cx,
|
cx,
|
||||||
ty_param_names,
|
ty_param_names,
|
||||||
bound_generic_params_stack: Vec::new(),
|
bound_generic_params_stack: ThinVec::new(),
|
||||||
type_params: Vec::new(),
|
type_params: Vec::new(),
|
||||||
};
|
};
|
||||||
visit::Visitor::visit_ty(&mut visitor, ty);
|
visit::Visitor::visit_ty(&mut visitor, ty);
|
||||||
|
@ -594,7 +594,7 @@ impl<'a> TraitDef<'a> {
|
||||||
let span = generics.span.with_ctxt(ctxt);
|
let span = generics.span.with_ctxt(ctxt);
|
||||||
|
|
||||||
// Create the generic parameters
|
// Create the generic parameters
|
||||||
let params: Vec<_> = generics
|
let params: ThinVec<_> = generics
|
||||||
.params
|
.params
|
||||||
.iter()
|
.iter()
|
||||||
.map(|param| match ¶m.kind {
|
.map(|param| match ¶m.kind {
|
||||||
|
|
|
@ -125,7 +125,7 @@ impl<'a> ExtCtxt<'a> {
|
||||||
|
|
||||||
pub fn poly_trait_ref(&self, span: Span, path: ast::Path) -> ast::PolyTraitRef {
|
pub fn poly_trait_ref(&self, span: Span, path: ast::Path) -> ast::PolyTraitRef {
|
||||||
ast::PolyTraitRef {
|
ast::PolyTraitRef {
|
||||||
bound_generic_params: Vec::new(),
|
bound_generic_params: ThinVec::new(),
|
||||||
trait_ref: self.trait_ref(path),
|
trait_ref: self.trait_ref(path),
|
||||||
span,
|
span,
|
||||||
}
|
}
|
||||||
|
|
|
@ -2095,7 +2095,7 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
self.sess.gated_spans.gate(sym::closure_lifetime_binder, span);
|
self.sess.gated_spans.gate(sym::closure_lifetime_binder, span);
|
||||||
|
|
||||||
ClosureBinder::For { span, generic_params: P::from_vec(lifetime_defs) }
|
ClosureBinder::For { span, generic_params: lifetime_defs }
|
||||||
} else {
|
} else {
|
||||||
ClosureBinder::NotPresent
|
ClosureBinder::NotPresent
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,6 +14,7 @@ use rustc_ast::{
|
||||||
use rustc_errors::{Applicability, PResult};
|
use rustc_errors::{Applicability, PResult};
|
||||||
use rustc_span::symbol::{kw, Ident};
|
use rustc_span::symbol::{kw, Ident};
|
||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
use thin_vec::ThinVec;
|
||||||
|
|
||||||
enum PredicateOrStructBody {
|
enum PredicateOrStructBody {
|
||||||
Predicate(ast::WherePredicate),
|
Predicate(ast::WherePredicate),
|
||||||
|
@ -121,8 +122,8 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
/// Parses a (possibly empty) list of lifetime and type parameters, possibly including
|
/// Parses a (possibly empty) list of lifetime and type parameters, possibly including
|
||||||
/// a trailing comma and erroneous trailing attributes.
|
/// a trailing comma and erroneous trailing attributes.
|
||||||
pub(super) fn parse_generic_params(&mut self) -> PResult<'a, Vec<ast::GenericParam>> {
|
pub(super) fn parse_generic_params(&mut self) -> PResult<'a, ThinVec<ast::GenericParam>> {
|
||||||
let mut params = Vec::new();
|
let mut params = ThinVec::new();
|
||||||
let mut done = false;
|
let mut done = false;
|
||||||
while !done {
|
while !done {
|
||||||
let attrs = self.parse_outer_attributes()?;
|
let attrs = self.parse_outer_attributes()?;
|
||||||
|
@ -251,7 +252,7 @@ impl<'a> Parser<'a> {
|
||||||
self.expect_gt()?;
|
self.expect_gt()?;
|
||||||
(params, span_lo.to(self.prev_token.span))
|
(params, span_lo.to(self.prev_token.span))
|
||||||
} else {
|
} else {
|
||||||
(vec![], self.prev_token.span.shrink_to_hi())
|
(ThinVec::new(), self.prev_token.span.shrink_to_hi())
|
||||||
};
|
};
|
||||||
Ok(ast::Generics {
|
Ok(ast::Generics {
|
||||||
params,
|
params,
|
||||||
|
|
|
@ -21,7 +21,7 @@ use rustc_errors::{Applicability, PResult};
|
||||||
use rustc_span::source_map::Span;
|
use rustc_span::source_map::Span;
|
||||||
use rustc_span::symbol::{kw, sym, Ident};
|
use rustc_span::symbol::{kw, sym, Ident};
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
use thin_vec::thin_vec;
|
use thin_vec::{thin_vec, ThinVec};
|
||||||
|
|
||||||
/// Any `?` or `~const` modifiers that appear at the start of a bound.
|
/// Any `?` or `~const` modifiers that appear at the start of a bound.
|
||||||
struct BoundModifiers {
|
struct BoundModifiers {
|
||||||
|
@ -273,7 +273,7 @@ impl<'a> Parser<'a> {
|
||||||
TyKind::Infer
|
TyKind::Infer
|
||||||
} else if self.check_fn_front_matter(false, Case::Sensitive) {
|
} else if self.check_fn_front_matter(false, Case::Sensitive) {
|
||||||
// Function pointer type
|
// Function pointer type
|
||||||
self.parse_ty_bare_fn(lo, Vec::new(), None, recover_return_sign)?
|
self.parse_ty_bare_fn(lo, ThinVec::new(), None, recover_return_sign)?
|
||||||
} else if self.check_keyword(kw::For) {
|
} else if self.check_keyword(kw::For) {
|
||||||
// Function pointer type or bound list (trait object type) starting with a poly-trait.
|
// Function pointer type or bound list (trait object type) starting with a poly-trait.
|
||||||
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
|
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
|
||||||
|
@ -352,7 +352,7 @@ impl<'a> Parser<'a> {
|
||||||
match ty.kind {
|
match ty.kind {
|
||||||
// `(TY_BOUND_NOPAREN) + BOUND + ...`.
|
// `(TY_BOUND_NOPAREN) + BOUND + ...`.
|
||||||
TyKind::Path(None, path) if maybe_bounds => {
|
TyKind::Path(None, path) if maybe_bounds => {
|
||||||
self.parse_remaining_bounds_path(Vec::new(), path, lo, true)
|
self.parse_remaining_bounds_path(ThinVec::new(), path, lo, true)
|
||||||
}
|
}
|
||||||
TyKind::TraitObject(bounds, TraitObjectSyntax::None)
|
TyKind::TraitObject(bounds, TraitObjectSyntax::None)
|
||||||
if maybe_bounds && bounds.len() == 1 && !trailing_plus =>
|
if maybe_bounds && bounds.len() == 1 && !trailing_plus =>
|
||||||
|
@ -378,7 +378,7 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
fn parse_remaining_bounds_path(
|
fn parse_remaining_bounds_path(
|
||||||
&mut self,
|
&mut self,
|
||||||
generic_params: Vec<GenericParam>,
|
generic_params: ThinVec<GenericParam>,
|
||||||
path: ast::Path,
|
path: ast::Path,
|
||||||
lo: Span,
|
lo: Span,
|
||||||
parse_plus: bool,
|
parse_plus: bool,
|
||||||
|
@ -511,7 +511,7 @@ impl<'a> Parser<'a> {
|
||||||
fn parse_ty_bare_fn(
|
fn parse_ty_bare_fn(
|
||||||
&mut self,
|
&mut self,
|
||||||
lo: Span,
|
lo: Span,
|
||||||
mut params: Vec<GenericParam>,
|
mut params: ThinVec<GenericParam>,
|
||||||
param_insertion_point: Option<Span>,
|
param_insertion_point: Option<Span>,
|
||||||
recover_return_sign: RecoverReturnSign,
|
recover_return_sign: RecoverReturnSign,
|
||||||
) -> PResult<'a, TyKind> {
|
) -> PResult<'a, TyKind> {
|
||||||
|
@ -545,13 +545,13 @@ impl<'a> Parser<'a> {
|
||||||
fn recover_fn_ptr_with_generics(
|
fn recover_fn_ptr_with_generics(
|
||||||
&mut self,
|
&mut self,
|
||||||
lo: Span,
|
lo: Span,
|
||||||
params: &mut Vec<GenericParam>,
|
params: &mut ThinVec<GenericParam>,
|
||||||
param_insertion_point: Option<Span>,
|
param_insertion_point: Option<Span>,
|
||||||
) -> PResult<'a, ()> {
|
) -> PResult<'a, ()> {
|
||||||
let generics = self.parse_generics()?;
|
let generics = self.parse_generics()?;
|
||||||
let arity = generics.params.len();
|
let arity = generics.params.len();
|
||||||
|
|
||||||
let mut lifetimes: Vec<_> = generics
|
let mut lifetimes: ThinVec<_> = generics
|
||||||
.params
|
.params
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter(|param| matches!(param.kind, ast::GenericParamKind::Lifetime))
|
.filter(|param| matches!(param.kind, ast::GenericParamKind::Lifetime))
|
||||||
|
@ -662,7 +662,7 @@ impl<'a> Parser<'a> {
|
||||||
})))
|
})))
|
||||||
} else if allow_plus == AllowPlus::Yes && self.check_plus() {
|
} else if allow_plus == AllowPlus::Yes && self.check_plus() {
|
||||||
// `Trait1 + Trait2 + 'a`
|
// `Trait1 + Trait2 + 'a`
|
||||||
self.parse_remaining_bounds_path(Vec::new(), path, lo, true)
|
self.parse_remaining_bounds_path(ThinVec::new(), path, lo, true)
|
||||||
} else {
|
} else {
|
||||||
// Just a type path.
|
// Just a type path.
|
||||||
Ok(TyKind::Path(None, path))
|
Ok(TyKind::Path(None, path))
|
||||||
|
@ -993,7 +993,7 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Optionally parses `for<$generic_params>`.
|
/// Optionally parses `for<$generic_params>`.
|
||||||
pub(super) fn parse_late_bound_lifetime_defs(&mut self) -> PResult<'a, Vec<GenericParam>> {
|
pub(super) fn parse_late_bound_lifetime_defs(&mut self) -> PResult<'a, ThinVec<GenericParam>> {
|
||||||
if self.eat_keyword(kw::For) {
|
if self.eat_keyword(kw::For) {
|
||||||
self.expect_lt()?;
|
self.expect_lt()?;
|
||||||
let params = self.parse_generic_params()?;
|
let params = self.parse_generic_params()?;
|
||||||
|
@ -1002,7 +1002,7 @@ impl<'a> Parser<'a> {
|
||||||
// parameters, and the lifetime parameters must not have bounds.
|
// parameters, and the lifetime parameters must not have bounds.
|
||||||
Ok(params)
|
Ok(params)
|
||||||
} else {
|
} else {
|
||||||
Ok(Vec::new())
|
Ok(ThinVec::new())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1012,7 +1012,7 @@ impl<'a> Parser<'a> {
|
||||||
fn recover_fn_trait_with_lifetime_params(
|
fn recover_fn_trait_with_lifetime_params(
|
||||||
&mut self,
|
&mut self,
|
||||||
fn_path: &mut ast::Path,
|
fn_path: &mut ast::Path,
|
||||||
lifetime_defs: &mut Vec<GenericParam>,
|
lifetime_defs: &mut ThinVec<GenericParam>,
|
||||||
) -> PResult<'a, ()> {
|
) -> PResult<'a, ()> {
|
||||||
let fn_path_segment = fn_path.segments.last_mut().unwrap();
|
let fn_path_segment = fn_path.segments.last_mut().unwrap();
|
||||||
let generic_args = if let Some(p_args) = &fn_path_segment.args {
|
let generic_args = if let Some(p_args) = &fn_path_segment.args {
|
||||||
|
@ -1072,7 +1072,7 @@ impl<'a> Parser<'a> {
|
||||||
kind: ast::GenericParamKind::Lifetime,
|
kind: ast::GenericParamKind::Lifetime,
|
||||||
colon_span: None,
|
colon_span: None,
|
||||||
})
|
})
|
||||||
.collect::<Vec<GenericParam>>();
|
.collect::<ThinVec<GenericParam>>();
|
||||||
lifetime_defs.append(&mut generic_params);
|
lifetime_defs.append(&mut generic_params);
|
||||||
|
|
||||||
let generic_args_span = generic_args.span();
|
let generic_args_span = generic_args.span();
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
ast-stats-1 PRE EXPANSION AST STATS
|
ast-stats-1 PRE EXPANSION AST STATS
|
||||||
ast-stats-1 Name Accumulated Size Count Item Size
|
ast-stats-1 Name Accumulated Size Count Item Size
|
||||||
ast-stats-1 ----------------------------------------------------------------
|
ast-stats-1 ----------------------------------------------------------------
|
||||||
ast-stats-1 ExprField 48 ( 0.6%) 1 48
|
ast-stats-1 ExprField 48 ( 0.7%) 1 48
|
||||||
|
ast-stats-1 WherePredicate 56 ( 0.8%) 1 56
|
||||||
|
ast-stats-1 - BoundPredicate 56 ( 0.8%) 1
|
||||||
ast-stats-1 GenericArgs 56 ( 0.8%) 1 56
|
ast-stats-1 GenericArgs 56 ( 0.8%) 1 56
|
||||||
ast-stats-1 - AngleBracketed 56 ( 0.8%) 1
|
ast-stats-1 - AngleBracketed 56 ( 0.8%) 1
|
||||||
ast-stats-1 Crate 56 ( 0.8%) 1 56
|
ast-stats-1 Crate 56 ( 0.8%) 1 56
|
||||||
|
@ -9,8 +11,6 @@ ast-stats-1 Attribute 64 ( 0.9%) 2 32
|
||||||
ast-stats-1 - Normal 32 ( 0.4%) 1
|
ast-stats-1 - Normal 32 ( 0.4%) 1
|
||||||
ast-stats-1 - DocComment 32 ( 0.4%) 1
|
ast-stats-1 - DocComment 32 ( 0.4%) 1
|
||||||
ast-stats-1 Local 72 ( 1.0%) 1 72
|
ast-stats-1 Local 72 ( 1.0%) 1 72
|
||||||
ast-stats-1 WherePredicate 72 ( 1.0%) 1 72
|
|
||||||
ast-stats-1 - BoundPredicate 72 ( 1.0%) 1
|
|
||||||
ast-stats-1 Arm 96 ( 1.3%) 2 48
|
ast-stats-1 Arm 96 ( 1.3%) 2 48
|
||||||
ast-stats-1 ForeignItem 96 ( 1.3%) 1 96
|
ast-stats-1 ForeignItem 96 ( 1.3%) 1 96
|
||||||
ast-stats-1 - Fn 96 ( 1.3%) 1
|
ast-stats-1 - Fn 96 ( 1.3%) 1
|
||||||
|
@ -20,51 +20,51 @@ ast-stats-1 - Local 32 ( 0.4%) 1
|
||||||
ast-stats-1 - MacCall 32 ( 0.4%) 1
|
ast-stats-1 - MacCall 32 ( 0.4%) 1
|
||||||
ast-stats-1 - Expr 96 ( 1.3%) 3
|
ast-stats-1 - Expr 96 ( 1.3%) 3
|
||||||
ast-stats-1 Param 160 ( 2.2%) 4 40
|
ast-stats-1 Param 160 ( 2.2%) 4 40
|
||||||
ast-stats-1 FnDecl 200 ( 2.7%) 5 40
|
ast-stats-1 FnDecl 200 ( 2.8%) 5 40
|
||||||
ast-stats-1 Variant 240 ( 3.2%) 2 120
|
ast-stats-1 GenericBound 224 ( 3.1%) 4 56
|
||||||
ast-stats-1 GenericBound 288 ( 3.9%) 4 72
|
ast-stats-1 - Trait 224 ( 3.1%) 4
|
||||||
ast-stats-1 - Trait 288 ( 3.9%) 4
|
ast-stats-1 Variant 240 ( 3.3%) 2 120
|
||||||
ast-stats-1 Block 288 ( 3.9%) 6 48
|
ast-stats-1 Block 288 ( 4.0%) 6 48
|
||||||
ast-stats-1 AssocItem 416 ( 5.6%) 4 104
|
ast-stats-1 AssocItem 416 ( 5.8%) 4 104
|
||||||
ast-stats-1 - Type 208 ( 2.8%) 2
|
ast-stats-1 - Type 208 ( 2.9%) 2
|
||||||
ast-stats-1 - Fn 208 ( 2.8%) 2
|
ast-stats-1 - Fn 208 ( 2.9%) 2
|
||||||
ast-stats-1 GenericParam 480 ( 6.5%) 5 96
|
ast-stats-1 GenericParam 480 ( 6.7%) 5 96
|
||||||
ast-stats-1 Expr 576 ( 7.8%) 8 72
|
ast-stats-1 Expr 576 ( 8.0%) 8 72
|
||||||
ast-stats-1 - Path 72 ( 1.0%) 1
|
ast-stats-1 - Path 72 ( 1.0%) 1
|
||||||
ast-stats-1 - Match 72 ( 1.0%) 1
|
ast-stats-1 - Match 72 ( 1.0%) 1
|
||||||
ast-stats-1 - Struct 72 ( 1.0%) 1
|
ast-stats-1 - Struct 72 ( 1.0%) 1
|
||||||
ast-stats-1 - Lit 144 ( 1.9%) 2
|
ast-stats-1 - Lit 144 ( 2.0%) 2
|
||||||
ast-stats-1 - Block 216 ( 2.9%) 3
|
ast-stats-1 - Block 216 ( 3.0%) 3
|
||||||
ast-stats-1 Pat 616 ( 8.3%) 7 88
|
ast-stats-1 Pat 616 ( 8.6%) 7 88
|
||||||
ast-stats-1 - Struct 88 ( 1.2%) 1
|
ast-stats-1 - Struct 88 ( 1.2%) 1
|
||||||
ast-stats-1 - Wild 88 ( 1.2%) 1
|
ast-stats-1 - Wild 88 ( 1.2%) 1
|
||||||
ast-stats-1 - Ident 440 ( 5.9%) 5
|
ast-stats-1 - Ident 440 ( 6.1%) 5
|
||||||
ast-stats-1 PathSegment 720 ( 9.7%) 30 24
|
ast-stats-1 PathSegment 720 (10.0%) 30 24
|
||||||
ast-stats-1 Ty 896 (12.1%) 14 64
|
ast-stats-1 Ty 896 (12.5%) 14 64
|
||||||
ast-stats-1 - Ptr 64 ( 0.9%) 1
|
ast-stats-1 - Ptr 64 ( 0.9%) 1
|
||||||
ast-stats-1 - Ref 64 ( 0.9%) 1
|
ast-stats-1 - Ref 64 ( 0.9%) 1
|
||||||
ast-stats-1 - ImplicitSelf 128 ( 1.7%) 2
|
ast-stats-1 - ImplicitSelf 128 ( 1.8%) 2
|
||||||
ast-stats-1 - Path 640 ( 8.6%) 10
|
ast-stats-1 - Path 640 ( 8.9%) 10
|
||||||
ast-stats-1 Item 1_656 (22.3%) 9 184
|
ast-stats-1 Item 1_512 (21.0%) 9 168
|
||||||
ast-stats-1 - Trait 184 ( 2.5%) 1
|
ast-stats-1 - Trait 168 ( 2.3%) 1
|
||||||
ast-stats-1 - Enum 184 ( 2.5%) 1
|
ast-stats-1 - Enum 168 ( 2.3%) 1
|
||||||
ast-stats-1 - ForeignMod 184 ( 2.5%) 1
|
ast-stats-1 - ForeignMod 168 ( 2.3%) 1
|
||||||
ast-stats-1 - Impl 184 ( 2.5%) 1
|
ast-stats-1 - Impl 168 ( 2.3%) 1
|
||||||
ast-stats-1 - Fn 368 ( 5.0%) 2
|
ast-stats-1 - Fn 336 ( 4.7%) 2
|
||||||
ast-stats-1 - Use 552 ( 7.4%) 3
|
ast-stats-1 - Use 504 ( 7.0%) 3
|
||||||
ast-stats-1 ----------------------------------------------------------------
|
ast-stats-1 ----------------------------------------------------------------
|
||||||
ast-stats-1 Total 7_416
|
ast-stats-1 Total 7_192
|
||||||
ast-stats-1
|
ast-stats-1
|
||||||
ast-stats-2 POST EXPANSION AST STATS
|
ast-stats-2 POST EXPANSION AST STATS
|
||||||
ast-stats-2 Name Accumulated Size Count Item Size
|
ast-stats-2 Name Accumulated Size Count Item Size
|
||||||
ast-stats-2 ----------------------------------------------------------------
|
ast-stats-2 ----------------------------------------------------------------
|
||||||
ast-stats-2 ExprField 48 ( 0.6%) 1 48
|
ast-stats-2 ExprField 48 ( 0.6%) 1 48
|
||||||
|
ast-stats-2 WherePredicate 56 ( 0.7%) 1 56
|
||||||
|
ast-stats-2 - BoundPredicate 56 ( 0.7%) 1
|
||||||
ast-stats-2 GenericArgs 56 ( 0.7%) 1 56
|
ast-stats-2 GenericArgs 56 ( 0.7%) 1 56
|
||||||
ast-stats-2 - AngleBracketed 56 ( 0.7%) 1
|
ast-stats-2 - AngleBracketed 56 ( 0.7%) 1
|
||||||
ast-stats-2 Crate 56 ( 0.7%) 1 56
|
ast-stats-2 Crate 56 ( 0.7%) 1 56
|
||||||
ast-stats-2 Local 72 ( 0.9%) 1 72
|
ast-stats-2 Local 72 ( 0.9%) 1 72
|
||||||
ast-stats-2 WherePredicate 72 ( 0.9%) 1 72
|
|
||||||
ast-stats-2 - BoundPredicate 72 ( 0.9%) 1
|
|
||||||
ast-stats-2 Arm 96 ( 1.2%) 2 48
|
ast-stats-2 Arm 96 ( 1.2%) 2 48
|
||||||
ast-stats-2 ForeignItem 96 ( 1.2%) 1 96
|
ast-stats-2 ForeignItem 96 ( 1.2%) 1 96
|
||||||
ast-stats-2 - Fn 96 ( 1.2%) 1
|
ast-stats-2 - Fn 96 ( 1.2%) 1
|
||||||
|
@ -79,41 +79,41 @@ ast-stats-2 - Semi 32 ( 0.4%) 1
|
||||||
ast-stats-2 - Expr 96 ( 1.2%) 3
|
ast-stats-2 - Expr 96 ( 1.2%) 3
|
||||||
ast-stats-2 Param 160 ( 2.0%) 4 40
|
ast-stats-2 Param 160 ( 2.0%) 4 40
|
||||||
ast-stats-2 FnDecl 200 ( 2.5%) 5 40
|
ast-stats-2 FnDecl 200 ( 2.5%) 5 40
|
||||||
ast-stats-2 Variant 240 ( 3.0%) 2 120
|
ast-stats-2 GenericBound 224 ( 2.9%) 4 56
|
||||||
ast-stats-2 GenericBound 288 ( 3.6%) 4 72
|
ast-stats-2 - Trait 224 ( 2.9%) 4
|
||||||
ast-stats-2 - Trait 288 ( 3.6%) 4
|
ast-stats-2 Variant 240 ( 3.1%) 2 120
|
||||||
ast-stats-2 Block 288 ( 3.6%) 6 48
|
ast-stats-2 Block 288 ( 3.7%) 6 48
|
||||||
ast-stats-2 AssocItem 416 ( 5.1%) 4 104
|
ast-stats-2 AssocItem 416 ( 5.3%) 4 104
|
||||||
ast-stats-2 - Type 208 ( 2.6%) 2
|
ast-stats-2 - Type 208 ( 2.6%) 2
|
||||||
ast-stats-2 - Fn 208 ( 2.6%) 2
|
ast-stats-2 - Fn 208 ( 2.6%) 2
|
||||||
ast-stats-2 GenericParam 480 ( 5.9%) 5 96
|
ast-stats-2 GenericParam 480 ( 6.1%) 5 96
|
||||||
ast-stats-2 Pat 616 ( 7.6%) 7 88
|
ast-stats-2 Pat 616 ( 7.8%) 7 88
|
||||||
ast-stats-2 - Struct 88 ( 1.1%) 1
|
ast-stats-2 - Struct 88 ( 1.1%) 1
|
||||||
ast-stats-2 - Wild 88 ( 1.1%) 1
|
ast-stats-2 - Wild 88 ( 1.1%) 1
|
||||||
ast-stats-2 - Ident 440 ( 5.4%) 5
|
ast-stats-2 - Ident 440 ( 5.6%) 5
|
||||||
ast-stats-2 Expr 648 ( 8.0%) 9 72
|
ast-stats-2 Expr 648 ( 8.2%) 9 72
|
||||||
ast-stats-2 - Path 72 ( 0.9%) 1
|
ast-stats-2 - Path 72 ( 0.9%) 1
|
||||||
ast-stats-2 - Match 72 ( 0.9%) 1
|
ast-stats-2 - Match 72 ( 0.9%) 1
|
||||||
ast-stats-2 - Struct 72 ( 0.9%) 1
|
ast-stats-2 - Struct 72 ( 0.9%) 1
|
||||||
ast-stats-2 - InlineAsm 72 ( 0.9%) 1
|
ast-stats-2 - InlineAsm 72 ( 0.9%) 1
|
||||||
ast-stats-2 - Lit 144 ( 1.8%) 2
|
ast-stats-2 - Lit 144 ( 1.8%) 2
|
||||||
ast-stats-2 - Block 216 ( 2.7%) 3
|
ast-stats-2 - Block 216 ( 2.7%) 3
|
||||||
ast-stats-2 PathSegment 792 ( 9.8%) 33 24
|
ast-stats-2 PathSegment 792 (10.1%) 33 24
|
||||||
ast-stats-2 Ty 896 (11.0%) 14 64
|
ast-stats-2 Ty 896 (11.4%) 14 64
|
||||||
ast-stats-2 - Ptr 64 ( 0.8%) 1
|
ast-stats-2 - Ptr 64 ( 0.8%) 1
|
||||||
ast-stats-2 - Ref 64 ( 0.8%) 1
|
ast-stats-2 - Ref 64 ( 0.8%) 1
|
||||||
ast-stats-2 - ImplicitSelf 128 ( 1.6%) 2
|
ast-stats-2 - ImplicitSelf 128 ( 1.6%) 2
|
||||||
ast-stats-2 - Path 640 ( 7.9%) 10
|
ast-stats-2 - Path 640 ( 8.1%) 10
|
||||||
ast-stats-2 Item 2_024 (25.0%) 11 184
|
ast-stats-2 Item 1_848 (23.5%) 11 168
|
||||||
ast-stats-2 - Trait 184 ( 2.3%) 1
|
ast-stats-2 - Trait 168 ( 2.1%) 1
|
||||||
ast-stats-2 - Enum 184 ( 2.3%) 1
|
ast-stats-2 - Enum 168 ( 2.1%) 1
|
||||||
ast-stats-2 - ExternCrate 184 ( 2.3%) 1
|
ast-stats-2 - ExternCrate 168 ( 2.1%) 1
|
||||||
ast-stats-2 - ForeignMod 184 ( 2.3%) 1
|
ast-stats-2 - ForeignMod 168 ( 2.1%) 1
|
||||||
ast-stats-2 - Impl 184 ( 2.3%) 1
|
ast-stats-2 - Impl 168 ( 2.1%) 1
|
||||||
ast-stats-2 - Fn 368 ( 4.5%) 2
|
ast-stats-2 - Fn 336 ( 4.3%) 2
|
||||||
ast-stats-2 - Use 736 ( 9.1%) 4
|
ast-stats-2 - Use 672 ( 8.6%) 4
|
||||||
ast-stats-2 ----------------------------------------------------------------
|
ast-stats-2 ----------------------------------------------------------------
|
||||||
ast-stats-2 Total 8_112
|
ast-stats-2 Total 7_856
|
||||||
ast-stats-2
|
ast-stats-2
|
||||||
hir-stats HIR STATS
|
hir-stats HIR STATS
|
||||||
hir-stats Name Accumulated Size Count Item Size
|
hir-stats Name Accumulated Size Count Item Size
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue