|  | //! 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 | 
|  | } | 
|  | }}; | 
|  | } |