rust - 如何从 `syn::Signature` 解析 `syn::parse::ParseStream` ?

标签 rust macros rust-proc-macros

我正在试验 Rust 过程宏。

我希望能够创建一个用于生成 JNI 调用样板的宏。有点像

jni_method!{com.purplefrog.rust_callable.Widget, fn echo_str(&str)->String}

到目前为止我有以下代码 ( playground ):

#[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,
        })
    }
}

不幸的是,parse_signature 调用出错了:

error[E0603]: module `item` is private
   --> src/lib.rs:17:18
    |
17  |             syn::item::parsing::parse_signature(tokens)?;
    |                  ^^^^ private module
    |
note: the module `item` is defined here
   --> /playground/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.33/src/lib.rs:363:1
    |
363 | mod item;
    | ^^^^^^^^^

ParseStream 解析 Signature 的正确方法是什么?

最佳答案

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

  • Fn* 特征签名(例如 FnMut(usize) -> bool)

    解析为 syn::TraitBound(为了捕获不存在于一条路径中的生命周期边界),然后您可以从最后一段的括号内的参数中获取输入/输出trait bound 的路径。

  • 裸函数,又名函数指针(例如 fn(usize) -> bool)

    解析成syn::TypeBareFn,就可以直接得到输入/输出。

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

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

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

    解析为 Struct syn::ForeignItemFn,其中包含一个签名。请注意,这适用于 extern block 中的声明,因此这实际上可能不是您要查找的内容。

关于rust - 如何从 `syn::Signature` 解析 `syn::parse::ParseStream` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63118772/

相关文章:

rust - 如何将 [u64;N] 转换为 [u8;8*N]?

macros - 方案中的这个定义语法宏有什么问题?

比较 C 中的名称类型

rust - 过程宏可以作为函数进行调试吗?

rust - 无法使用 syn/darling 获取字段属性

enums - 为特定变体派生特征

macros - 克服 Rust 宏中的 "local ambiguity: multiple parsing options:"

rust - 程序宏如何检查Option <Option <T >>的泛型类型并将其展平为单个Option?

rust - 如何在处理数据流时有效地构建向量和该向量的索引?

macros - 使用Haxe宏实例化带有参数的类