1fad3a1d3Sopenharmony_ci/// Parse the input TokenStream of a macro, triggering a compile error if the
2fad3a1d3Sopenharmony_ci/// tokens fail to parse.
3fad3a1d3Sopenharmony_ci///
4fad3a1d3Sopenharmony_ci/// Refer to the [`parse` module] documentation for more details about parsing
5fad3a1d3Sopenharmony_ci/// in Syn.
6fad3a1d3Sopenharmony_ci///
7fad3a1d3Sopenharmony_ci/// [`parse` module]: mod@crate::parse
8fad3a1d3Sopenharmony_ci///
9fad3a1d3Sopenharmony_ci/// <br>
10fad3a1d3Sopenharmony_ci///
11fad3a1d3Sopenharmony_ci/// # Intended usage
12fad3a1d3Sopenharmony_ci///
13fad3a1d3Sopenharmony_ci/// This macro must be called from a function that returns
14fad3a1d3Sopenharmony_ci/// `proc_macro::TokenStream`. Usually this will be your proc macro entry point,
15fad3a1d3Sopenharmony_ci/// the function that has the #\[proc_macro\] / #\[proc_macro_derive\] /
16fad3a1d3Sopenharmony_ci/// #\[proc_macro_attribute\] attribute.
17fad3a1d3Sopenharmony_ci///
18fad3a1d3Sopenharmony_ci/// ```
19fad3a1d3Sopenharmony_ci/// # extern crate proc_macro;
20fad3a1d3Sopenharmony_ci/// #
21fad3a1d3Sopenharmony_ci/// use proc_macro::TokenStream;
22fad3a1d3Sopenharmony_ci/// use syn::{parse_macro_input, Result};
23fad3a1d3Sopenharmony_ci/// use syn::parse::{Parse, ParseStream};
24fad3a1d3Sopenharmony_ci///
25fad3a1d3Sopenharmony_ci/// struct MyMacroInput {
26fad3a1d3Sopenharmony_ci///     /* ... */
27fad3a1d3Sopenharmony_ci/// }
28fad3a1d3Sopenharmony_ci///
29fad3a1d3Sopenharmony_ci/// impl Parse for MyMacroInput {
30fad3a1d3Sopenharmony_ci///     fn parse(input: ParseStream) -> Result<Self> {
31fad3a1d3Sopenharmony_ci///         /* ... */
32fad3a1d3Sopenharmony_ci/// #       Ok(MyMacroInput {})
33fad3a1d3Sopenharmony_ci///     }
34fad3a1d3Sopenharmony_ci/// }
35fad3a1d3Sopenharmony_ci///
36fad3a1d3Sopenharmony_ci/// # const IGNORE: &str = stringify! {
37fad3a1d3Sopenharmony_ci/// #[proc_macro]
38fad3a1d3Sopenharmony_ci/// # };
39fad3a1d3Sopenharmony_ci/// pub fn my_macro(tokens: TokenStream) -> TokenStream {
40fad3a1d3Sopenharmony_ci///     let input = parse_macro_input!(tokens as MyMacroInput);
41fad3a1d3Sopenharmony_ci///
42fad3a1d3Sopenharmony_ci///     /* ... */
43fad3a1d3Sopenharmony_ci/// #   TokenStream::new()
44fad3a1d3Sopenharmony_ci/// }
45fad3a1d3Sopenharmony_ci/// ```
46fad3a1d3Sopenharmony_ci///
47fad3a1d3Sopenharmony_ci/// <br>
48fad3a1d3Sopenharmony_ci///
49fad3a1d3Sopenharmony_ci/// # Usage with Parser
50fad3a1d3Sopenharmony_ci///
51fad3a1d3Sopenharmony_ci/// This macro can also be used with the [`Parser` trait] for types that have
52fad3a1d3Sopenharmony_ci/// multiple ways that they can be parsed.
53fad3a1d3Sopenharmony_ci///
54fad3a1d3Sopenharmony_ci/// [`Parser` trait]: crate::parse::Parser
55fad3a1d3Sopenharmony_ci///
56fad3a1d3Sopenharmony_ci/// ```
57fad3a1d3Sopenharmony_ci/// # extern crate proc_macro;
58fad3a1d3Sopenharmony_ci/// #
59fad3a1d3Sopenharmony_ci/// # use proc_macro::TokenStream;
60fad3a1d3Sopenharmony_ci/// # use syn::{parse_macro_input, Result};
61fad3a1d3Sopenharmony_ci/// # use syn::parse::ParseStream;
62fad3a1d3Sopenharmony_ci/// #
63fad3a1d3Sopenharmony_ci/// # struct MyMacroInput {}
64fad3a1d3Sopenharmony_ci/// #
65fad3a1d3Sopenharmony_ci/// impl MyMacroInput {
66fad3a1d3Sopenharmony_ci///     fn parse_alternate(input: ParseStream) -> Result<Self> {
67fad3a1d3Sopenharmony_ci///         /* ... */
68fad3a1d3Sopenharmony_ci/// #       Ok(MyMacroInput {})
69fad3a1d3Sopenharmony_ci///     }
70fad3a1d3Sopenharmony_ci/// }
71fad3a1d3Sopenharmony_ci///
72fad3a1d3Sopenharmony_ci/// # const IGNORE: &str = stringify! {
73fad3a1d3Sopenharmony_ci/// #[proc_macro]
74fad3a1d3Sopenharmony_ci/// # };
75fad3a1d3Sopenharmony_ci/// pub fn my_macro(tokens: TokenStream) -> TokenStream {
76fad3a1d3Sopenharmony_ci///     let input = parse_macro_input!(tokens with MyMacroInput::parse_alternate);
77fad3a1d3Sopenharmony_ci///
78fad3a1d3Sopenharmony_ci///     /* ... */
79fad3a1d3Sopenharmony_ci/// #   TokenStream::new()
80fad3a1d3Sopenharmony_ci/// }
81fad3a1d3Sopenharmony_ci/// ```
82fad3a1d3Sopenharmony_ci///
83fad3a1d3Sopenharmony_ci/// <br>
84fad3a1d3Sopenharmony_ci///
85fad3a1d3Sopenharmony_ci/// # Expansion
86fad3a1d3Sopenharmony_ci///
87fad3a1d3Sopenharmony_ci/// `parse_macro_input!($variable as $Type)` expands to something like:
88fad3a1d3Sopenharmony_ci///
89fad3a1d3Sopenharmony_ci/// ```no_run
90fad3a1d3Sopenharmony_ci/// # extern crate proc_macro;
91fad3a1d3Sopenharmony_ci/// #
92fad3a1d3Sopenharmony_ci/// # macro_rules! doc_test {
93fad3a1d3Sopenharmony_ci/// #     ($variable:ident as $Type:ty) => {
94fad3a1d3Sopenharmony_ci/// match syn::parse::<$Type>($variable) {
95fad3a1d3Sopenharmony_ci///     Ok(syntax_tree) => syntax_tree,
96fad3a1d3Sopenharmony_ci///     Err(err) => return proc_macro::TokenStream::from(err.to_compile_error()),
97fad3a1d3Sopenharmony_ci/// }
98fad3a1d3Sopenharmony_ci/// #     };
99fad3a1d3Sopenharmony_ci/// # }
100fad3a1d3Sopenharmony_ci/// #
101fad3a1d3Sopenharmony_ci/// # fn test(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
102fad3a1d3Sopenharmony_ci/// #     let _ = doc_test!(input as syn::Ident);
103fad3a1d3Sopenharmony_ci/// #     proc_macro::TokenStream::new()
104fad3a1d3Sopenharmony_ci/// # }
105fad3a1d3Sopenharmony_ci/// ```
106fad3a1d3Sopenharmony_ci#[macro_export]
107fad3a1d3Sopenharmony_ci#[cfg_attr(doc_cfg, doc(cfg(all(feature = "parsing", feature = "proc-macro"))))]
108fad3a1d3Sopenharmony_cimacro_rules! parse_macro_input {
109fad3a1d3Sopenharmony_ci    ($tokenstream:ident as $ty:ty) => {
110fad3a1d3Sopenharmony_ci        match $crate::parse::<$ty>($tokenstream) {
111fad3a1d3Sopenharmony_ci            $crate::__private::Ok(data) => data,
112fad3a1d3Sopenharmony_ci            $crate::__private::Err(err) => {
113fad3a1d3Sopenharmony_ci                return $crate::__private::TokenStream::from(err.to_compile_error());
114fad3a1d3Sopenharmony_ci            }
115fad3a1d3Sopenharmony_ci        }
116fad3a1d3Sopenharmony_ci    };
117fad3a1d3Sopenharmony_ci    ($tokenstream:ident with $parser:path) => {
118fad3a1d3Sopenharmony_ci        match $crate::parse::Parser::parse($parser, $tokenstream) {
119fad3a1d3Sopenharmony_ci            $crate::__private::Ok(data) => data,
120fad3a1d3Sopenharmony_ci            $crate::__private::Err(err) => {
121fad3a1d3Sopenharmony_ci                return $crate::__private::TokenStream::from(err.to_compile_error());
122fad3a1d3Sopenharmony_ci            }
123fad3a1d3Sopenharmony_ci        }
124fad3a1d3Sopenharmony_ci    };
125fad3a1d3Sopenharmony_ci    ($tokenstream:ident) => {
126fad3a1d3Sopenharmony_ci        $crate::parse_macro_input!($tokenstream as _)
127fad3a1d3Sopenharmony_ci    };
128fad3a1d3Sopenharmony_ci}
129