gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:37:07 25 4
gpt4 key购买 nike

我正在试验 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com