Rust 如何从“syn::parse::ParseStream”解析“syn::Signature”?
我正在试验程序宏 我希望能够创建一个用于生成JNI调用样板的宏。差不多Rust 如何从“syn::parse::ParseStream”解析“syn::Signature”?,rust,macros,rust-proc-macros,Rust,Macros,Rust Proc Macros,我正在试验程序宏 我希望能够创建一个用于生成JNI调用样板的宏。差不多 jni_method!{com.purplefrog.rust_callable.Widget, fn echo_str(&str)->String} 到目前为止,我有以下代码(): 从解析流解析签名的正确方法是什么?为什么需要签名?根据您实际试图解析的内容,您应该使用以下选项之一: Fn*trait signature(例如FnMut(usize)->bool) 解析为syn::TraitBound(为了
jni_method!{com.purplefrog.rust_callable.Widget, fn echo_str(&str)->String}
到目前为止,我有以下代码():
从
解析流
解析签名
的正确方法是什么?为什么需要签名
?根据您实际试图解析的内容,您应该使用以下选项之一:
trait signature(例如Fn*
) 解析为FnMut(usize)->bool
(为了捕获不存在于just a path中的生存期边界),然后可以从trait绑定路径最后一段的括号参数中获取输入/输出syn::TraitBound
- 裸函数,也称为函数指针(例如
) 解析为fn(usize)->bool
,然后可以直接获取输入/输出syn::TypeBareFn
- 函数定义,包括一个body(例如
) 解析为包含签名的fn foo(x:usize)->bool{x>5}
syn::ItemFn
- 外部函数定义(例如
) 解析为包含签名的fn foo(x:usize)->bool
。请注意,这是针对Struct syn::foreignitmfn
块中的声明,所以很可能这并不是您真正想要的extern
#[macro_use]
extern crate syn; // 1.0.33
use syn::parse::{Parse, ParseStream};
use syn::Signature;
struct Arguments {
name: proc_macro2::Ident,
signature: Signature,
}
impl Parse for Arguments {
fn parse(tokens: ParseStream) -> Result<Arguments, syn::Error> {
let name: proc_macro2::Ident = tokens.parse()?;
let comma: Token![,] = tokens.parse()?;
let signature: Signature = //tokens.parse()?;
syn::item::parsing::parse_signature(tokens)?;
Ok(Arguments {
name: name,
signature,
})
}
}