1use super::*;
2
3#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[derive(Debug, Clone, PartialEq)]
6pub enum Statement {
7 Labeled(LabeledStatement),
9 Compound(CompoundStatement),
11 Expression(ExpressionStatement),
13 Selection(SelectionStatement),
15 Iteration(IterationStatement),
17 Jump(JumpStatement),
19}
20
21impl Statement {
22 pub fn span(&self) -> core::range::Range<usize> {
24 match self {
25 Self::Labeled(n) => n.span(),
26 Self::Compound(n) => n.span.clone(),
27 Self::Expression(n) => n.span.clone(),
28 Self::Selection(n) => n.span(),
29 Self::Iteration(n) => n.span(),
30 Self::Jump(n) => n.span(),
31 }
32 }
33}
34
35#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
37#[derive(Debug, Clone, PartialEq)]
38pub enum LabeledStatement {
39 Label {
41 identifier: String,
43 statement: Box<Statement>,
45 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
47 span: core::range::Range<usize>,
48 },
49 Case {
51 constant_expression: Expression,
53 statement: Box<Statement>,
55 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
57 span: core::range::Range<usize>,
58 },
59 Default {
61 statement: Box<Statement>,
63 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
65 span: core::range::Range<usize>,
66 },
67}
68
69impl LabeledStatement {
70 pub fn span(&self) -> core::range::Range<usize> {
72 match self {
73 Self::Label { span, .. } => span.clone(),
74 Self::Case { span, .. } => span.clone(),
75 Self::Default { span, .. } => span.clone(),
76 }
77 }
78}
79
80#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
82#[derive(Debug, Clone, PartialEq)]
83pub struct CompoundStatement {
84 pub block_items: Vec<BlockItem>,
86 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
88 pub span: core::range::Range<usize>,
89}
90
91#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
93#[derive(Debug, Clone, PartialEq)]
94pub enum BlockItem {
95 Declaration(Declaration),
97 Statement(Statement),
99}
100
101impl BlockItem {
102 pub fn span(&self) -> core::range::Range<usize> {
104 match self {
105 Self::Declaration(n) => n.span.clone(),
106 Self::Statement(n) => n.span(),
107 }
108 }
109}
110
111#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
113#[derive(Debug, Clone, PartialEq)]
114pub struct ExpressionStatement {
115 pub expression: Option<Expression>,
117 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
119 pub span: core::range::Range<usize>,
120}
121
122#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
124#[derive(Debug, Clone, PartialEq)]
125pub enum SelectionStatement {
126 If {
128 condition: Expression,
130 then_statement: Box<Statement>,
132 else_statement: Option<Box<Statement>>,
134 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
136 span: core::range::Range<usize>,
137 },
138 Switch {
140 expression: Expression,
142 statement: Box<Statement>,
144 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
146 span: core::range::Range<usize>,
147 },
148}
149
150impl SelectionStatement {
151 pub fn span(&self) -> core::range::Range<usize> {
153 match self {
154 Self::If { span, .. } => span.clone(),
155 Self::Switch { span, .. } => span.clone(),
156 }
157 }
158}
159
160#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
162#[derive(Debug, Clone, PartialEq)]
163pub enum IterationStatement {
164 While {
166 condition: Expression,
168 statement: Box<Statement>,
170 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
172 span: core::range::Range<usize>,
173 },
174 DoWhile {
176 statement: Box<Statement>,
178 condition: Expression,
180 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
182 span: core::range::Range<usize>,
183 },
184 For {
186 init: Option<Expression>,
188 condition: Option<Expression>,
190 update: Option<Expression>,
192 statement: Box<Statement>,
194 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
196 span: core::range::Range<usize>,
197 },
198}
199
200impl IterationStatement {
201 pub fn span(&self) -> core::range::Range<usize> {
203 match self {
204 Self::While { span, .. } => span.clone(),
205 Self::DoWhile { span, .. } => span.clone(),
206 Self::For { span, .. } => span.clone(),
207 }
208 }
209}
210
211#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
213#[derive(Debug, Clone, PartialEq)]
214pub enum JumpStatement {
215 Goto(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
217 Continue(#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
219 Break(#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
221 Return(Option<Expression>, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
223}
224
225impl JumpStatement {
226 pub fn span(&self) -> core::range::Range<usize> {
228 match self {
229 Self::Goto(_, span) => span.clone(),
230 Self::Continue(span) => span.clone(),
231 Self::Break(span) => span.clone(),
232 Self::Return(_, span) => span.clone(),
233 }
234 }
235}