use proc_macro::TokenStream; use quote::quote; use syn::{parse_macro_input, ItemFn}; #[proc_macro_attribute] pub fn my_attribute(_attr: TokenStream, item: TokenStream) -> TokenStream { let input = parse_macro_input!(item as ItemFn); let name = &input.sig.ident; let block = &inpu...
useproc_macro::TokenStream;usequote::quote;usesyn::{parse_macro_input, DeriveInput};#[proc_macro_derive(MyMacro)]pubfnmy_macro(input: TokenStream)->TokenStream {// 将输入的标记解析成语法树letinput= parse_macro_input!(inputasDeriveInput);// 使用quote!进行插值处理letexpanded= quote! {// .....
首先通过sync对input进行解析, 得到一个DeriveInput usesyn::{parse_macro_input,DeriveInput};letinput=parse_macro_input!(inputasDeriveInput); 其中DeriveInput包含了 struct 的所有信息, 包括ident(结构体名字)和里面的字段 , 派生宏只能被用于结构体,枚举,Union usesyn::{parse_macro_input,Data,DeriveInput}...
使用parse_macro_input 解析到DeriveInput 获取struct name TokenStream 使用quote! 扩展改结构体 代码语言:rust 复制 #[proc_macro_derive(Hello)] pub fn hello_derive(input: TokenStream)->TokenStream { let input = parse_macro_input!(input as DeriveInput); println!("{:?}", input.ident.to_token_st...
比如 syn 的 Parse trait,就非常值得聊一聊 —— 我们通过 parse_macro_input!(input as DeriveInput) 之所以能把 TokenStream 转换成 DeriveInput,就是因为 DeriveInput 实现了 Parse trait。再比如,sqlx 里 query 宏,就为其内部数据结构 QueryMacroInput 也实现了它。所以才可以这么用:...
syncrate中的ItemFn含有被解析的一个Rust函数里的TokenStream。parse_macro_input!是syn提供的一个很有用的宏。 2. 单独导出(The lone export) 使用#[proc_macro_attribute]来标注我们的crate中...
#[proc_macro_attribute] pub fn pymodule(args: TokenStream, input: TokenStream) -> TokenStream { parse_macro_input!(args as Nothing); // 整体还是可以理解的,把我们输入的函数转换为ast, 并看看ast语法便以上有没有错误 let mut ast = parse_macro_input!(input as syn::ItemFn); ...
喜欢:#[macro(Arg1, Arg2)]问题是我找不到正确的结构来解析它。我尝试将其解析为MetaandMetaList但它们似乎都不起作用。pub fn some_macro(args: TokenStream, item: TokenStream) -> TokenStream { let args_parsed = parse_macro_input!(args as MetaList); /// let args_parsed = parse_macro_input!
今天尝试下使用Rust中的过程宏来实现类似功能。 实践 流程: 使用Syn库中的parse_macro_input解析DeriveInput 遍历目标对象Fields域 使用format_ident!拼接生成函数名称 使用quote库中quote!生成TokenStream段 生成目标的impl方法 稍微复杂点就是quote子段,附加到主lombok_data_fun的过程。
useproc_macro::TokenStream;usesyn::{parse_macro_input, DeriveInput};#[proc_macro_derive(Builder, attributes(builder))]pubfnbuilder_derive(input: TokenStream)->TokenSteam {letinput=parse_macro_input(inputasDeriveInput);// 从 data中获取 fields 字段数据集合letfields= ...;letsetter_fns= fields....