teo_parser/ast/
enum.rs

1use std::cell::RefCell;
2use crate::value::value::Value;
3use crate::ast::argument_list_declaration::ArgumentListDeclaration;
4
5use crate::ast::callable_variant::CallableVariant;
6use crate::ast::doc_comment::DocComment;
7use crate::ast::decorator::Decorator;
8use crate::ast::expression::Expression;
9use crate::ast::identifier::Identifier;
10use crate::{declare_container_node, impl_container_node_defaults, node_child_fn, node_children_iter, node_children_iter_fn, node_optional_child_fn};
11use crate::format::Writer;
12use crate::traits::has_availability::HasAvailability;
13use crate::traits::info_provider::InfoProvider;
14use crate::traits::node_trait::NodeTrait;
15use crate::traits::resolved::Resolve;
16use crate::traits::write::Write;
17
18declare_container_node!(Enum, named, availability,
19    pub interface: bool,
20    pub option: bool,
21    pub(crate) comment: Option<usize>,
22    pub(crate) decorators: Vec<usize>,
23    pub(crate) identifier: usize,
24    pub(crate) members: Vec<usize>,
25);
26
27impl_container_node_defaults!(Enum, named, availability);
28
29node_children_iter!(Enum, Decorator, EnumDecoratorsIter, decorators);
30
31node_children_iter!(Enum, EnumMember, EnumMembersIter, members);
32
33impl Enum {
34
35    node_optional_child_fn!(comment, DocComment);
36
37    node_child_fn!(identifier, Identifier);
38
39    node_children_iter_fn!(decorators, EnumDecoratorsIter);
40
41    node_children_iter_fn!(members, EnumMembersIter);
42}
43
44impl InfoProvider for Enum {
45    fn namespace_skip(&self) -> usize {
46        1
47    }
48}
49
50declare_container_node!(EnumMember, named, availability,
51    pub(crate) comment: Option<usize>,
52    pub(crate) decorators: Vec<usize>,
53    pub(crate) identifier: usize,
54    pub(crate) expression: Option<usize>,
55    pub(crate) argument_list_declaration: Option<usize>,
56    pub(crate) resolved: RefCell<Option<Value>>,
57);
58
59impl_container_node_defaults!(EnumMember, named, availability);
60
61node_children_iter!(EnumMember, Decorator, EnumMemberDecoratorsIter, decorators);
62
63impl EnumMember {
64
65    node_optional_child_fn!(comment, DocComment);
66
67    node_children_iter_fn!(decorators, EnumMemberDecoratorsIter);
68
69    node_child_fn!(identifier, Identifier);
70
71    node_optional_child_fn!(expression, Expression);
72
73    node_optional_child_fn!(argument_list_declaration, ArgumentListDeclaration);
74
75    pub fn callable_variants(&self) -> Vec<CallableVariant> {
76        self.argument_list_declaration().map(|a| CallableVariant {
77            generics_declarations: vec![],
78            argument_list_declaration: Some(a),
79            generics_constraints: vec![],
80            pipeline_input: None,
81            pipeline_output: None,
82        }).into_iter().collect()
83    }
84}
85
86impl InfoProvider for EnumMember {
87    fn namespace_skip(&self) -> usize {
88        2
89    }
90}
91
92impl Resolve<Value> for EnumMember {
93
94    fn resolved_ref_cell(&self) -> &RefCell<Option<Value>> {
95        &self.resolved
96    }
97}
98
99impl Write for Enum {
100    fn write<'a>(&'a self, writer: &mut Writer<'a>) {
101        writer.write_children(self, self.children.values());
102    }
103
104    fn is_block_level_element(&self) -> bool {
105        true
106    }
107}
108
109impl Write for EnumMember {
110    fn write<'a>(&'a self, writer: &mut Writer<'a>) {
111        writer.write_children(self, self.children.values());
112    }
113
114    fn is_block_level_element(&self) -> bool {
115        true
116    }
117}