1use super::*;
2
3#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
5#[derive(Debug, Clone, PartialEq)]
6pub enum Type {
7 Base(TypeSpecifier),
9 Pointer(Box<Type>),
11 Array {
13 element_type: Box<Type>,
15 size: Option<Box<Expression>>,
17 },
18 Function {
20 return_type: Box<Type>,
22 parameters: Vec<Type>,
24 variadic: bool,
26 },
27}
28
29#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31#[derive(Debug, Clone, PartialEq)]
32pub enum ExternalDeclaration {
33 FunctionDefinition(FunctionDefinition),
35 Declaration(Declaration),
37}
38
39impl ExternalDeclaration {
40 pub fn span(&self) -> core::range::Range<usize> {
42 match self {
43 Self::FunctionDefinition(n) => n.span.clone(),
44 Self::Declaration(n) => n.span.clone(),
45 }
46 }
47}
48
49#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
51#[derive(Debug, Clone, PartialEq)]
52pub struct FunctionDefinition {
53 pub declaration_specifiers: Vec<DeclarationSpecifier>,
55 pub declarator: Declarator,
57 pub compound_statement: CompoundStatement,
59 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
61 pub span: core::range::Range<usize>,
62}
63
64#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
66#[derive(Debug, Clone, PartialEq)]
67pub struct Declaration {
68 pub declaration_specifiers: Vec<DeclarationSpecifier>,
70 pub init_declarators: Vec<InitDeclarator>,
72 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
74 pub span: core::range::Range<usize>,
75}
76
77#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
79#[derive(Debug, Clone, PartialEq)]
80pub enum DeclarationSpecifier {
81 StorageClassSpecifier(StorageClassSpecifier),
83 TypeSpecifier(TypeSpecifier),
85 TypeQualifier(TypeQualifier),
87 FunctionSpecifier(FunctionSpecifier),
89}
90
91impl DeclarationSpecifier {
92 pub fn span(&self) -> core::range::Range<usize> {
94 match self {
95 Self::StorageClassSpecifier(n) => n.span(),
96 Self::TypeSpecifier(n) => n.span(),
97 Self::TypeQualifier(n) => n.span(),
98 Self::FunctionSpecifier(n) => n.span(),
99 }
100 }
101}
102
103#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
105#[derive(Debug, Clone, PartialEq)]
106pub enum StorageClassSpecifier {
107 Typedef {
109 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
111 span: core::range::Range<usize>,
112 },
113 Extern {
115 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
117 span: core::range::Range<usize>,
118 },
119 Static {
121 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
123 span: core::range::Range<usize>,
124 },
125 Auto {
127 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
129 span: core::range::Range<usize>,
130 },
131 Register {
133 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
135 span: core::range::Range<usize>,
136 },
137}
138
139impl StorageClassSpecifier {
140 pub fn span(&self) -> core::range::Range<usize> {
142 match self {
143 Self::Typedef { span } => span.clone(),
144 Self::Extern { span } => span.clone(),
145 Self::Static { span } => span.clone(),
146 Self::Auto { span } => span.clone(),
147 Self::Register { span } => span.clone(),
148 }
149 }
150}
151
152#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
154#[derive(Debug, Clone, PartialEq)]
155pub enum TypeSpecifier {
156 Void {
158 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
160 span: core::range::Range<usize>,
161 },
162 Char {
164 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
166 span: core::range::Range<usize>,
167 },
168 Short {
170 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
172 span: core::range::Range<usize>,
173 },
174 Int {
176 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
178 span: core::range::Range<usize>,
179 },
180 Long {
182 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
184 span: core::range::Range<usize>,
185 },
186 Float {
188 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
190 span: core::range::Range<usize>,
191 },
192 Double {
194 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
196 span: core::range::Range<usize>,
197 },
198 Signed {
200 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
202 span: core::range::Range<usize>,
203 },
204 Unsigned {
206 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
208 span: core::range::Range<usize>,
209 },
210 Bool {
212 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
214 span: core::range::Range<usize>,
215 },
216 Complex {
218 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
220 span: core::range::Range<usize>,
221 },
222 Imaginary {
224 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
226 span: core::range::Range<usize>,
227 },
228 StructOrUnion(StructOrUnionSpecifier),
230 Enum(EnumSpecifier),
232 TypedefName(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
234}
235
236impl TypeSpecifier {
237 pub fn span(&self) -> core::range::Range<usize> {
239 match self {
240 Self::Void { span } => span.clone(),
241 Self::Char { span } => span.clone(),
242 Self::Short { span } => span.clone(),
243 Self::Int { span } => span.clone(),
244 Self::Long { span } => span.clone(),
245 Self::Float { span } => span.clone(),
246 Self::Double { span } => span.clone(),
247 Self::Signed { span } => span.clone(),
248 Self::Unsigned { span } => span.clone(),
249 Self::Bool { span } => span.clone(),
250 Self::Complex { span } => span.clone(),
251 Self::Imaginary { span } => span.clone(),
252 Self::StructOrUnion(n) => n.span.clone(),
253 Self::Enum(n) => n.span.clone(),
254 Self::TypedefName(_, span) => span.clone(),
255 }
256 }
257}
258
259#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
261#[derive(Debug, Clone, PartialEq)]
262pub enum TypeQualifier {
263 Const {
265 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
267 span: core::range::Range<usize>,
268 },
269 Restrict {
271 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
273 span: core::range::Range<usize>,
274 },
275 Volatile {
277 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
279 span: core::range::Range<usize>,
280 },
281}
282
283impl TypeQualifier {
284 pub fn span(&self) -> core::range::Range<usize> {
286 match self {
287 Self::Const { span } => span.clone(),
288 Self::Restrict { span } => span.clone(),
289 Self::Volatile { span } => span.clone(),
290 }
291 }
292}
293
294#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
296#[derive(Debug, Clone, PartialEq)]
297pub enum FunctionSpecifier {
298 Inline {
300 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
302 span: core::range::Range<usize>,
303 },
304}
305
306impl FunctionSpecifier {
307 pub fn span(&self) -> core::range::Range<usize> {
309 match self {
310 Self::Inline { span } => span.clone(),
311 }
312 }
313}
314
315#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
317#[derive(Debug, Clone, PartialEq)]
318pub struct StructOrUnionSpecifier {
319 pub kind: StructOrUnion,
321 pub identifier: Option<String>,
323 pub struct_declarations: Vec<StructDeclaration>,
325 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
327 pub span: core::range::Range<usize>,
328}
329
330#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
332#[derive(Debug, Clone, PartialEq)]
333pub enum StructOrUnion {
334 Struct {
336 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
338 span: core::range::Range<usize>,
339 },
340 Union {
342 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
344 span: core::range::Range<usize>,
345 },
346}
347
348impl StructOrUnion {
349 pub fn span(&self) -> core::range::Range<usize> {
351 match self {
352 Self::Struct { span } => span.clone(),
353 Self::Union { span } => span.clone(),
354 }
355 }
356}
357
358#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
360#[derive(Debug, Clone, PartialEq)]
361pub struct StructDeclaration {
362 pub specifier_qualifier_list: Vec<SpecifierQualifier>,
364 pub struct_declarator_list: Vec<StructDeclarator>,
366 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
368 pub span: core::range::Range<usize>,
369}
370
371#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
373#[derive(Debug, Clone, PartialEq)]
374pub enum SpecifierQualifier {
375 TypeSpecifier(TypeSpecifier),
377 TypeQualifier(TypeQualifier),
379}
380
381impl SpecifierQualifier {
382 pub fn span(&self) -> core::range::Range<usize> {
384 match self {
385 Self::TypeSpecifier(n) => n.span(),
386 Self::TypeQualifier(n) => n.span(),
387 }
388 }
389}
390
391#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
393#[derive(Debug, Clone, PartialEq)]
394pub struct StructDeclarator {
395 pub declarator: Option<Declarator>,
397 pub constant_expression: Option<Expression>,
399 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
401 pub span: core::range::Range<usize>,
402}
403
404#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
406#[derive(Debug, Clone, PartialEq)]
407pub struct EnumSpecifier {
408 pub identifier: Option<String>,
410 pub enumerators: Vec<Enumerator>,
412 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
414 pub span: core::range::Range<usize>,
415}
416
417#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
419#[derive(Debug, Clone, PartialEq)]
420pub struct Enumerator {
421 pub identifier: String,
423 pub constant_expression: Option<Expression>,
425 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
427 pub span: core::range::Range<usize>,
428}
429
430#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
432#[derive(Debug, Clone, PartialEq)]
433pub struct InitDeclarator {
434 pub declarator: Declarator,
436 pub initializer: Option<Initializer>,
438 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
440 pub span: core::range::Range<usize>,
441}
442
443#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
445#[derive(Debug, Clone, PartialEq)]
446pub struct Declarator {
447 pub pointer: Option<Pointer>,
449 pub direct_declarator: DirectDeclarator,
451 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
453 pub span: core::range::Range<usize>,
454}
455
456#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
458#[derive(Debug, Clone, PartialEq)]
459pub struct Pointer {
460 pub type_qualifiers: Vec<TypeQualifier>,
462 pub pointer: Option<Box<Pointer>>,
464 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
466 pub span: core::range::Range<usize>,
467}
468
469#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
471#[derive(Debug, Clone, PartialEq)]
472pub enum DirectDeclarator {
473 Identifier(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
475 Declarator(Box<Declarator>, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
477 Array {
479 direct_declarator: Box<DirectDeclarator>,
481 type_qualifiers: Vec<TypeQualifier>,
483 assignment_expression: Option<Box<Expression>>,
485 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
487 span: core::range::Range<usize>,
488 },
489 Function {
491 direct_declarator: Box<DirectDeclarator>,
493 parameter_list: ParameterList,
495 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
497 span: core::range::Range<usize>,
498 },
499}
500
501impl DirectDeclarator {
502 pub fn span(&self) -> core::range::Range<usize> {
504 match self {
505 Self::Identifier(_, span) => span.clone(),
506 Self::Declarator(n, _) => n.span.clone(),
507 Self::Array { span, .. } => span.clone(),
508 Self::Function { span, .. } => span.clone(),
509 }
510 }
511}
512
513#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
515#[derive(Debug, Clone, PartialEq)]
516pub struct ParameterList {
517 pub parameter_declarations: Vec<ParameterDeclaration>,
519 pub variadic: bool,
521 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
523 pub span: core::range::Range<usize>,
524}
525
526#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
528#[derive(Debug, Clone, PartialEq)]
529pub struct ParameterDeclaration {
530 pub declaration_specifiers: Vec<DeclarationSpecifier>,
532 pub declarator: Option<Declarator>,
534 pub abstract_declarator: Option<AbstractDeclarator>,
536 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
538 pub span: core::range::Range<usize>,
539}
540
541#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
543#[derive(Debug, Clone, PartialEq)]
544pub struct AbstractDeclarator {
545 pub pointer: Option<Pointer>,
547 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
549 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
551 pub span: core::range::Range<usize>,
552}
553
554#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
556#[derive(Debug, Clone, PartialEq)]
557pub enum DirectAbstractDeclarator {
558 AbstractDeclarator(Box<AbstractDeclarator>),
560 Array {
562 declarator: Option<Box<DirectAbstractDeclarator>>,
564 assignment_expression: Option<Box<Expression>>,
566 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
568 span: core::range::Range<usize>,
569 },
570 Function {
572 declarator: Option<Box<DirectAbstractDeclarator>>,
574 parameter_list: Option<ParameterList>,
576 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
578 span: core::range::Range<usize>,
579 },
580}
581
582impl DirectAbstractDeclarator {
583 pub fn span(&self) -> core::range::Range<usize> {
585 match self {
586 Self::AbstractDeclarator(n) => n.span.clone(),
587 Self::Array { span, .. } => span.clone(),
588 Self::Function { span, .. } => span.clone(),
589 }
590 }
591}
592
593#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
595#[derive(Debug, Clone, PartialEq)]
596pub enum Initializer {
597 AssignmentExpression(Expression),
599 InitializerList(Vec<Initializer>, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
601}
602
603impl Initializer {
604 pub fn span(&self) -> core::range::Range<usize> {
606 match self {
607 Self::AssignmentExpression(n) => n.span.clone(),
608 Self::InitializerList(_, span) => span.clone(),
609 }
610 }
611}