Shrink ast::Attribute
.
This commit is contained in:
parent
40336865fe
commit
85a6cd6a47
15 changed files with 167 additions and 149 deletions
|
@ -2547,10 +2547,16 @@ pub struct Attribute {
|
|||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub struct NormalAttr {
|
||||
pub item: AttrItem,
|
||||
pub tokens: Option<LazyTokenStream>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Encodable, Decodable, Debug)]
|
||||
pub enum AttrKind {
|
||||
/// A normal attribute.
|
||||
Normal(AttrItem, Option<LazyTokenStream>),
|
||||
Normal(P<NormalAttr>),
|
||||
|
||||
/// A doc comment (e.g. `/// ...`, `//! ...`, `/** ... */`, `/*! ... */`).
|
||||
/// Doc attributes (e.g. `#[doc="..."]`) are represented with the `Normal`
|
||||
|
@ -3033,7 +3039,7 @@ mod size_asserts {
|
|||
// These are in alphabetical order, which is easy to maintain.
|
||||
static_assert_size!(AssocItem, 160);
|
||||
static_assert_size!(AssocItemKind, 72);
|
||||
static_assert_size!(Attribute, 152);
|
||||
static_assert_size!(Attribute, 32);
|
||||
static_assert_size!(Block, 48);
|
||||
static_assert_size!(Expr, 104);
|
||||
static_assert_size!(Fn, 192);
|
||||
|
|
|
@ -212,7 +212,7 @@ impl HasTokens for Stmt {
|
|||
impl HasTokens for Attribute {
|
||||
fn tokens(&self) -> Option<&LazyTokenStream> {
|
||||
match &self.kind {
|
||||
AttrKind::Normal(_, tokens) => tokens.as_ref(),
|
||||
AttrKind::Normal(normal) => normal.tokens.as_ref(),
|
||||
kind @ AttrKind::DocComment(..) => {
|
||||
panic!("Called tokens on doc comment attr {:?}", kind)
|
||||
}
|
||||
|
@ -220,7 +220,7 @@ impl HasTokens for Attribute {
|
|||
}
|
||||
fn tokens_mut(&mut self) -> Option<&mut Option<LazyTokenStream>> {
|
||||
Some(match &mut self.kind {
|
||||
AttrKind::Normal(_, tokens) => tokens,
|
||||
AttrKind::Normal(normal) => &mut normal.tokens,
|
||||
kind @ AttrKind::DocComment(..) => {
|
||||
panic!("Called tokens_mut on doc comment attr {:?}", kind)
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ impl Attribute {
|
|||
#[inline]
|
||||
pub fn has_name(&self, name: Symbol) -> bool {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => item.path == name,
|
||||
AttrKind::Normal(ref normal) => normal.item.path == name,
|
||||
AttrKind::DocComment(..) => false,
|
||||
}
|
||||
}
|
||||
|
@ -122,9 +122,9 @@ impl Attribute {
|
|||
/// For a single-segment attribute, returns its name; otherwise, returns `None`.
|
||||
pub fn ident(&self) -> Option<Ident> {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => {
|
||||
if item.path.segments.len() == 1 {
|
||||
Some(item.path.segments[0].ident)
|
||||
AttrKind::Normal(ref normal) => {
|
||||
if normal.item.path.segments.len() == 1 {
|
||||
Some(normal.item.path.segments[0].ident)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -138,14 +138,16 @@ impl Attribute {
|
|||
|
||||
pub fn value_str(&self) -> Option<Symbol> {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => item.meta_kind().and_then(|kind| kind.value_str()),
|
||||
AttrKind::Normal(ref normal) => {
|
||||
normal.item.meta_kind().and_then(|kind| kind.value_str())
|
||||
}
|
||||
AttrKind::DocComment(..) => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn meta_item_list(&self) -> Option<Vec<NestedMetaItem>> {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => match item.meta_kind() {
|
||||
AttrKind::Normal(ref normal) => match normal.item.meta_kind() {
|
||||
Some(MetaItemKind::List(list)) => Some(list),
|
||||
_ => None,
|
||||
},
|
||||
|
@ -154,8 +156,8 @@ impl Attribute {
|
|||
}
|
||||
|
||||
pub fn is_word(&self) -> bool {
|
||||
if let AttrKind::Normal(item, _) = &self.kind {
|
||||
matches!(item.args, MacArgs::Empty)
|
||||
if let AttrKind::Normal(normal) = &self.kind {
|
||||
matches!(normal.item.args, MacArgs::Empty)
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
@ -247,7 +249,8 @@ impl Attribute {
|
|||
pub fn doc_str_and_comment_kind(&self) -> Option<(Symbol, CommentKind)> {
|
||||
match self.kind {
|
||||
AttrKind::DocComment(kind, data) => Some((data, kind)),
|
||||
AttrKind::Normal(ref item, _) if item.path == sym::doc => item
|
||||
AttrKind::Normal(ref normal) if normal.item.path == sym::doc => normal
|
||||
.item
|
||||
.meta_kind()
|
||||
.and_then(|kind| kind.value_str())
|
||||
.map(|data| (data, CommentKind::Line)),
|
||||
|
@ -258,8 +261,8 @@ impl Attribute {
|
|||
pub fn doc_str(&self) -> Option<Symbol> {
|
||||
match self.kind {
|
||||
AttrKind::DocComment(.., data) => Some(data),
|
||||
AttrKind::Normal(ref item, _) if item.path == sym::doc => {
|
||||
item.meta_kind().and_then(|kind| kind.value_str())
|
||||
AttrKind::Normal(ref normal) if normal.item.path == sym::doc => {
|
||||
normal.item.meta_kind().and_then(|kind| kind.value_str())
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
|
@ -271,14 +274,14 @@ impl Attribute {
|
|||
|
||||
pub fn get_normal_item(&self) -> &AttrItem {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => item,
|
||||
AttrKind::Normal(ref normal) => &normal.item,
|
||||
AttrKind::DocComment(..) => panic!("unexpected doc comment"),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn unwrap_normal_item(self) -> AttrItem {
|
||||
match self.kind {
|
||||
AttrKind::Normal(item, _) => item,
|
||||
AttrKind::Normal(normal) => normal.into_inner().item,
|
||||
AttrKind::DocComment(..) => panic!("unexpected doc comment"),
|
||||
}
|
||||
}
|
||||
|
@ -286,21 +289,22 @@ impl Attribute {
|
|||
/// Extracts the MetaItem from inside this Attribute.
|
||||
pub fn meta(&self) -> Option<MetaItem> {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => item.meta(self.span),
|
||||
AttrKind::Normal(ref normal) => normal.item.meta(self.span),
|
||||
AttrKind::DocComment(..) => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn meta_kind(&self) -> Option<MetaItemKind> {
|
||||
match self.kind {
|
||||
AttrKind::Normal(ref item, _) => item.meta_kind(),
|
||||
AttrKind::Normal(ref normal) => normal.item.meta_kind(),
|
||||
AttrKind::DocComment(..) => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn tokens(&self) -> AttrAnnotatedTokenStream {
|
||||
match self.kind {
|
||||
AttrKind::Normal(_, ref tokens) => tokens
|
||||
AttrKind::Normal(ref normal) => normal
|
||||
.tokens
|
||||
.as_ref()
|
||||
.unwrap_or_else(|| panic!("attribute is missing tokens: {:?}", self))
|
||||
.create_token_stream(),
|
||||
|
@ -361,7 +365,12 @@ pub fn mk_attr_from_item(
|
|||
style: AttrStyle,
|
||||
span: Span,
|
||||
) -> Attribute {
|
||||
Attribute { kind: AttrKind::Normal(item, tokens), id: mk_attr_id(), style, span }
|
||||
Attribute {
|
||||
kind: AttrKind::Normal(P(ast::NormalAttr { item, tokens })),
|
||||
id: mk_attr_id(),
|
||||
style,
|
||||
span,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns an inner attribute with the given value and span.
|
||||
|
|
|
@ -596,7 +596,9 @@ pub fn noop_visit_local<T: MutVisitor>(local: &mut P<Local>, vis: &mut T) {
|
|||
pub fn noop_visit_attribute<T: MutVisitor>(attr: &mut Attribute, vis: &mut T) {
|
||||
let Attribute { kind, id: _, style: _, span } = attr;
|
||||
match kind {
|
||||
AttrKind::Normal(AttrItem { path, args, tokens }, attr_tokens) => {
|
||||
AttrKind::Normal(normal) => {
|
||||
let NormalAttr { item: AttrItem { path, args, tokens }, tokens: attr_tokens } =
|
||||
&mut **normal;
|
||||
vis.visit_path(path);
|
||||
visit_mac_args(args, vis);
|
||||
visit_lazy_tts(tokens, vis);
|
||||
|
@ -659,8 +661,8 @@ pub fn visit_attr_annotated_tt<T: MutVisitor>(tt: &mut AttrAnnotatedTokenTree, v
|
|||
AttrAnnotatedTokenTree::Attributes(data) => {
|
||||
for attr in &mut *data.attrs {
|
||||
match &mut attr.kind {
|
||||
AttrKind::Normal(_, attr_tokens) => {
|
||||
visit_lazy_tts(attr_tokens, vis);
|
||||
AttrKind::Normal(normal) => {
|
||||
visit_lazy_tts(&mut normal.tokens, vis);
|
||||
}
|
||||
AttrKind::DocComment(..) => {
|
||||
vis.visit_span(&mut attr.span);
|
||||
|
|
|
@ -929,7 +929,7 @@ pub fn walk_vis<'a, V: Visitor<'a>>(visitor: &mut V, vis: &'a Visibility) {
|
|||
|
||||
pub fn walk_attribute<'a, V: Visitor<'a>>(visitor: &mut V, attr: &'a Attribute) {
|
||||
match attr.kind {
|
||||
AttrKind::Normal(ref item, ref _tokens) => walk_mac_args(visitor, &item.args),
|
||||
AttrKind::Normal(ref normal) => walk_mac_args(visitor, &normal.item.args),
|
||||
AttrKind::DocComment(..) => {}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue