Use ThinVec
in various AST types.
This commit changes the sequence parsers to produce `ThinVec`, which triggers numerous conversions.
This commit is contained in:
parent
6a56c3a930
commit
4143b101f9
52 changed files with 355 additions and 292 deletions
|
@ -6,6 +6,9 @@ use rustc_ast::attr;
|
|||
use rustc_ast::token::{self, Delimiter, Nonterminal};
|
||||
use rustc_errors::{error_code, fluent, Diagnostic, IntoDiagnostic, PResult};
|
||||
use rustc_span::{sym, BytePos, Span};
|
||||
use std::convert::TryInto;
|
||||
use thin_vec::ThinVec;
|
||||
use tracing::debug;
|
||||
|
||||
// Public for rustfmt usage
|
||||
#[derive(Debug)]
|
||||
|
@ -346,9 +349,9 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
/// Matches `COMMASEP(meta_item_inner)`.
|
||||
pub(crate) fn parse_meta_seq_top(&mut self) -> PResult<'a, Vec<ast::NestedMetaItem>> {
|
||||
pub(crate) fn parse_meta_seq_top(&mut self) -> PResult<'a, ThinVec<ast::NestedMetaItem>> {
|
||||
// Presumably, the majority of the time there will only be one attr.
|
||||
let mut nmis = Vec::with_capacity(1);
|
||||
let mut nmis = ThinVec::with_capacity(1);
|
||||
while self.token.kind != token::Eof {
|
||||
nmis.push(self.parse_meta_item_inner()?);
|
||||
if !self.eat(&token::Comma) {
|
||||
|
|
|
@ -2175,7 +2175,7 @@ impl<'a> Parser<'a> {
|
|||
/// the parameters are *names* (so we don't emit errors about not being able to find `b` in
|
||||
/// the local scope), but if we find the same name multiple times, like in `fn foo(i8, i8)`,
|
||||
/// we deduplicate them to not complain about duplicated parameter names.
|
||||
pub(super) fn deduplicate_recovered_params_names(&self, fn_inputs: &mut Vec<Param>) {
|
||||
pub(super) fn deduplicate_recovered_params_names(&self, fn_inputs: &mut ThinVec<Param>) {
|
||||
let mut seen_inputs = FxHashSet::default();
|
||||
for input in fn_inputs.iter_mut() {
|
||||
let opt_ident = if let (PatKind::Ident(_, ident, _), TyKind::Err) =
|
||||
|
|
|
@ -31,6 +31,7 @@ use rustc_session::lint::BuiltinLintDiagnostics;
|
|||
use rustc_span::source_map::{self, Span, Spanned};
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use rustc_span::{BytePos, Pos};
|
||||
use thin_vec::{thin_vec, ThinVec};
|
||||
|
||||
/// Possibly accepts an `token::Interpolated` expression (a pre-parsed expression
|
||||
/// dropped into the token stream, which happens while parsing the result of
|
||||
|
@ -124,7 +125,7 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
/// Parses a sequence of expressions delimited by parentheses.
|
||||
fn parse_paren_expr_seq(&mut self) -> PResult<'a, Vec<P<Expr>>> {
|
||||
fn parse_paren_expr_seq(&mut self) -> PResult<'a, ThinVec<P<Expr>>> {
|
||||
self.parse_paren_comma_seq(|p| p.parse_expr_catch_underscore()).map(|(r, _)| r)
|
||||
}
|
||||
|
||||
|
@ -1450,7 +1451,7 @@ impl<'a> Parser<'a> {
|
|||
let close = &token::CloseDelim(close_delim);
|
||||
let kind = if self.eat(close) {
|
||||
// Empty vector
|
||||
ExprKind::Array(Vec::new())
|
||||
ExprKind::Array(ThinVec::new())
|
||||
} else {
|
||||
// Non-empty vector
|
||||
let first_expr = self.parse_expr()?;
|
||||
|
@ -1468,7 +1469,7 @@ impl<'a> Parser<'a> {
|
|||
} else {
|
||||
// Vector with one element
|
||||
self.expect(close)?;
|
||||
ExprKind::Array(vec![first_expr])
|
||||
ExprKind::Array(thin_vec![first_expr])
|
||||
}
|
||||
};
|
||||
let expr = self.mk_expr(lo.to(self.prev_token.span), kind);
|
||||
|
@ -2187,7 +2188,7 @@ impl<'a> Parser<'a> {
|
|||
let arg_start = self.token.span.lo();
|
||||
|
||||
let inputs = if self.eat(&token::OrOr) {
|
||||
Vec::new()
|
||||
ThinVec::new()
|
||||
} else {
|
||||
self.expect(&token::BinOp(token::Or))?;
|
||||
let args = self
|
||||
|
@ -3211,7 +3212,7 @@ impl<'a> Parser<'a> {
|
|||
ExprKind::Index(expr, idx)
|
||||
}
|
||||
|
||||
fn mk_call(&self, f: P<Expr>, args: Vec<P<Expr>>) -> ExprKind {
|
||||
fn mk_call(&self, f: P<Expr>, args: ThinVec<P<Expr>>) -> ExprKind {
|
||||
ExprKind::Call(f, args)
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ use thin_vec::ThinVec;
|
|||
|
||||
enum PredicateOrStructBody {
|
||||
Predicate(ast::WherePredicate),
|
||||
StructBody(Vec<ast::FieldDef>),
|
||||
StructBody(ThinVec<ast::FieldDef>),
|
||||
}
|
||||
|
||||
impl<'a> Parser<'a> {
|
||||
|
@ -278,14 +278,14 @@ impl<'a> Parser<'a> {
|
|||
&mut self,
|
||||
struct_name: Ident,
|
||||
body_insertion_point: Span,
|
||||
) -> PResult<'a, (WhereClause, Option<Vec<ast::FieldDef>>)> {
|
||||
) -> PResult<'a, (WhereClause, Option<ThinVec<ast::FieldDef>>)> {
|
||||
self.parse_where_clause_common(Some((struct_name, body_insertion_point)))
|
||||
}
|
||||
|
||||
fn parse_where_clause_common(
|
||||
&mut self,
|
||||
struct_: Option<(Ident, Span)>,
|
||||
) -> PResult<'a, (WhereClause, Option<Vec<ast::FieldDef>>)> {
|
||||
) -> PResult<'a, (WhereClause, Option<ThinVec<ast::FieldDef>>)> {
|
||||
let mut where_clause = WhereClause {
|
||||
has_where_token: false,
|
||||
predicates: ThinVec::new(),
|
||||
|
|
|
@ -26,7 +26,7 @@ use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
|||
use rustc_span::DUMMY_SP;
|
||||
use std::fmt::Write;
|
||||
use std::mem;
|
||||
use thin_vec::ThinVec;
|
||||
use thin_vec::{thin_vec, ThinVec};
|
||||
|
||||
impl<'a> Parser<'a> {
|
||||
/// Parses a source module as a crate. This is the main entry point for the parser.
|
||||
|
@ -997,7 +997,7 @@ impl<'a> Parser<'a> {
|
|||
/// ```text
|
||||
/// USE_TREE_LIST = Ø | (USE_TREE `,`)* USE_TREE [`,`]
|
||||
/// ```
|
||||
fn parse_use_tree_list(&mut self) -> PResult<'a, Vec<(UseTree, ast::NodeId)>> {
|
||||
fn parse_use_tree_list(&mut self) -> PResult<'a, ThinVec<(UseTree, ast::NodeId)>> {
|
||||
self.parse_delim_comma_seq(Delimiter::Brace, |p| {
|
||||
p.recover_diff_marker();
|
||||
Ok((p.parse_use_tree()?, DUMMY_NODE_ID))
|
||||
|
@ -1288,7 +1288,7 @@ impl<'a> Parser<'a> {
|
|||
let (variants, _) = if self.token == TokenKind::Semi {
|
||||
self.sess.emit_err(errors::UseEmptyBlockNotSemi { span: self.token.span });
|
||||
self.bump();
|
||||
(vec![], false)
|
||||
(thin_vec![], false)
|
||||
} else {
|
||||
self.parse_delim_comma_seq(Delimiter::Brace, |p| p.parse_enum_variant()).map_err(
|
||||
|mut e| {
|
||||
|
@ -1457,8 +1457,8 @@ impl<'a> Parser<'a> {
|
|||
adt_ty: &str,
|
||||
ident_span: Span,
|
||||
parsed_where: bool,
|
||||
) -> PResult<'a, (Vec<FieldDef>, /* recovered */ bool)> {
|
||||
let mut fields = Vec::new();
|
||||
) -> PResult<'a, (ThinVec<FieldDef>, /* recovered */ bool)> {
|
||||
let mut fields = ThinVec::new();
|
||||
let mut recovered = false;
|
||||
if self.eat(&token::OpenDelim(Delimiter::Brace)) {
|
||||
while self.token != token::CloseDelim(Delimiter::Brace) {
|
||||
|
@ -1498,7 +1498,7 @@ impl<'a> Parser<'a> {
|
|||
Ok((fields, recovered))
|
||||
}
|
||||
|
||||
pub(super) fn parse_tuple_struct_body(&mut self) -> PResult<'a, Vec<FieldDef>> {
|
||||
pub(super) fn parse_tuple_struct_body(&mut self) -> PResult<'a, ThinVec<FieldDef>> {
|
||||
// This is the case where we find `struct Foo<T>(T) where T: Copy;`
|
||||
// Unit like structs are handled in parse_item_struct function
|
||||
self.parse_paren_comma_seq(|p| {
|
||||
|
@ -2374,7 +2374,7 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
|
||||
/// Parses the parameter list of a function, including the `(` and `)` delimiters.
|
||||
pub(super) fn parse_fn_params(&mut self, req_name: ReqName) -> PResult<'a, Vec<Param>> {
|
||||
pub(super) fn parse_fn_params(&mut self, req_name: ReqName) -> PResult<'a, ThinVec<Param>> {
|
||||
let mut first_param = true;
|
||||
// Parse the arguments, starting out with `self` being allowed...
|
||||
let (mut params, _) = self.parse_paren_comma_seq(|p| {
|
||||
|
|
|
@ -36,9 +36,10 @@ use rustc_errors::{
|
|||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::source_map::{Span, DUMMY_SP};
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
|
||||
use std::ops::Range;
|
||||
use std::{cmp, mem, slice};
|
||||
use thin_vec::ThinVec;
|
||||
use tracing::debug;
|
||||
|
||||
use crate::errors::{
|
||||
DocCommentDoesNotDocumentAnything, IncorrectVisibilityRestriction, MismatchedClosingDelimiter,
|
||||
|
@ -853,11 +854,11 @@ impl<'a> Parser<'a> {
|
|||
sep: SeqSep,
|
||||
expect: TokenExpectType,
|
||||
mut f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> PResult<'a, (Vec<T>, bool /* trailing */, bool /* recovered */)> {
|
||||
) -> PResult<'a, (ThinVec<T>, bool /* trailing */, bool /* recovered */)> {
|
||||
let mut first = true;
|
||||
let mut recovered = false;
|
||||
let mut trailing = false;
|
||||
let mut v = vec![];
|
||||
let mut v = ThinVec::new();
|
||||
let unclosed_delims = !self.unclosed_delims.is_empty();
|
||||
|
||||
while !self.expect_any_with_type(kets, expect) {
|
||||
|
@ -1037,7 +1038,7 @@ impl<'a> Parser<'a> {
|
|||
ket: &TokenKind,
|
||||
sep: SeqSep,
|
||||
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> PResult<'a, (Vec<T>, bool, bool)> {
|
||||
) -> PResult<'a, (ThinVec<T>, bool, bool)> {
|
||||
self.parse_seq_to_before_tokens(&[ket], sep, TokenExpectType::Expect, f)
|
||||
}
|
||||
|
||||
|
@ -1049,7 +1050,7 @@ impl<'a> Parser<'a> {
|
|||
ket: &TokenKind,
|
||||
sep: SeqSep,
|
||||
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> PResult<'a, (Vec<T>, bool /* trailing */)> {
|
||||
) -> PResult<'a, (ThinVec<T>, bool /* trailing */)> {
|
||||
let (val, trailing, recovered) = self.parse_seq_to_before_end(ket, sep, f)?;
|
||||
if !recovered {
|
||||
self.eat(ket);
|
||||
|
@ -1066,7 +1067,7 @@ impl<'a> Parser<'a> {
|
|||
ket: &TokenKind,
|
||||
sep: SeqSep,
|
||||
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> PResult<'a, (Vec<T>, bool)> {
|
||||
) -> PResult<'a, (ThinVec<T>, bool)> {
|
||||
self.expect(bra)?;
|
||||
self.parse_seq_to_end(ket, sep, f)
|
||||
}
|
||||
|
@ -1075,7 +1076,7 @@ impl<'a> Parser<'a> {
|
|||
&mut self,
|
||||
delim: Delimiter,
|
||||
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> PResult<'a, (Vec<T>, bool)> {
|
||||
) -> PResult<'a, (ThinVec<T>, bool)> {
|
||||
self.parse_unspanned_seq(
|
||||
&token::OpenDelim(delim),
|
||||
&token::CloseDelim(delim),
|
||||
|
@ -1087,7 +1088,7 @@ impl<'a> Parser<'a> {
|
|||
fn parse_paren_comma_seq<T>(
|
||||
&mut self,
|
||||
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> PResult<'a, (Vec<T>, bool)> {
|
||||
) -> PResult<'a, (ThinVec<T>, bool)> {
|
||||
self.parse_delim_comma_seq(Delimiter::Parenthesis, f)
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ use rustc_errors::{
|
|||
use rustc_session::errors::ExprParenthesesNeeded;
|
||||
use rustc_span::source_map::{respan, Span, Spanned};
|
||||
use rustc_span::symbol::{kw, sym, Ident};
|
||||
use thin_vec::thin_vec;
|
||||
|
||||
#[derive(PartialEq, Copy, Clone)]
|
||||
pub enum Expected {
|
||||
|
@ -155,7 +156,7 @@ impl<'a> Parser<'a> {
|
|||
// If there was a leading vert, treat this as an or-pattern. This improves
|
||||
// diagnostics.
|
||||
let span = leading_vert_span.to(self.prev_token.span);
|
||||
return Ok((self.mk_pat(span, PatKind::Or(vec![first_pat])), trailing_vert));
|
||||
return Ok((self.mk_pat(span, PatKind::Or(thin_vec![first_pat])), trailing_vert));
|
||||
}
|
||||
|
||||
return Ok((first_pat, trailing_vert));
|
||||
|
@ -163,7 +164,7 @@ impl<'a> Parser<'a> {
|
|||
|
||||
// Parse the patterns `p_1 | ... | p_n` where `n > 0`.
|
||||
let lo = leading_vert_span.unwrap_or(first_pat.span);
|
||||
let mut pats = vec![first_pat];
|
||||
let mut pats = thin_vec![first_pat];
|
||||
loop {
|
||||
match self.eat_or_separator(Some(lo)) {
|
||||
EatOrResult::AteOr => {}
|
||||
|
|
|
@ -1046,7 +1046,7 @@ impl<'a> Parser<'a> {
|
|||
|
||||
// Parse `(T, U) -> R`.
|
||||
let inputs_lo = self.token.span;
|
||||
let inputs: Vec<_> =
|
||||
let inputs: ThinVec<_> =
|
||||
self.parse_fn_params(|_| false)?.into_iter().map(|input| input.ty).collect();
|
||||
let inputs_span = inputs_lo.to(self.prev_token.span);
|
||||
let output = self.parse_ret_ty(AllowPlus::No, RecoverQPath::No, RecoverReturnSign::No)?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue