1 个不稳定版本
0.1.0 | 2022年4月15日 |
---|
2079 在 进程宏 中
943 每月下载
在 6 个库中使用了(通过 goldberg)
89KB
2K SLoC
moisture
Moisture 是一个旨在与进程宏一起使用的 Rust 语法解析库。它基于 syn、quote 和 proc-macro2。它的主要功能是遍历由 syn 提供的语法树,通过注册的回调处理单个项目,然后将令牌流返回给指定的对象。 Moisture 旨在成为 Rust 语法树的复杂处理过程的进程宏解决方案。
lib.rs
:
Moisture
是一个具有回调接口的 Rust 代码解析库。它基于 syn、quote 和 proc-macro2,并旨在与进程宏一起使用。
Moisture
的具体做法是解析整个由令牌流提供的语法树,并向某些对象发出回调以进行潜在修改。一个基本示例
use proc_macro2::{Span, TokenStream};
use quote::{quote, ToTokens};
use syn::{LitStr, Result, parse2};
use syn::spanned::Spanned;
use moisture::*;
fn str_callback(moisture: &Moisture, context: &Context, tokens: TokenStream) -> Result<TokenStream> {
let lit_str = parse2::<LitStr>(tokens.clone())?;
if lit_str.value() == "foo" { Ok(LitStr::new("bar", lit_str.span()).to_token_stream()) }
else { let result = moisture.lit_str(context, tokens)?; Ok(result) }
}
let mut moisture = Moisture::new();
moisture.register_callback(CallbackType::LitStr, str_callback);
let foo_stream = quote! { "foo" };
let bar_stream = run_moisture!(moisture, CallbackType::LitStr, foo_stream);
let bar_lit = parse2::<LitStr>(bar_stream).unwrap();
assert_eq!(bar_lit.value(), "bar");
let baz_stream = quote! { "baz" };
let same_stream = run_moisture!(moisture, CallbackType::LitStr, baz_stream);
let baz_lit = parse2::<LitStr>(same_stream).unwrap();
assert_eq!(baz_lit.value(), "baz");
支持大量的 syn 类型。有关支持 syn 类型的列表,请参阅 CallbackType
。
依赖项
~1.5MB
~35K SLoC