1use super::*;
2
3#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[derive(Debug, Clone, PartialEq)]
6pub struct Expression {
7 pub kind: Box<ExpressionKind>,
9 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
11 pub span: core::range::Range<usize>,
12}
13
14#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16#[derive(Debug, Clone, PartialEq)]
17pub enum ExpressionKind {
18 Identifier(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
20 Constant(Constant, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
22 StringLiteral(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
24 ArraySubscript {
26 array: Box<Expression>,
28 index: Box<Expression>,
30 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
32 span: core::range::Range<usize>,
33 },
34 FunctionCall {
36 function: Box<Expression>,
38 arguments: Vec<Expression>,
40 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
42 span: core::range::Range<usize>,
43 },
44 MemberAccess {
46 object: Box<Expression>,
48 member: String,
50 is_pointer: bool,
52 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
54 span: core::range::Range<usize>,
55 },
56 PostfixIncDec {
58 operand: Box<Expression>,
60 is_increment: bool,
62 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
64 span: core::range::Range<usize>,
65 },
66 PrefixIncDec {
68 operand: Box<Expression>,
70 is_increment: bool,
72 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
74 span: core::range::Range<usize>,
75 },
76 Unary {
78 operator: UnaryOperator,
80 operand: Box<Expression>,
82 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
84 span: core::range::Range<usize>,
85 },
86 Cast {
88 type_name: Box<TypeName>,
90 expression: Box<Expression>,
92 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
94 span: core::range::Range<usize>,
95 },
96 Binary {
98 left: Box<Expression>,
100 operator: BinaryOperator,
102 right: Box<Expression>,
104 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
106 span: core::range::Range<usize>,
107 },
108 Conditional {
110 condition: Box<Expression>,
112 then_expr: Box<Expression>,
114 else_expr: Box<Expression>,
116 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
118 span: core::range::Range<usize>,
119 },
120 Assignment {
122 left: Box<Expression>,
124 operator: AssignmentOperator,
126 right: Box<Expression>,
128 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
130 span: core::range::Range<usize>,
131 },
132 Comma {
134 expressions: Vec<Expression>,
136 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138 span: core::range::Range<usize>,
139 },
140}
141
142impl ExpressionKind {
143 pub fn span(&self) -> core::range::Range<usize> {
145 match self {
146 Self::Identifier(_, span) => span.clone(),
147 Self::Constant(_, span) => span.clone(),
148 Self::StringLiteral(_, span) => span.clone(),
149 Self::ArraySubscript { span, .. } => span.clone(),
150 Self::FunctionCall { span, .. } => span.clone(),
151 Self::MemberAccess { span, .. } => span.clone(),
152 Self::PostfixIncDec { span, .. } => span.clone(),
153 Self::PrefixIncDec { span, .. } => span.clone(),
154 Self::Unary { span, .. } => span.clone(),
155 Self::Cast { span, .. } => span.clone(),
156 Self::Binary { span, .. } => span.clone(),
157 Self::Conditional { span, .. } => span.clone(),
158 Self::Assignment { span, .. } => span.clone(),
159 Self::Comma { span, .. } => span.clone(),
160 }
161 }
162}
163
164#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
166#[derive(Debug, Clone, PartialEq)]
167pub enum Constant {
168 Integer(i64, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
170 Float(f64, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
172 Character(char, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
174}
175
176impl Constant {
177 pub fn span(&self) -> core::range::Range<usize> {
179 match self {
180 Self::Integer(_, span) => span.clone(),
181 Self::Float(_, span) => span.clone(),
182 Self::Character(_, span) => span.clone(),
183 }
184 }
185}
186
187#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
189#[derive(Debug, Clone, Copy, PartialEq, Eq)]
190pub enum UnaryOperator {
191 AddressOf,
193 Indirection,
195 Plus,
197 Minus,
199 BitNot,
201 LogicalNot,
203 Sizeof,
205}
206
207#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
209#[derive(Debug, Clone, Copy, PartialEq, Eq)]
210pub enum BinaryOperator {
211 Multiply,
213 Divide,
215 Modulo,
217 Add,
219 Subtract,
221 ShiftLeft,
223 ShiftRight,
225 Less,
227 Greater,
229 LessEqual,
231 GreaterEqual,
233 Equal,
235 NotEqual,
237 BitAnd,
239 BitXor,
241 BitOr,
243 LogicalAnd,
245 LogicalOr,
247}
248
249#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
251#[derive(Debug, Clone, Copy, PartialEq, Eq)]
252pub enum AssignmentOperator {
253 Assign,
255 MulAssign,
257 DivAssign,
259 ModAssign,
261 AddAssign,
263 SubAssign,
265 ShlAssign,
267 ShrAssign,
269 AndAssign,
271 XorAssign,
273 OrAssign,
275}
276
277#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
279#[derive(Debug, Clone, PartialEq)]
280pub struct TypeName {
281 pub specifier_qualifiers: Vec<SpecifierQualifier>,
283 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
285 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
287 pub span: core::range::Range<usize>,
288}
289
290impl TypeName {
291 pub fn span(&self) -> core::range::Range<usize> {
293 self.span.clone()
294 }
295}