xenon_codegen/
statement.rs

1use core::fmt;
2
3use enum_as_inner::EnumAsInner;
4
5use crate::{
6    identifier::IdentifierAccess, if_statement::IfStatement, loop_statement::LoopStatement,
7    return_statement::ReturnStatement, scope::Scope, r#unsafe::Unsafe,
8    variable_assignment::VariableAssignment, variable_definition::VariableDefinition,
9    while_statement::WhileStatement,
10};
11
12#[derive(Debug, Clone, Default, EnumAsInner)]
13pub enum Statement {
14    Scope(Scope),
15    VariableDefinition(VariableDefinition),
16    VariableAssignment(VariableAssignment),
17    FunctionCall(IdentifierAccess),
18    IfStatement(IfStatement),
19    WhileStatement(WhileStatement),
20    LoopStatement(LoopStatement),
21    ReturnStatement(ReturnStatement),
22    Unsafe(Unsafe),
23    BreakStatement,
24    ContinueStatement,
25    #[default]
26    Null,
27}
28impl Statement {
29    pub fn is_valid(&self) -> bool {
30        if self.is_scope() {
31            self.as_scope().unwrap().is_valid()
32        } else if self.is_variable_definition() {
33            return self.as_variable_assignment().unwrap().is_valid();
34        } else if self.is_variable_assignment() {
35            return self.as_variable_assignment().unwrap().is_valid();
36        } else if self.is_function_call() {
37            return self.as_function_call().unwrap().is_valid();
38        } else if self.is_if_statement() {
39            return self.as_if_statement().unwrap().is_valid();
40        } else if self.is_while_statement() {
41            return self.as_while_statement().unwrap().is_valid();
42        } else if self.is_loop_statement() {
43            return self.as_loop_statement().unwrap().is_valid();
44        } else if self.is_return_statement() {
45            return self.as_return_statement().unwrap().is_valid();
46        } else if self.is_unsafe() {
47            return self.as_unsafe().unwrap().is_valid();
48        } else if self.is_break_statement() {
49            return true;
50        } else {
51            return self.is_continue_statement();
52        }
53    }
54}
55impl fmt::Display for Statement {
56    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57        if self.is_scope() {
58            match write!(fmt, "{}", self.as_scope().unwrap()) {
59                Ok(_) => (),
60                Err(e) => return Err(e),
61            }
62        } else if self.is_variable_definition() {
63            match write!(fmt, "{};", self.as_variable_definition().unwrap()) {
64                Ok(_) => (),
65                Err(e) => return Err(e),
66            }
67        } else if self.is_variable_assignment() {
68            match write!(fmt, "{};", self.as_variable_assignment().unwrap()) {
69                Ok(_) => (),
70                Err(e) => return Err(e),
71            }
72        } else if self.is_function_call() {
73            match write!(fmt, "{};", self.as_function_call().unwrap()) {
74                Ok(_) => (),
75                Err(e) => return Err(e),
76            }
77        } else if self.is_if_statement() {
78            match write!(fmt, "{}", self.as_if_statement().unwrap()) {
79                Ok(_) => (),
80                Err(e) => return Err(e),
81            }
82        } else if self.is_while_statement() {
83            match write!(fmt, "{}", self.as_while_statement().unwrap()) {
84                Ok(_) => (),
85                Err(e) => return Err(e),
86            }
87        } else if self.is_loop_statement() {
88            match write!(fmt, "{}", self.as_loop_statement().unwrap()) {
89                Ok(_) => (),
90                Err(e) => return Err(e),
91            }
92        } else if self.is_return_statement() {
93            match write!(fmt, "{};", self.as_return_statement().unwrap()) {
94                Ok(_) => (),
95                Err(e) => return Err(e),
96            }
97        } else if self.is_unsafe() {
98            match write!(fmt, "{}", self.as_unsafe().unwrap()) {
99                Ok(_) => (),
100                Err(e) => return Err(e),
101            }
102        } else if self.is_break_statement() {
103            match write!(fmt, "break;") {
104                Ok(_) => (),
105                Err(e) => return Err(e),
106            }
107        } else if self.is_continue_statement() {
108            match write!(fmt, "continue;") {
109                Ok(_) => (),
110                Err(e) => return Err(e),
111            }
112        }
113        Ok(())
114    }
115}