gather_all_code_from_crates/
parse_enum_item.rs1crate::ix!();
2
3pub fn parse_enum_item(en: ast::Enum, remove_doc_comments: bool) -> ItemInfo {
5 let (attributes, _is_test) = extract_attributes(en.attrs());
6 let is_public = en.visibility().map_or(false, |v| v.syntax().text().to_string().contains("pub"));
7 let name = en.name().map(|n| n.text().to_string()).unwrap_or_default();
8
9 let original_text = en.syntax().text().to_string();
10 let filtered = filter_doc_comments(&original_text, remove_doc_comments);
11
12 ItemInfo::Enum {
13 name,
14 attributes,
15 is_public,
16 signature: filtered.trim_end().to_string(),
17 }
18}
19
20#[cfg(test)]
21mod parse_enum_item_tests {
22 use super::*;
23
24 #[test]
25 fn test_parse_enum_item() {
26 let code = r#"
27#[repr(u8)]
28pub enum MyEnum {
29 A,
30 B,
31}
32"#;
33 let syntax = parse_source(code);
34 let en = syntax.descendants().find_map(ast::Enum::cast).unwrap();
35 let item = parse_enum_item(en, false);
36 if let ItemInfo::Enum { name, attributes, is_public, signature } = item {
37 assert_eq!(name, "MyEnum");
38 assert!(is_public);
39 assert!(attributes.iter().any(|a| a.contains("#[repr(u8)]")));
40 assert!(signature.contains("pub enum MyEnum {"));
41 assert!(signature.contains("A,"));
42 } else {
43 panic!("Expected an enum item");
44 }
45 }
46
47 #[test]
48 fn test_parse_enum_item_basic() {
49 let code = r#"
50#[repr(u8)]
51pub enum MyEnum {
52 A,
53 B,
54}
55"#;
56 let syntax = parse_source(code);
57 let en = syntax.descendants().find_map(ast::Enum::cast).unwrap();
58 let item = parse_enum_item(en, false);
59 if let ItemInfo::Enum { name, attributes, is_public, signature } = item {
60 assert_eq!(name, "MyEnum");
61 assert!(is_public);
62 assert!(attributes.iter().any(|a| a.contains("#[repr(u8)]")));
63 assert!(signature.contains("pub enum MyEnum {"));
64 assert!(signature.contains("A,"));
65 } else {
66 panic!("Expected an enum item");
67 }
68 }
69
70 #[test]
71 fn test_parse_enum_item_private() {
72 let code = r#"
73enum PrivateEnum { X, Y }
74"#;
75 let syntax = parse_source(code);
76 let en = syntax.descendants().find_map(ast::Enum::cast).unwrap();
77 let item = parse_enum_item(en, false);
78 if let ItemInfo::Enum { name, is_public, signature, .. } = item {
79 assert_eq!(name, "PrivateEnum");
80 assert!(!is_public);
81 assert!(signature.contains("enum PrivateEnum {"));
82 } else {
83 panic!("Expected an enum item");
84 }
85 }
86
87 #[test]
88 fn test_parse_enum_item_remove_doc_comments() {
89 let code = r#"
90/// A documented enum
91enum DocEnum { Variant }
92"#;
93 let syntax = parse_source(code);
94 let en = syntax.descendants().find_map(ast::Enum::cast).unwrap();
95
96 let item = parse_enum_item(en.clone(), true);
97 if let ItemInfo::Enum { signature, .. } = item {
98 assert!(!signature.contains("/// A documented enum"));
99 }
100
101 let item = parse_enum_item(en.clone(), false);
102 if let ItemInfo::Enum { signature, .. } = item {
103 assert!(signature.contains("/// A documented enum"));
104 }
105 }
106}
107
108