src5_rs/core/parser/
cairo_enum.rs1use 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 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 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 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 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 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";