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