| //! Data structures for representing parsed attributes in the Rust compiler. |
| //! Formerly `rustc_attr_data_structures`. |
| //! |
| //! For detailed documentation about attribute processing, |
| //! see [rustc_attr_parsing](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_attr_parsing/index.html). |
| |
| pub use data_structures::*; |
| pub use encode_cross_crate::EncodeCrossCrate; |
| pub use pretty_printing::PrintAttribute; |
| |
| mod data_structures; |
| mod encode_cross_crate; |
| mod pretty_printing; |
| |
| /// Finds attributes in sequences of attributes by pattern matching. |
| /// |
| /// A little like `matches` but for attributes. |
| /// |
| /// ```rust,ignore (illustrative) |
| /// // finds the repr attribute |
| /// if let Some(r) = find_attr!(attrs, AttributeKind::Repr(r) => r) { |
| /// |
| /// } |
| /// |
| /// // checks if one has matched |
| /// if find_attr!(attrs, AttributeKind::Repr(_)) { |
| /// |
| /// } |
| /// ``` |
| /// |
| /// Often this requires you to first end up with a list of attributes. |
| /// A common way to get those is through `tcx.get_all_attrs(did)` |
| #[macro_export] |
| macro_rules! find_attr { |
| ($attributes_list: expr, $pattern: pat $(if $guard: expr)?) => {{ |
| $crate::find_attr!($attributes_list, $pattern $(if $guard)? => ()).is_some() |
| }}; |
| |
| ($attributes_list: expr, $pattern: pat $(if $guard: expr)? => $e: expr) => {{ |
| 'done: { |
| for i in $attributes_list { |
| let i: &rustc_hir::Attribute = i; |
| match i { |
| rustc_hir::Attribute::Parsed($pattern) $(if $guard)? => { |
| break 'done Some($e); |
| } |
| _ => {} |
| } |
| } |
| |
| None |
| } |
| }}; |
| } |