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