11个版本
0.5.0 | 2024年3月1日 |
---|---|
0.4.5 | 2023年9月15日 |
0.4.4 | 2023年4月20日 |
0.4.3 | 2023年2月1日 |
0.1.0 | 2021年11月29日 |
#64 在 进程宏 中
582 每月下载次数
在 22 个crate中使用 (7 直接)
47KB
1K SLoC
Syn-Helpers
用于在结构体(struct
和 enum
)上构建 derive proc 宏的框架。
处理
- 获取引用字段的表达式
- 为枚举构建模式
- 为枚举或结构体使用相同的推导逻辑
- 错误处理和生成
compile_error
输出 - 在特性和结构体上的泛型(包括冲突纠正)
此crate扩展(并重新导出)了优秀的 syn 和 quote crate。
示例
评估每个字段上的 do_thing
函数(预期那些具有 #[ignore]
属性的字段)
use syn_helpers::{
syn::{parse_quote, DeriveInput, GenericParam, Ident, Stmt}, proc_macro2::Span, quote,
derive_trait, FieldMut, HasAttributes, Trait, TraitItem, TypeOfSelf, Constructable,
};
let my_trait = Trait {
name: parse_quote!(::my_crate::MyTrait),
generic_parameters: None,
items: vec![TraitItem::new_method(
Ident::new("method_one", Span::call_site()),
None,
TypeOfSelf::Reference,
Vec::default(),
None,
|mut item| {
item.map_constructable(|mut constructable| {
Ok(constructable
.get_fields_mut()
.fields_iterator_mut()
.flat_map(|mut field| -> Option<Stmt> {
if field
.get_attributes()
.iter()
.any(|attr| attr.path().is_ident("ignore"))
{
None
} else {
let reference = field.get_reference();
Some(parse_quote!(do_thing(#reference);))
}
})
.collect())
})
},
)],
};
let r#struct: DeriveInput = parse_quote! {
struct X {
a: String,
b: i32
}
};
let stream = derive_trait(r#struct, my_trait);
assert_eq!(
stream.to_string(),
quote! {
#[automatically_derived]
impl ::my_crate::MyTrait for X {
fn method_one(&self) {
let X { a: ref _0, b: ref _1 } = self;
do_thing(_0);
do_thing(_1);
}
}
}.to_string()
)
用于
设计正在进行中
依赖项
~285–730KB
~17K SLoC