diff options
| author | Nicholas Nethercote <n.nethercote@gmail.com> | 2022-08-17 12:34:33 +1000 |
|---|---|---|
| committer | Nicholas Nethercote <n.nethercote@gmail.com> | 2022-08-22 07:35:33 +1000 |
| commit | 05a0dfe8cd4db51a08d11ab24cc1586c833e2df1 (patch) | |
| tree | b04ef71fbc5262172d6a67d8dea592c8d16f2eda | |
| parent | 6884e045bb8e03f6ee0a23454ac679aea1729c75 (diff) | |
| download | rust-05a0dfe8cd4db51a08d11ab24cc1586c833e2df1.tar.gz rust-05a0dfe8cd4db51a08d11ab24cc1586c833e2df1.zip | |
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.
| -rw-r--r-- | src/attr.rs | 5 | ||||
| -rw-r--r-- | src/imports.rs | 4 | ||||
| -rw-r--r-- | src/modules.rs | 8 | ||||
| -rw-r--r-- | src/parse/parser.rs | 2 |
4 files changed, 8 insertions, 11 deletions
diff --git a/src/attr.rs b/src/attr.rs index 41ba9a847e6..f5c1ee5fdd1 100644 --- a/src/attr.rs +++ b/src/attr.rs @@ -49,10 +49,7 @@ pub(crate) fn get_span_without_attrs(stmt: &ast::Stmt) -> Span { } /// Returns attributes that are within `outer_span`. -pub(crate) fn filter_inline_attrs( - attrs: &[ast::Attribute], - outer_span: Span, -) -> Vec<ast::Attribute> { +pub(crate) fn filter_inline_attrs(attrs: &[ast::Attribute], outer_span: Span) -> ast::AttrVec { attrs .iter() .filter(|a| outer_span.lo() <= a.span.lo() && a.span.hi() <= outer_span.hi()) diff --git a/src/imports.rs b/src/imports.rs index 8d41c881589..b6530c69243 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -116,7 +116,7 @@ pub(crate) struct UseTree { // Additional fields for top level use items. // Should we have another struct for top-level use items rather than reusing this? visibility: Option<ast::Visibility>, - attrs: Option<Vec<ast::Attribute>>, + attrs: Option<ast::AttrVec>, } impl PartialEq for UseTree { @@ -417,7 +417,7 @@ impl UseTree { list_item: Option<ListItem>, visibility: Option<ast::Visibility>, opt_lo: Option<BytePos>, - attrs: Option<Vec<ast::Attribute>>, + attrs: Option<ast::AttrVec>, ) -> UseTree { let span = if let Some(lo) = opt_lo { mk_sp(lo, a.span.hi()) diff --git a/src/modules.rs b/src/modules.rs index 81da724329f..7a0d1736c59 100644 --- a/src/modules.rs +++ b/src/modules.rs @@ -26,7 +26,7 @@ type FileModMap<'ast> = BTreeMap<FileName, Module<'ast>>; pub(crate) struct Module<'a> { ast_mod_kind: Option<Cow<'a, ast::ModKind>>, pub(crate) items: Cow<'a, Vec<rustc_ast::ptr::P<ast::Item>>>, - inner_attr: Vec<ast::Attribute>, + inner_attr: ast::AttrVec, pub(crate) span: Span, } @@ -35,7 +35,7 @@ impl<'a> Module<'a> { mod_span: Span, ast_mod_kind: Option<Cow<'a, ast::ModKind>>, mod_items: Cow<'a, Vec<rustc_ast::ptr::P<ast::Item>>>, - mod_attrs: Cow<'a, Vec<ast::Attribute>>, + mod_attrs: Cow<'a, ast::AttrVec>, ) -> Self { let inner_attr = mod_attrs .iter() @@ -158,7 +158,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { module_item.item.span, Some(Cow::Owned(sub_mod_kind.clone())), Cow::Owned(vec![]), - Cow::Owned(vec![]), + Cow::Owned(ast::AttrVec::new()), ), )?; } @@ -185,7 +185,7 @@ impl<'ast, 'sess, 'c> ModResolver<'ast, 'sess> { span, Some(Cow::Owned(sub_mod_kind.clone())), Cow::Owned(vec![]), - Cow::Owned(vec![]), + Cow::Owned(ast::AttrVec::new()), ), )?; } diff --git a/src/parse/parser.rs b/src/parse/parser.rs index 268c72649a6..e0bd065518b 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -109,7 +109,7 @@ impl<'a> Parser<'a> { sess: &'a ParseSess, path: &Path, span: Span, - ) -> Result<(Vec<ast::Attribute>, Vec<ptr::P<ast::Item>>, Span), ParserError> { + ) -> Result<(ast::AttrVec, Vec<ptr::P<ast::Item>>, Span), ParserError> { let result = catch_unwind(AssertUnwindSafe(|| { let mut parser = new_parser_from_file(sess.inner(), path, Some(span)); match parser.parse_mod(&TokenKind::Eof) { |
