src5_rs/core/parser/
cairo_enum.rs

1// Module for handling Cairo enums
2use cairo_lang_compiler::db::RootDatabase;
3use cairo_lang_syntax::node::kind::SyntaxKind;
4use cairo_lang_syntax::node::SyntaxNode;
5
6use super::ast::get_syntax_tree;
7use super::utils::find_children;
8
9#[derive(Debug)]
10pub struct CairoEnum {
11    pub name: String,
12    pub generics: Vec<String>,
13    pub variants_types: Vec<SyntaxNode>,
14}
15
16pub fn get_corelib_enums(db: &RootDatabase) -> Vec<CairoEnum> {
17    // Get the syntax tree
18    let tree = get_syntax_tree(db, CORELIB_ENUMS.into());
19
20    get_cairo_enums_no_corelib(db, &tree)
21}
22
23pub fn get_cairo_enums(db: &RootDatabase, syntax_tree: &SyntaxNode) -> Vec<CairoEnum> {
24    let mut cairo_enums = get_cairo_enums_no_corelib(db, syntax_tree);
25    // Include corelib structs
26    cairo_enums.extend(get_corelib_enums(db));
27    cairo_enums
28}
29
30fn get_cairo_enums_no_corelib(db: &RootDatabase, syntax_tree: &SyntaxNode) -> Vec<CairoEnum> {
31    let mut cairo_enums = Vec::new();
32    for node in syntax_tree.descendants(db) {
33        if SyntaxKind::ItemEnum == node.kind(db) {
34            // Look up the Enum name
35            let id_node = find_children(db, &node, SyntaxKind::TerminalIdentifier).unwrap();
36            let enum_name = id_node.get_text_without_trivia(db);
37
38            let mut struct_members_types = Vec::new();
39            let mut struct_generics = Vec::new();
40
41            // Look up the Enum variants types
42            let members_node = find_children(db, &node, SyntaxKind::MemberList).unwrap();
43            for node in members_node.descendants(db) {
44                if node.kind(db) == SyntaxKind::TypeClause {
45                    struct_members_types.push(node);
46                }
47            }
48            // Look up the Enum generics
49            if let Some(child) = find_children(db, &node, SyntaxKind::WrappedGenericParamList) {
50                for node in child.descendants(db) {
51                    if node.kind(db) == SyntaxKind::GenericParamType {
52                        let generic_type = node.get_text_without_trivia(db);
53                        struct_generics.push(generic_type);
54                    }
55                }
56            }
57            cairo_enums.push(CairoEnum {
58                name: enum_name,
59                generics: struct_generics,
60                variants_types: struct_members_types,
61            });
62        }
63    }
64    cairo_enums
65}
66
67const CORELIB_ENUMS: &str = "
68enum bool {
69    True: (),
70    False: (),
71}
72enum U128sFromFelt252Result {
73    Narrow: u128,
74    Wide: (u128, u128),
75}
76enum never {}
77enum FromNullableResult<T> {
78    Null: (),
79    NotNull: Box<T>,
80}
81enum Option<T> {
82    Some: T,
83    None: (),
84}
85enum PanicResult<T> {
86    Ok: T,
87    Err: (Panic, Array<felt252>),
88}
89enum Result<T, E> {
90    Ok: T,
91    Err: E,
92}
93enum IsZeroResult<T> {
94    Zero: (),
95    NonZero: NonZero<T>,
96}
97";