6个版本 (3个重大更新)
0.4.2 | 2020年1月22日 |
---|---|
0.4.1 | 2019年12月26日 |
0.3.0 | 2019年7月9日 |
0.2.1 |
|
0.1.1 | 2018年10月30日 |
在过程宏中排名第1740
17,178次每月下载
在9个crates中使用 (直接使用3个)
18KB
376 行代码
Rust过程宏的辅助API
这个crates提供了过程宏的辅助API。请参阅docs.rs上的API文档
操作属性的API
use proc_macro2::Span;
use syn::LitStr;
fn lit_str(s: &str) -> Lit {
Lit::Str(LitStr::new(s, Span::call_site()))
}
fn test_contains_attribute_impl() {
let attr: Attribute = parse_quote!(#[level0(level1, level1_1(level2, level2_1 = "hello"))]);
let attr = [attr];
assert!(!contains_attribute(&attr, &[]));
assert!(!contains_attribute(&attr, &["not"]));
assert!(!contains_attribute(&attr, &["level0"]));
assert!(contains_attribute(&attr, &["level0", "level1"]));
assert!(!contains_attribute(&attr, &["level0", "level1_1"]),);
assert!(contains_attribute(&attr, &["level0", "level1_1", "level2"]),);
assert!(!contains_attribute(
&attr,
&["level0", "level1_1", "level2_1"]
),);
}
#[test]
fn test_get_attribute_value() {
let attr: Attribute = parse_quote!(#[level0(level1 = "hi", level1_1(level2 = "bye"))]);
let attr = [attr];
assert_eq!(get_attribute_value(&attr, &[""]), None);
assert_eq!(get_attribute_value(&attr, &["not"]), None);
assert_eq!(get_attribute_value(&attr, &["level0"]), None);
assert_eq!(
get_attribute_value(&attr, &["level0", "level1"]),
Some(lit_str("hi"))
);
assert_eq!(get_attribute_value(&attr, &["level0", "level1_1"]), None);
assert_eq!(
get_attribute_value(&attr, &["level0", "level1_1", "level2"]),
Some(lit_str("bye"))
);
}
#[test]
fn test_get_attribute_map() {
assert_eq!(
get_attribute_map(
&[
parse_quote!(#[level9]),
parse_quote!(#[level0(level8)]),
parse_quote!(#[level0(level1 = "hi", level1_1(level2 = "bye"))]),
parse_quote!(#[level0(level1 = "hi", level1_1(level2 = "bye"))]),
parse_quote!(#[gen0(gen1 = "amoeba", gen1_1 = "monad", gen1_2(gen2 = "monoid"))])
],
"."
),
vec![
("level9".to_string(), vec![]),
("level0.level8".to_string(), vec![]),
(
"level0.level1".to_string(),
vec![lit_str("hi"), lit_str("hi")],
),
(
"level0.level1_1.level2".to_string(),
vec![lit_str("bye"), lit_str("bye")],
),
("gen0.gen1".to_string(), vec![lit_str("amoeba")]),
("gen0.gen1_1".to_string(), vec![lit_str("monad")]),
("gen0.gen1_2.gen2".to_string(), vec![lit_str("monoid")]),
]
.into_iter()
.collect()
);
}
依赖关系
~1.5MB
~35K SLoC