1*69942c0aSMiguel Ojeda // SPDX-License-Identifier: Apache-2.0 OR MIT 2*69942c0aSMiguel Ojeda 3808c999fSMiguel Ojeda #[cfg_attr( 4808c999fSMiguel Ojeda not(any(feature = "full", feature = "derive")), 5808c999fSMiguel Ojeda allow(unknown_lints, unused_macro_rules) 6808c999fSMiguel Ojeda )] 7808c999fSMiguel Ojeda macro_rules! ast_struct { 8808c999fSMiguel Ojeda ( 9808c999fSMiguel Ojeda $(#[$attr:meta])* 10808c999fSMiguel Ojeda $pub:ident $struct:ident $name:ident #full $body:tt 11808c999fSMiguel Ojeda ) => { 12808c999fSMiguel Ojeda check_keyword_matches!(pub $pub); 13808c999fSMiguel Ojeda check_keyword_matches!(struct $struct); 14808c999fSMiguel Ojeda 15808c999fSMiguel Ojeda #[cfg(feature = "full")] 16808c999fSMiguel Ojeda $(#[$attr])* $pub $struct $name $body 17808c999fSMiguel Ojeda 18808c999fSMiguel Ojeda #[cfg(not(feature = "full"))] 19808c999fSMiguel Ojeda $(#[$attr])* $pub $struct $name { 20808c999fSMiguel Ojeda _noconstruct: ::std::marker::PhantomData<::proc_macro2::Span>, 21808c999fSMiguel Ojeda } 22808c999fSMiguel Ojeda 23808c999fSMiguel Ojeda #[cfg(all(not(feature = "full"), feature = "printing"))] 24808c999fSMiguel Ojeda impl ::quote::ToTokens for $name { 25808c999fSMiguel Ojeda fn to_tokens(&self, _: &mut ::proc_macro2::TokenStream) { 26808c999fSMiguel Ojeda unreachable!() 27808c999fSMiguel Ojeda } 28808c999fSMiguel Ojeda } 29808c999fSMiguel Ojeda }; 30808c999fSMiguel Ojeda 31808c999fSMiguel Ojeda ( 32808c999fSMiguel Ojeda $(#[$attr:meta])* 33808c999fSMiguel Ojeda $pub:ident $struct:ident $name:ident $body:tt 34808c999fSMiguel Ojeda ) => { 35808c999fSMiguel Ojeda check_keyword_matches!(pub $pub); 36808c999fSMiguel Ojeda check_keyword_matches!(struct $struct); 37808c999fSMiguel Ojeda 38808c999fSMiguel Ojeda $(#[$attr])* $pub $struct $name $body 39808c999fSMiguel Ojeda }; 40808c999fSMiguel Ojeda } 41808c999fSMiguel Ojeda 42808c999fSMiguel Ojeda #[cfg(any(feature = "full", feature = "derive"))] 43808c999fSMiguel Ojeda macro_rules! ast_enum { 44808c999fSMiguel Ojeda ( 45808c999fSMiguel Ojeda $(#[$enum_attr:meta])* 46808c999fSMiguel Ojeda $pub:ident $enum:ident $name:ident $body:tt 47808c999fSMiguel Ojeda ) => { 48808c999fSMiguel Ojeda check_keyword_matches!(pub $pub); 49808c999fSMiguel Ojeda check_keyword_matches!(enum $enum); 50808c999fSMiguel Ojeda 51808c999fSMiguel Ojeda $(#[$enum_attr])* $pub $enum $name $body 52808c999fSMiguel Ojeda }; 53808c999fSMiguel Ojeda } 54808c999fSMiguel Ojeda 55808c999fSMiguel Ojeda macro_rules! ast_enum_of_structs { 56808c999fSMiguel Ojeda ( 57808c999fSMiguel Ojeda $(#[$enum_attr:meta])* 58808c999fSMiguel Ojeda $pub:ident $enum:ident $name:ident $body:tt 59808c999fSMiguel Ojeda ) => { 60808c999fSMiguel Ojeda check_keyword_matches!(pub $pub); 61808c999fSMiguel Ojeda check_keyword_matches!(enum $enum); 62808c999fSMiguel Ojeda 63808c999fSMiguel Ojeda $(#[$enum_attr])* $pub $enum $name $body 64808c999fSMiguel Ojeda 65808c999fSMiguel Ojeda ast_enum_of_structs_impl!($name $body); 66808c999fSMiguel Ojeda 67808c999fSMiguel Ojeda #[cfg(feature = "printing")] 68808c999fSMiguel Ojeda generate_to_tokens!(() tokens $name $body); 69808c999fSMiguel Ojeda }; 70808c999fSMiguel Ojeda } 71808c999fSMiguel Ojeda 72808c999fSMiguel Ojeda macro_rules! ast_enum_of_structs_impl { 73808c999fSMiguel Ojeda ( 74808c999fSMiguel Ojeda $name:ident { 75808c999fSMiguel Ojeda $( 76808c999fSMiguel Ojeda $(#[cfg $cfg_attr:tt])* 77808c999fSMiguel Ojeda $(#[doc $($doc_attr:tt)*])* 78808c999fSMiguel Ojeda $variant:ident $( ($member:ident) )*, 79808c999fSMiguel Ojeda )* 80808c999fSMiguel Ojeda } 81808c999fSMiguel Ojeda ) => { 82808c999fSMiguel Ojeda $($( 83808c999fSMiguel Ojeda ast_enum_from_struct!($name::$variant, $member); 84808c999fSMiguel Ojeda )*)* 85808c999fSMiguel Ojeda }; 86808c999fSMiguel Ojeda } 87808c999fSMiguel Ojeda 88808c999fSMiguel Ojeda macro_rules! ast_enum_from_struct { 89808c999fSMiguel Ojeda // No From<TokenStream> for verbatim variants. 90808c999fSMiguel Ojeda ($name:ident::Verbatim, $member:ident) => {}; 91808c999fSMiguel Ojeda 92808c999fSMiguel Ojeda ($name:ident::$variant:ident, $member:ident) => { 93808c999fSMiguel Ojeda impl From<$member> for $name { 94808c999fSMiguel Ojeda fn from(e: $member) -> $name { 95808c999fSMiguel Ojeda $name::$variant(e) 96808c999fSMiguel Ojeda } 97808c999fSMiguel Ojeda } 98808c999fSMiguel Ojeda }; 99808c999fSMiguel Ojeda } 100808c999fSMiguel Ojeda 101808c999fSMiguel Ojeda #[cfg(feature = "printing")] 102808c999fSMiguel Ojeda macro_rules! generate_to_tokens { 103808c999fSMiguel Ojeda ( 104808c999fSMiguel Ojeda ($($arms:tt)*) $tokens:ident $name:ident { 105808c999fSMiguel Ojeda $(#[cfg $cfg_attr:tt])* 106808c999fSMiguel Ojeda $(#[doc $($doc_attr:tt)*])* 107808c999fSMiguel Ojeda $variant:ident, 108808c999fSMiguel Ojeda $($next:tt)* 109808c999fSMiguel Ojeda } 110808c999fSMiguel Ojeda ) => { 111808c999fSMiguel Ojeda generate_to_tokens!( 112808c999fSMiguel Ojeda ($($arms)* $(#[cfg $cfg_attr])* $name::$variant => {}) 113808c999fSMiguel Ojeda $tokens $name { $($next)* } 114808c999fSMiguel Ojeda ); 115808c999fSMiguel Ojeda }; 116808c999fSMiguel Ojeda 117808c999fSMiguel Ojeda ( 118808c999fSMiguel Ojeda ($($arms:tt)*) $tokens:ident $name:ident { 119808c999fSMiguel Ojeda $(#[cfg $cfg_attr:tt])* 120808c999fSMiguel Ojeda $(#[doc $($doc_attr:tt)*])* 121808c999fSMiguel Ojeda $variant:ident($member:ident), 122808c999fSMiguel Ojeda $($next:tt)* 123808c999fSMiguel Ojeda } 124808c999fSMiguel Ojeda ) => { 125808c999fSMiguel Ojeda generate_to_tokens!( 126808c999fSMiguel Ojeda ($($arms)* $(#[cfg $cfg_attr])* $name::$variant(_e) => _e.to_tokens($tokens),) 127808c999fSMiguel Ojeda $tokens $name { $($next)* } 128808c999fSMiguel Ojeda ); 129808c999fSMiguel Ojeda }; 130808c999fSMiguel Ojeda 131808c999fSMiguel Ojeda (($($arms:tt)*) $tokens:ident $name:ident {}) => { 132808c999fSMiguel Ojeda #[cfg_attr(docsrs, doc(cfg(feature = "printing")))] 133808c999fSMiguel Ojeda impl ::quote::ToTokens for $name { 134808c999fSMiguel Ojeda fn to_tokens(&self, $tokens: &mut ::proc_macro2::TokenStream) { 135808c999fSMiguel Ojeda match self { 136808c999fSMiguel Ojeda $($arms)* 137808c999fSMiguel Ojeda } 138808c999fSMiguel Ojeda } 139808c999fSMiguel Ojeda } 140808c999fSMiguel Ojeda }; 141808c999fSMiguel Ojeda } 142808c999fSMiguel Ojeda 143808c999fSMiguel Ojeda // Rustdoc bug: does not respect the doc(hidden) on some items. 144808c999fSMiguel Ojeda #[cfg(all(doc, feature = "parsing"))] 145808c999fSMiguel Ojeda macro_rules! pub_if_not_doc { 146808c999fSMiguel Ojeda ($(#[$m:meta])* $pub:ident $($item:tt)*) => { 147808c999fSMiguel Ojeda check_keyword_matches!(pub $pub); 148808c999fSMiguel Ojeda 149808c999fSMiguel Ojeda $(#[$m])* 150808c999fSMiguel Ojeda $pub(crate) $($item)* 151808c999fSMiguel Ojeda }; 152808c999fSMiguel Ojeda } 153808c999fSMiguel Ojeda 154808c999fSMiguel Ojeda #[cfg(all(not(doc), feature = "parsing"))] 155808c999fSMiguel Ojeda macro_rules! pub_if_not_doc { 156808c999fSMiguel Ojeda ($(#[$m:meta])* $pub:ident $($item:tt)*) => { 157808c999fSMiguel Ojeda check_keyword_matches!(pub $pub); 158808c999fSMiguel Ojeda 159808c999fSMiguel Ojeda $(#[$m])* 160808c999fSMiguel Ojeda $pub $($item)* 161808c999fSMiguel Ojeda }; 162808c999fSMiguel Ojeda } 163808c999fSMiguel Ojeda 164808c999fSMiguel Ojeda macro_rules! check_keyword_matches { 165808c999fSMiguel Ojeda (enum enum) => {}; 166808c999fSMiguel Ojeda (pub pub) => {}; 167808c999fSMiguel Ojeda (struct struct) => {}; 168808c999fSMiguel Ojeda } 169808c999fSMiguel Ojeda 170808c999fSMiguel Ojeda #[cfg(any(feature = "full", feature = "derive"))] 171808c999fSMiguel Ojeda macro_rules! return_impl_trait { 172808c999fSMiguel Ojeda ( 173808c999fSMiguel Ojeda $(#[$attr:meta])* 174808c999fSMiguel Ojeda $vis:vis fn $name:ident $args:tt -> $impl_trait:ty [$concrete:ty] $body:block 175808c999fSMiguel Ojeda ) => { 176808c999fSMiguel Ojeda #[cfg(not(docsrs))] 177808c999fSMiguel Ojeda $(#[$attr])* 178808c999fSMiguel Ojeda $vis fn $name $args -> $concrete $body 179808c999fSMiguel Ojeda 180808c999fSMiguel Ojeda #[cfg(docsrs)] 181808c999fSMiguel Ojeda $(#[$attr])* 182808c999fSMiguel Ojeda $vis fn $name $args -> $impl_trait $body 183808c999fSMiguel Ojeda }; 184808c999fSMiguel Ojeda } 185