Struct Attribute
struct Attribute { ... }
An attribute, like #[repr(transparent)].
Syntax
Rust has six types of attributes.
-
Outer attributes like
#[repr(transparent)]. These appear outside or in front of the item they describe. -
Inner attributes like
#![feature(proc_macro)]. These appear inside of the item they describe, usually a module. -
Outer one-line doc comments like
/// Example. -
Inner one-line doc comments like
//! Please file an issue. -
Outer documentation blocks
/** Example */. -
Inner documentation blocks
/*! Please file an issue */.
The style field of type AttrStyle distinguishes whether an attribute
is outer or inner.
Every attribute has a path that indicates the intended interpretation
of the rest of the attribute's contents. The path and the optional
additional contents are represented together in the meta field of the
attribute in three possible varieties:
-
Meta::Path — attributes whose information content conveys just a path, for example the
#[test]attribute. -
Meta::List — attributes that carry arbitrary tokens after the path, surrounded by a delimiter (parenthesis, bracket, or brace). For example
#[derive(Copy)]or#[precondition(x < 5)]. -
Meta::NameValue — attributes with an
=sign after the path, followed by a Rust expression. For example#[path = "sys/windows.rs"].
All doc comments are represented in the NameValue style with a path of
"doc", as this is how they are processed by the compiler and by
macro_rules! macros.
#[derive(Copy, Clone)]
~~~~~~Path
^^^^^^^^^^^^^^^^^^^Meta::List
#[path = "sys/windows.rs"]
~~~~Path
^^^^^^^^^^^^^^^^^^^^^^^Meta::NameValue
#[test]
^^^^Meta::Path
Parsing from tokens to Attribute
This type does not implement the Parse trait and thus cannot be
parsed directly by ParseStream::parse. Instead use
ParseStream::call with one of the two parser functions
Attribute::parse_outer or Attribute::parse_inner depending on
which you intend to parse.
use ;
use ;
// Parses a unit struct with attributes.
//
// #[path = "s.tmpl"]
// struct S;
Parsing from Attribute to structured arguments
The grammar of attributes in Rust is very flexible, which makes the
syntax tree not that useful on its own. In particular, arguments of the
Meta::List variety of attribute are held in an arbitrary tokens: TokenStream. Macros are expected to check the path of the attribute,
decide whether they recognize it, and then parse the remaining tokens
according to whatever grammar they wish to require for that kind of
attribute. Use parse_args() to parse those tokens into the expected
data structure.
Doc comments
The compiler transforms doc comments, such as /// comment and /*! comment */, into attributes before macros are expanded. Each comment is
expanded into an attribute of the form #[doc = r"comment"].
As an example, the following mod items are expanded identically:
# use ;
let doc: ItemMod = parse_quote! ;
let attr: ItemMod = parse_quote! ;
assert_eq!;
Fields
pound_token: Poundstyle: AttrStylebracket_token: Bracketmeta: Meta
Implementations
impl Attribute
fn path(self: &Self) -> &PathReturns the path that identifies the interpretation of this attribute.
For example this would return the
testin#[test], thederivein#[derive(Copy)], and thepathin#[path = "sys/windows.rs"].fn parse_args<T: Parse>(self: &Self) -> Result<T>Parse the arguments to the attribute as a syntax tree.
This is similar to pulling out the
TokenStreamfromMeta::Listand doingsyn::parse2::<T>(meta_list.tokens), except that usingparse_argsthe error message has a more useful span whentokensis empty.The surrounding delimiters are not included in the input to the parser.
#[my_attr(value < 5)] ^^^^^^^^^ what gets parsedExample
use ; let attr: Attribute = parse_quote! ; if attr.path.is_ident # Okfn parse_args_with<F: Parser>(self: &Self, parser: F) -> Result<<F as >::Output>Parse the arguments to the attribute using the given parser.
Example
use ; let attr: Attribute = parse_quote! ] }; let bwom = attr.parse_args_with?; // Attribute does not have a Parse impl, so we couldn't directly do: // let bwom: Attribute = attr.parse_args()?; # Okfn parse_nested_meta<impl FnMut(ParseNestedMeta) -> Result<()>: FnMut(ParseNestedMeta<'_>) -> Result<()>>(self: &Self, logic: impl FnMut(ParseNestedMeta<'_>) -> Result<()>) -> Result<()>Parse the arguments to the attribute, expecting it to follow the conventional structure used by most of Rust's built-in attributes.
The Meta Item Attribute Syntax section in the Rust reference explains the convention in more detail. Not all attributes follow this convention, so [
parse_args()][Self::parse_args] is available if you need to parse arbitrarily goofy attribute syntax.Example
We'll parse a struct, and then parse some of Rust's
#[repr]attribute syntax.use ; let input: ItemStruct = parse_quote! ; let mut repr_c = false; let mut repr_transparent = false; let mut repr_align = None::; let mut repr_packed = None::; for attr in &input.attrs # OkAlternatives
In some cases, for attributes which have nested layers of structured content, the following less flexible approach might be more convenient:
# use ; # # let input: ItemStruct = parse_quote! ; # use Punctuated; use ; let mut repr_c = false; let mut repr_transparent = false; let mut repr_align = None::; let mut repr_packed = None::; for attr in &input.attrs # Okfn parse_outer(input: ParseStream<'_>) -> Result<Vec<Self>>Parses zero or more outer attributes from the stream.
Example
fn parse_inner(input: ParseStream<'_>) -> Result<Vec<Self>>Parses zero or more inner attributes from the stream.
Example
impl Clone for Attribute
fn clone(self: &Self) -> Self
impl Debug for Attribute
fn fmt(self: &Self, formatter: &mut Formatter<'_>) -> Result
impl Eq for Attribute
impl Freeze for Attribute
impl Hash for Attribute
fn hash<H>(self: &Self, state: &mut H) where H: Hasher
impl PartialEq for Attribute
fn eq(self: &Self, other: &Self) -> bool
impl RefUnwindSafe for Attribute
impl Send for Attribute
impl Sync for Attribute
impl ToTokens for Attribute
fn to_tokens(self: &Self, tokens: &mut TokenStream)
impl Unpin for Attribute
impl UnsafeUnpin for Attribute
impl UnwindSafe for Attribute
impl<T> Any for Attribute
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for Attribute
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for Attribute
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for Attribute
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for Attribute
fn from(t: T) -> TReturns the argument unchanged.
impl<T> Spanned for Attribute
fn span(self: &Self) -> Span
impl<T> ToOwned for Attribute
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T, U> Into for Attribute
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for Attribute
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for Attribute
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>