Skip to content

Commit 619b8ab

Browse files
committed
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.
1 parent 650bff8 commit 619b8ab

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+351
-391
lines changed

compiler/rustc_ast/src/ast.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ pub struct WhereEqPredicate {
504504

505505
#[derive(Clone, Encodable, Decodable, Debug)]
506506
pub struct Crate {
507-
pub attrs: Vec<Attribute>,
507+
pub attrs: AttrVec,
508508
pub items: Vec<P<Item>>,
509509
pub spans: ModSpans,
510510
/// Must be equal to `CRATE_NODE_ID` after the crate root is expanded, but may hold
@@ -1268,7 +1268,7 @@ impl Expr {
12681268
id: DUMMY_NODE_ID,
12691269
kind: ExprKind::Err,
12701270
span: DUMMY_SP,
1271-
attrs: ThinVec::new(),
1271+
attrs: AttrVec::new(),
12721272
tokens: None,
12731273
},
12741274
)
@@ -2669,7 +2669,7 @@ impl VariantData {
26692669
/// An item definition.
26702670
#[derive(Clone, Encodable, Decodable, Debug)]
26712671
pub struct Item<K = ItemKind> {
2672-
pub attrs: Vec<Attribute>,
2672+
pub attrs: AttrVec,
26732673
pub id: NodeId,
26742674
pub span: Span,
26752675
pub vis: Visibility,
@@ -3036,19 +3036,19 @@ mod size_asserts {
30363036
use super::*;
30373037
use rustc_data_structures::static_assert_size;
30383038
// These are in alphabetical order, which is easy to maintain.
3039-
static_assert_size!(AssocItem, 120);
3039+
static_assert_size!(AssocItem, 104);
30403040
static_assert_size!(AssocItemKind, 32);
30413041
static_assert_size!(Attribute, 32);
30423042
static_assert_size!(Block, 48);
30433043
static_assert_size!(Expr, 104);
30443044
static_assert_size!(ExprKind, 72);
30453045
static_assert_size!(Fn, 192);
3046-
static_assert_size!(ForeignItem, 112);
3046+
static_assert_size!(ForeignItem, 96);
30473047
static_assert_size!(ForeignItemKind, 24);
30483048
static_assert_size!(GenericBound, 88);
30493049
static_assert_size!(Generics, 72);
30503050
static_assert_size!(Impl, 200);
3051-
static_assert_size!(Item, 200);
3051+
static_assert_size!(Item, 184);
30523052
static_assert_size!(ItemKind, 112);
30533053
static_assert_size!(Lit, 48);
30543054
static_assert_size!(LitKind, 24);

compiler/rustc_ast/src/ast_traits.rs

+10-37
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ pub trait HasAttrs {
270270
/// during token collection.
271271
const SUPPORTS_CUSTOM_INNER_ATTRS: bool;
272272
fn attrs(&self) -> &[Attribute];
273-
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>));
273+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec));
274274
}
275275

276276
macro_rules! impl_has_attrs {
@@ -283,8 +283,8 @@ macro_rules! impl_has_attrs {
283283
&self.attrs
284284
}
285285

286-
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
287-
VecOrAttrVec::visit(&mut self.attrs, f)
286+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
287+
f(&mut self.attrs)
288288
}
289289
}
290290
)+
@@ -299,7 +299,7 @@ macro_rules! impl_has_attrs_none {
299299
fn attrs(&self) -> &[Attribute] {
300300
&[]
301301
}
302-
fn visit_attrs(&mut self, _f: impl FnOnce(&mut Vec<Attribute>)) {}
302+
fn visit_attrs(&mut self, _f: impl FnOnce(&mut AttrVec)) {}
303303
}
304304
)+
305305
};
@@ -330,7 +330,7 @@ impl<T: AstDeref<Target: HasAttrs>> HasAttrs for T {
330330
fn attrs(&self) -> &[Attribute] {
331331
self.ast_deref().attrs()
332332
}
333-
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
333+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
334334
self.ast_deref_mut().visit_attrs(f)
335335
}
336336
}
@@ -340,7 +340,7 @@ impl<T: HasAttrs> HasAttrs for Option<T> {
340340
fn attrs(&self) -> &[Attribute] {
341341
self.as_ref().map(|inner| inner.attrs()).unwrap_or(&[])
342342
}
343-
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
343+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
344344
if let Some(inner) = self.as_mut() {
345345
inner.visit_attrs(f);
346346
}
@@ -362,13 +362,13 @@ impl HasAttrs for StmtKind {
362362
}
363363
}
364364

