Rust 如何从“syn::parse::ParseStream”解析“syn::Signature”?

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调用样板的宏。差不多

jni_method!{com.purplefrog.rust_callable.Widget, fn echo_str(&str)->String}
到目前为止,我有以下代码():


解析流
解析
签名
的正确方法是什么?

为什么需要
签名
?根据您实际试图解析的内容,您应该使用以下选项之一:

  • Fn*
    trait signature
    (例如
    FnMut(usize)->bool

    解析为
    syn::TraitBound
    (为了捕获不存在于just a path中的生存期边界),然后可以从trait绑定路径最后一段的括号参数中获取输入/输出

  • 裸函数,也称为函数指针(例如
    fn(usize)->bool

    解析为
    syn::TypeBareFn
    ,然后可以直接获取输入/输出

  • 函数定义,包括一个body(例如
    fn foo(x:usize)->bool{x>5}

    解析为包含签名的
    syn::ItemFn

  • 外部函数定义(例如
    fn foo(x:usize)->bool

    解析为包含签名的
    Struct syn::foreignitmfn
    。请注意,这是针对
    extern
    块中的声明,所以很可能这并不是您真正想要的


TraitBound缺少函数的名称。我最终通过解析Ident和TypeBareFn解决了我的问题,但这使得语法有点不雅观。ItemFn包含一个主体,这会让宏的用户感到困惑。ForeignItemFn可能是一个不错的选择,尽管它包含了参数名,这在技术上是不必要的,但可能有助于人们以后阅读代码?我担心你可能走错了方向。您能否更新您的问题,为宏提供一个示例输入以及如何使用宏?我已经添加了如何使用宏的想法。
#[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,
        })
    }
}