gather_all_code_from_crates/
parse_enum_item.rs

1crate::ix!();
2
3/// Parses an enum item from the AST node.
4pub 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