365-
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
365+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
366366
match self {
367-
StmtKind::Local(local) => visit_attrvec(&mut local.attrs, f),
367+
StmtKind::Local(local) => f(&mut local.attrs),
368368
StmtKind::Expr(expr) | StmtKind::Semi(expr) => expr.visit_attrs(f),
369369
StmtKind::Item(item) => item.visit_attrs(f),
370370
StmtKind::Empty => {}
371-
StmtKind::MacCall(mac) => visit_attrvec(&mut mac.attrs, f),
371+
StmtKind::MacCall(mac) => f(&mut mac.attrs),
372372
}
373373
}
374374
}
@@ -378,38 +378,11 @@ impl HasAttrs for Stmt {
378378
fn attrs(&self) -> &[Attribute] {
379379
self.kind.attrs()
380380
}
381-
fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
381+
fn visit_attrs(&mut self, f: impl FnOnce(&mut AttrVec)) {
382382
self.kind.visit_attrs(f);
383383
}
384384
}
385385

386-
/// Helper trait for the impls above. Abstracts over
387-
/// the two types of attribute fields that AST nodes
388-
/// may have (`Vec<Attribute>` or `AttrVec`).
389-
trait VecOrAttrVec {
390-
fn visit(&mut self, f: impl FnOnce(&mut Vec<Attribute>));
391-
}
392-
393-
impl VecOrAttrVec for Vec<Attribute> {
394-
fn visit(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
395-
f(self)
396-
}
397-
}
398-
399-
impl VecOrAttrVec for AttrVec {
400-
fn visit(&mut self, f: impl FnOnce(&mut Vec<Attribute>)) {
401-
visit_attrvec(self, f)
402-
}
403-
}
404-
405-
fn visit_attrvec(attrs: &mut AttrVec, f: impl FnOnce(&mut Vec<Attribute>)) {
406-
crate::mut_visit::visit_clobber(attrs, |attrs| {
407-
let mut vec = attrs.into();
408-
f(&mut vec);
409-
vec.into()
410-
});
411-
}
412-
413386
/// A newtype around an AST node that implements the traits above if the node implements them.
414387
pub struct AstNodeWrapper<Wrapped, Tag> {
415388
pub wrapped: Wrapped,

compiler/rustc_ast/src/attr/mod.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use crate::tokenstream::{DelimSpan, Spacing, TokenTree};
1212
use crate::tokenstream::{LazyTokenStream, TokenStream};
1313
use crate::util::comments;
1414

15-
use rustc_data_structures::thin_vec::ThinVec;
1615
use rustc_index::bit_set::GrowableBitSet;
1716
use rustc_span::source_map::BytePos;
1817
use rustc_span::symbol::{sym, Ident, Symbol};
@@ -487,7 +486,7 @@ impl MetaItemKind {
487486
id: ast::DUMMY_NODE_ID,
488487
kind: ast::ExprKind::Lit(lit.clone()),
489488
span: lit.span,
490-
attrs: ThinVec::new(),
489+
attrs: ast::AttrVec::new(),
491490
tokens: None,
492491
});
493492
MacArgs::Eq(span, MacArgsEq::Ast(expr))

compiler/rustc_ast/src/mut_visit.rs

+11-23
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use crate::tokenstream::*;
1414

1515
use rustc_data_structures::map_in_place::MapInPlace;
1616
use rustc_data_structures::sync::Lrc;
17-
use rustc_data_structures::thin_vec::ThinVec;
1817
use rustc_span::source_map::Spanned;
1918
use rustc_span::symbol::Ident;
2019
use rustc_span::Span;
@@ -338,12 +337,7 @@ where
338337
}
339338

