xref: /linux/rust/syn/macros.rs (revision 784faa8eca8270671e0ed6d9d21f04bbb80fc5f7)
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