xenon_codegen/
statement.rs1use 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}