340339
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
341-
pub fn visit_attrs<T: MutVisitor>(attrs: &mut Vec<Attribute>, vis: &mut T) {
342-
visit_vec(attrs, |attr| vis.visit_attribute(attr));
343-
}
344-
345-
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
346-
pub fn visit_thin_attrs<T: MutVisitor>(attrs: &mut AttrVec, vis: &mut T) {
340+
pub fn visit_attrs<T: MutVisitor>(attrs: &mut AttrVec, vis: &mut T) {
347341
for attr in attrs.iter_mut() {
348342
vis.visit_attribute(attr);
349343
}
@@ -398,7 +392,7 @@ pub fn noop_flat_map_pat_field<T: MutVisitor>(
398392
vis.visit_ident(ident);
399393
vis.visit_pat(pat);
400394
vis.visit_span(span);
401-
visit_thin_attrs(attrs, vis);
395+
visit_attrs(attrs, vis);
402396
smallvec![fp]
403397
}
404398

@@ -424,7 +418,7 @@ pub fn noop_visit_use_tree<T: MutVisitor>(use_tree: &mut UseTree, vis: &mut T) {
424418

425419
pub fn noop_flat_map_arm<T: MutVisitor>(mut arm: Arm, vis: &mut T) -> SmallVec<[Arm; 1]> {
426420
let Arm { attrs, pat, guard, body, span, id, is_placeholder: _ } = &mut arm;
427-
visit_thin_attrs(attrs, vis);
421+
visit_attrs(attrs, vis);
428422
vis.visit_id(id);
429423
vis.visit_pat(pat);
430424
visit_opt(guard, |guard| vis.visit_expr(guard));
@@ -507,7 +501,7 @@ pub fn noop_flat_map_variant<T: MutVisitor>(
507501
let Variant { ident, vis, attrs, id, data, disr_expr, span, is_placeholder: _ } = &mut variant;
508502
visitor.visit_ident(ident);
509503
visitor.visit_vis(vis);
510-
visit_thin_attrs(attrs, visitor);
504+
visit_attrs(attrs, visitor);
511505
visitor.visit_id(id);
512506
visitor.visit_variant_data(data);
513507
visit_opt(disr_expr, |disr_expr| visitor.visit_anon_const(disr_expr));
@@ -589,7 +583,7 @@ pub fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
589583
}
590584
}
591585
vis.visit_span(span);
592-
visit_thin_attrs(attrs, vis);
586+
visit_attrs(attrs, vis);
593587
visit_lazy_tts(tokens, vis);
594588
}
595589

@@ -640,7 +634,7 @@ pub fn noop_visit_meta_item<T: MutVisitor>(mi: &mut MetaItem, vis: &mut T) {
640634
pub fn noop_flat_map_param<T: MutVisitor>(mut param: Param, vis: &mut T) -> SmallVec<[Param; 1]> {
641635
let Param { attrs, id, pat, span, ty, is_placeholder: _ } = &mut param;
642636
vis.visit_id(id);
643-
visit_thin_attrs(attrs, vis);
637+
visit_attrs(attrs, vis);
644638
vis.visit_pat(pat);
645639
vis.visit_span(span);
646640
vis.visit_ty(ty);
@@ -882,7 +876,7 @@ pub fn noop_flat_map_generic_param<T: MutVisitor>(
882876
if let Some(ref mut colon_span) = colon_span {
883877
vis.visit_span(colon_span);
884878
}
885-
visit_thin_attrs(attrs, vis);
879+
visit_attrs(attrs, vis);
886880
visit_vec(bounds, |bound| noop_visit_param_bound(bound, vis));
887881
match kind {
888882
GenericParamKind::Lifetime => {}
@@ -978,7 +972,7 @@ pub fn noop_flat_map_field_def<T: MutVisitor>(
978972
visitor.visit_vis(vis);
979973
visitor.visit_id(id);
980974
visitor.visit_ty(ty);
981-
visit_thin_attrs(attrs, visitor);
975+
visit_attrs(attrs, visitor);
982976
smallvec![fd]
983977
}
984978

@@ -991,7 +985,7 @@ pub fn noop_flat_map_expr_field<T: MutVisitor>(
991985
vis.visit_expr(expr);
992986
vis.visit_id(id);
993987
vis.visit_span(span);
994-
visit_thin_attrs(attrs, vis);
988+
visit_attrs(attrs, vis);
995989
smallvec![f]
996990
}
997991

@@ -1432,7 +1426,7 @@ pub fn noop_visit_expr<T: MutVisitor>(
14321426
}
14331427
vis.visit_id(id);
14341428
vis.visit_span(span);
1435-
visit_thin_attrs(attrs, vis);
1429+
visit_attrs(attrs, vis);
14361430
visit_lazy_tts(tokens, vis);
14371431
}
14381432

@@ -1478,7 +1472,7 @@ pub fn noop_flat_map_stmt_kind<T: MutVisitor>(
14781472
StmtKind::MacCall(mut mac) => {
14791473
let MacCallStmt { mac: mac_, style: _, attrs, tokens } = mac.deref_mut();
14801474
vis.visit_mac_call(mac_);
1481-
visit_thin_attrs(attrs, vis);
1475+
visit_attrs(attrs, vis);
14821476
visit_lazy_tts(tokens, vis);
14831477
smallvec![StmtKind::MacCall(mac)]
14841478
}
@@ -1513,12 +1507,6 @@ impl<T: DummyAstNode + 'static> DummyAstNode for P<T> {
15131507
}
15141508
}
15151509

1516-
impl<T> DummyAstNode for ThinVec<T> {
1517-
fn dummy() -> Self {
1518-
Default::default()
1519-
}
1520-
}
1521-
15221510
impl DummyAstNode for Item {
15231511
fn dummy() -> Self {
15241512
Item {

0 commit comments

Comments
 (0)