Use AttrVec
in more places.
In some places we use `Vec<Attribute>` and some places we use `ThinVec<Attribute>` (a.k.a. `AttrVec`). This results in various points where we have to convert between `Vec` and `ThinVec`. This commit changes the places that use `Vec<Attribute>` to use `AttrVec`. A lot of this is mechanical and boring, but there are some interesting parts: - It adds a few new methods to `ThinVec`. - It implements `MapInPlace` for `ThinVec`, and introduces a macro to avoid the repetition of this trait for `Vec`, `SmallVec`, and `ThinVec`. Overall, it makes the code a little nicer, and has little effect on performance. But it is a precursor to removing `rustc_data_structures::thin_vec::ThinVec` and replacing it with `thin_vec::ThinVec`, which is implemented more efficiently.
This commit is contained in:
parent
650bff80a6
commit
619b8abaa6
49 changed files with 352 additions and 392 deletions
|
@ -6,7 +6,6 @@ use rustc_ast::attr;
|
|||
use rustc_ast::ptr::P as AstP;
|
||||
use rustc_ast::*;
|
||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_data_structures::thin_vec::ThinVec;
|
||||
use rustc_errors::struct_span_err;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::Res;
|
||||
|
@ -448,12 +447,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let lowered_cond = self.with_loop_condition_scope(|t| t.lower_expr(cond));
|
||||
let new_cond = self.manage_let_cond(lowered_cond);
|
||||
let then = self.lower_block_expr(body);
|
||||
let expr_break = self.expr_break(span, ThinVec::new());
|
||||
let expr_break = self.expr_break(span, AttrVec::new());
|
||||
let stmt_break = self.stmt_expr(span, expr_break);
|
||||
let else_blk = self.block_all(span, arena_vec![self; stmt_break], None);
|
||||
let else_expr = self.arena.alloc(self.expr_block(else_blk, ThinVec::new()));
|
||||
let else_expr = self.arena.alloc(self.expr_block(else_blk, AttrVec::new()));
|
||||
let if_kind = hir::ExprKind::If(new_cond, self.arena.alloc(then), Some(else_expr));
|
||||
let if_expr = self.expr(span, if_kind, ThinVec::new());
|
||||
let if_expr = self.expr(span, if_kind, AttrVec::new());
|
||||
let block = self.block_expr(self.arena.alloc(if_expr));
|
||||
let span = self.lower_span(span.with_hi(cond.span.hi()));
|
||||
let opt_label = self.lower_label(opt_label);
|
||||
|
@ -512,7 +511,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let constructor = self.arena.alloc(self.expr_lang_item_path(
|
||||
method_span,
|
||||
lang_item,
|
||||
ThinVec::new(),
|
||||
AttrVec::new(),
|
||||
None,
|
||||
));
|
||||
self.expr_call(overall_span, constructor, std::slice::from_ref(expr))
|
||||
|
@ -635,7 +634,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let gen_future = self.expr_lang_item_path(
|
||||
unstable_span,
|
||||
hir::LangItem::FromGenerator,
|
||||
ThinVec::new(),
|
||||
AttrVec::new(),
|
||||
None,
|
||||
);
|
||||
|
||||
|
@ -747,7 +746,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let break_x = self.with_loop_scope(loop_node_id, move |this| {
|
||||
let expr_break =
|
||||
hir::ExprKind::Break(this.lower_loop_destination(None), Some(x_expr));
|
||||
this.arena.alloc(this.expr(gen_future_span, expr_break, ThinVec::new()))
|
||||
this.arena.alloc(this.expr(gen_future_span, expr_break, AttrVec::new()))
|
||||
});
|
||||
self.arm(ready_pat, break_x)
|
||||
};
|
||||
|
@ -780,7 +779,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let yield_expr = self.expr(
|
||||
span,
|
||||
hir::ExprKind::Yield(unit, hir::YieldSource::Await { expr: Some(expr_hir_id) }),
|
||||
ThinVec::new(),
|
||||
AttrVec::new(),
|
||||
);
|
||||
let yield_expr = self.arena.alloc(yield_expr);
|
||||
|
||||
|
@ -987,7 +986,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
hir::AsyncGeneratorKind::Closure,
|
||||
|this| this.with_new_scopes(|this| this.lower_expr_mut(body)),
|
||||
);
|
||||
this.expr(fn_decl_span, async_body, ThinVec::new())
|
||||
this.expr(fn_decl_span, async_body, AttrVec::new())
|
||||
});
|
||||
body_id
|
||||
});
|
||||
|
@ -1257,7 +1256,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let ident = self.expr_ident(lhs.span, ident, binding);
|
||||
let assign =
|
||||
hir::ExprKind::Assign(self.lower_expr(lhs), ident, self.lower_span(eq_sign_span));
|
||||
let expr = self.expr(lhs.span, assign, ThinVec::new());
|
||||
let expr = self.expr(lhs.span, assign, AttrVec::new());
|
||||
assignments.push(self.stmt_expr(lhs.span, expr));
|
||||
pat
|
||||
}
|
||||
|
@ -1299,7 +1298,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let fn_path =
|
||||
hir::QPath::LangItem(hir::LangItem::RangeInclusiveNew, self.lower_span(span), None);
|
||||
let fn_expr =
|
||||
self.arena.alloc(self.expr(span, hir::ExprKind::Path(fn_path), ThinVec::new()));
|
||||
self.arena.alloc(self.expr(span, hir::ExprKind::Path(fn_path), AttrVec::new()));
|
||||
hir::ExprKind::Call(fn_expr, arena_vec![self; e1, e2])
|
||||
}
|
||||
|
||||
|
@ -1472,7 +1471,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
// `None => break`
|
||||
let none_arm = {
|
||||
let break_expr =
|
||||
self.with_loop_scope(e.id, |this| this.expr_break_alloc(for_span, ThinVec::new()));
|
||||
self.with_loop_scope(e.id, |this| this.expr_break_alloc(for_span, AttrVec::new()));
|
||||
let pat = self.pat_none(for_span);
|
||||
self.arm(pat, break_expr)
|
||||
};
|
||||
|
@ -1481,7 +1480,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
let some_arm = {
|
||||
let some_pat = self.pat_some(pat_span, pat);
|
||||
let body_block = self.with_loop_scope(e.id, |this| this.lower_block(body, false));
|
||||
let body_expr = self.arena.alloc(self.expr_block(body_block, ThinVec::new()));
|
||||
let body_expr = self.arena.alloc(self.expr_block(body_block, AttrVec::new()));
|
||||
self.arm(some_pat, body_expr)
|
||||
};
|
||||
|
||||
|
@ -1596,7 +1595,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
};
|
||||
attr::mk_attr_outer(allow)
|
||||
};
|
||||
let attrs = vec![attr];
|
||||
let attrs: AttrVec = vec![attr].into();
|
||||
|
||||
// `ControlFlow::Continue(val) => #[allow(unreachable_code)] val,`
|
||||
let continue_arm = {
|
||||
|
@ -1606,7 +1605,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
span,
|
||||
val_ident,
|
||||
val_pat_nid,
|
||||
ThinVec::from(attrs.clone()),
|
||||
attrs.clone(),
|
||||
));
|
||||
let continue_pat = self.pat_cf_continue(unstable_span, val_pat);
|
||||
self.arm(continue_pat, val_expr)
|
||||
|
@ -1625,7 +1624,6 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
self.arena.alloc(residual_expr),
|
||||
unstable_span,
|
||||
);
|
||||
let thin_attrs = ThinVec::from(attrs);
|
||||
let ret_expr = if let Some(catch_node) = self.catch_scope {
|
||||
let target_id = Ok(self.lower_node_id(catch_node));
|
||||
self.arena.alloc(self.expr(
|
||||
|
@ -1634,13 +1632,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
hir::Destination { label: None, target_id },
|
||||
Some(from_residual_expr),
|
||||
),
|
||||
thin_attrs,
|
||||
attrs,
|
||||
))
|
||||
} else {
|
||||
self.arena.alloc(self.expr(
|
||||
try_span,
|
||||
hir::ExprKind::Ret(Some(from_residual_expr)),
|
||||
thin_attrs,
|
||||
attrs,
|
||||
))
|
||||
};
|
||||
|
||||
|
@ -1728,7 +1726,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
arms: &'hir [hir::Arm<'hir>],
|
||||
source: hir::MatchSource,
|
||||
) -> hir::Expr<'hir> {
|
||||
self.expr(span, hir::ExprKind::Match(arg, arms, source), ThinVec::new())
|
||||
self.expr(span, hir::ExprKind::Match(arg, arms, source), AttrVec::new())
|
||||
}
|
||||
|
||||
fn expr_break(&mut self, span: Span, attrs: AttrVec) -> hir::Expr<'hir> {
|
||||
|
@ -1745,12 +1743,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
self.expr(
|
||||
span,
|
||||
hir::ExprKind::AddrOf(hir::BorrowKind::Ref, hir::Mutability::Mut, e),
|
||||
ThinVec::new(),
|
||||
AttrVec::new(),
|
||||
)
|
||||
}
|
||||
|
||||
fn expr_unit(&mut self, sp: Span) -> &'hir hir::Expr<'hir> {
|
||||
self.arena.alloc(self.expr(sp, hir::ExprKind::Tup(&[]), ThinVec::new()))
|
||||
self.arena.alloc(self.expr(sp, hir::ExprKind::Tup(&[]), AttrVec::new()))
|
||||
}
|
||||
|
||||
fn expr_call_mut(
|
||||
|
@ -1759,7 +1757,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
e: &'hir hir::Expr<'hir>,
|
||||
args: &'hir [hir::Expr<'hir>],
|
||||
) -> hir::Expr<'hir> {
|
||||
self.expr(span, hir::ExprKind::Call(e, args), ThinVec::new())
|
||||
self.expr(span, hir::ExprKind::Call(e, args), AttrVec::new())
|
||||
}
|
||||
|
||||
fn expr_call(
|
||||
|
@ -1779,7 +1777,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
hir_id: Option<hir::HirId>,
|
||||
) -> hir::Expr<'hir> {
|
||||
let path =
|
||||
self.arena.alloc(self.expr_lang_item_path(span, lang_item, ThinVec::new(), hir_id));
|
||||
self.arena.alloc(self.expr_lang_item_path(span, lang_item, AttrVec::new(), hir_id));
|
||||
self.expr_call_mut(span, path, args)
|
||||
}
|
||||
|
||||
|
@ -1822,7 +1820,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
ident: Ident,
|
||||
binding: hir::HirId,
|
||||
) -> hir::Expr<'hir> {
|
||||
self.expr_ident_with_attrs(sp, ident, binding, ThinVec::new())
|
||||
self.expr_ident_with_attrs(sp, ident, binding, AttrVec::new())
|
||||
}
|
||||
|
||||
fn expr_ident_with_attrs(
|
||||
|
@ -1860,13 +1858,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||
}),
|
||||
None,
|
||||
),
|
||||
ThinVec::new(),
|
||||
AttrVec::new(),
|
||||
)
|
||||
}
|
||||
|
||||
fn expr_block_empty(&mut self, span: Span) -> &'hir hir::Expr<'hir> {
|
||||
let blk = self.block_all(span, &[], None);
|
||||
let expr = self.expr_block(blk, ThinVec::new());
|
||||
let expr = self.expr_block(blk, AttrVec::new());
|
||||
self.arena.alloc(expr)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue