#proc-macro #parser #macro

moisture

Moisture 是一个基于 Rust 的解析库,旨在与进程宏一起使用!

1 个不稳定版本

0.1.0 2022年4月15日

2079进程宏

Download history 234/week @ 2024-03-13 318/week @ 2024-03-20 289/week @ 2024-03-27 390/week @ 2024-04-03 460/week @ 2024-04-10 343/week @ 2024-04-17 364/week @ 2024-04-24 351/week @ 2024-05-01 341/week @ 2024-05-08 251/week @ 2024-05-15 904/week @ 2024-05-22 695/week @ 2024-05-29 294/week @ 2024-06-05 147/week @ 2024-06-12 133/week @ 2024-06-19 346/week @ 2024-06-26

943 每月下载
6 个库中使用了(通过 goldberg

GPL-3.0 许可证

89KB
2K SLoC

moisture

Moisture 是一个旨在与进程宏一起使用的 Rust 语法解析库。它基于 synquoteproc-macro2。它的主要功能是遍历由 syn 提供的语法树,通过注册的回调处理单个项目,然后将令牌流返回给指定的对象。 Moisture 旨在成为 Rust 语法树的复杂处理过程的进程宏解决方案。

变更日志可以在 这里 找到,更详细的文档可以在 这里 找到。


lib.rs:

Moisture 是一个具有回调接口的 Rust 代码解析库。它基于 synquoteproc-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