1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6type SourceSpan = Range<usize>;
8
9#[derive(Debug, Clone, PartialEq)]
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12pub struct CppRoot {
13 pub translation_unit: TranslationUnit,
15}
16
17#[derive(Debug, Clone, PartialEq)]
19#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
20pub struct TranslationUnit {
21 pub external_declarations: Vec<ExternalDeclaration>,
23 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
25 pub span: Range<usize>,
26}
27
28#[derive(Debug, Clone, PartialEq)]
30#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
31pub enum ExternalDeclaration {
32 FunctionDefinition(FunctionDefinition),
34 Declaration(Declaration),
36}
37
38#[derive(Debug, Clone, PartialEq)]
40#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
41pub struct FunctionDefinition {
42 pub declaration_specifiers: Vec<DeclarationSpecifier>,
44 pub declarator: Declarator,
46 pub compound_statement: CompoundStatement,
48 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
50 pub span: SourceSpan,
51}
52
53#[derive(Debug, Clone, PartialEq)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56pub struct Declaration {
57 pub declaration_specifiers: Vec<DeclarationSpecifier>,
59 pub init_declarators: Vec<InitDeclarator>,
61 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
63 pub span: SourceSpan,
64}
65
66#[derive(Debug, Clone, PartialEq)]
68#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
69pub enum DeclarationSpecifier {
70 StorageClassSpecifier(StorageClassSpecifier),
72 TypeSpecifier(TypeSpecifier),
74 TypeQualifier(TypeQualifier),
76 FunctionSpecifier(FunctionSpecifier),
78}
79
80#[derive(Debug, Clone, PartialEq)]
82#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
83pub enum StorageClassSpecifier {
84 Typedef,
86 Extern,
88 Static,
90 Auto,
92 Register,
94}
95
96#[derive(Debug, Clone, PartialEq)]
98#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
99pub enum TypeSpecifier {
100 Void,
102 Char,
104 Short,
106 Int,
108 Long,
110 Float,
112 Double,
114 Signed,
116 Unsigned,
118 Bool,
120 Complex,
122 Imaginary,
124 StructOrUnion(StructOrUnionSpecifier),
126 Enum(EnumSpecifier),
128 TypedefName(String),
130}
131
132#[derive(Debug, Clone, PartialEq)]
134#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
135pub enum TypeQualifier {
136 Const,
137 Restrict,
138 Volatile,
139}
140
141#[derive(Debug, Clone, PartialEq)]
143#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
144pub enum FunctionSpecifier {
145 Inline,
146 Noreturn,
147}
148
149#[derive(Debug, Clone, PartialEq)]
151#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
152pub struct StructOrUnionSpecifier {
153 pub struct_or_union: StructOrUnion,
154 pub identifier: Option<String>,
155 pub struct_declarations: Option<Vec<StructDeclaration>>,
156 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
157 pub span: SourceSpan,
158}
159
160#[derive(Debug, Clone, PartialEq)]
162#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
163pub enum StructOrUnion {
164 Struct,
165 Union,
166}
167
168#[derive(Debug, Clone, PartialEq)]
170#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
171pub struct StructDeclaration {
172 pub specifier_qualifiers: Vec<SpecifierQualifier>,
173 pub struct_declarators: Vec<StructDeclarator>,
174 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
175 pub span: SourceSpan,
176}
177
178#[derive(Debug, Clone, PartialEq)]
180#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
181pub enum SpecifierQualifier {
182 TypeSpecifier(TypeSpecifier),
183 TypeQualifier(TypeQualifier),
184}
185
186#[derive(Debug, Clone, PartialEq)]
188#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
189pub struct StructDeclarator {
190 pub declarator: Option<Declarator>,
191 pub constant_expression: Option<Expression>,
192 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
193 pub span: SourceSpan,
194}
195
196#[derive(Debug, Clone, PartialEq)]
198#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
199pub struct EnumSpecifier {
200 pub identifier: Option<String>,
201 pub enumerators: Option<Vec<Enumerator>>,
202 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
203 pub span: SourceSpan,
204}
205
206#[derive(Debug, Clone, PartialEq)]
208#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
209pub struct Enumerator {
210 pub identifier: String,
212 pub constant_expression: Option<Expression>,
214 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
216 pub span: SourceSpan,
217}
218
219#[derive(Debug, Clone, PartialEq)]
221#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
222pub struct InitDeclarator {
223 pub declarator: Declarator,
225 pub initializer: Option<Initializer>,
227 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
229 pub span: SourceSpan,
230}
231
232#[derive(Debug, Clone, PartialEq)]
234#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
235pub struct Declarator {
236 pub pointer: Option<Pointer>,
238 pub direct_declarator: DirectDeclarator,
240 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
242 pub span: SourceSpan,
243}
244
245#[derive(Debug, Clone, PartialEq)]
247#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
248pub struct Pointer {
249 pub type_qualifiers: Vec<TypeQualifier>,
251 pub pointer: Option<Box<Pointer>>,
253 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
255 pub span: SourceSpan,
256}
257
258#[derive(Debug, Clone, PartialEq)]
260#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
261pub enum DirectDeclarator {
262 Identifier(String),
264 Declarator(Box<Declarator>),
266 Array {
268 declarator: Box<DirectDeclarator>,
270 assignment_expression: Option<Expression>,
272 },
273 Function {
275 declarator: Box<DirectDeclarator>,
277 parameter_type_list: Option<ParameterTypeList>,
279 identifier_list: Option<Vec<String>>,
281 },
282}
283
284#[derive(Debug, Clone, PartialEq)]
286#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
287pub struct ParameterTypeList {
288 pub parameter_list: Vec<ParameterDeclaration>,
290 pub variadic: bool,
292 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
294 pub span: SourceSpan,
295}
296
297#[derive(Debug, Clone, PartialEq)]
299#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
300pub struct ParameterDeclaration {
301 pub declaration_specifiers: Vec<DeclarationSpecifier>,
303 pub declarator: Option<Declarator>,
305 pub abstract_declarator: Option<AbstractDeclarator>,
307 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
309 pub span: SourceSpan,
310}
311
312#[derive(Debug, Clone, PartialEq)]
314#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
315pub struct AbstractDeclarator {
316 pub pointer: Option<Pointer>,
318 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
320 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
322 pub span: Range<usize>,
323}
324
325#[derive(Debug, Clone, PartialEq)]
327#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
328pub enum DirectAbstractDeclarator {
329 AbstractDeclarator(Box<AbstractDeclarator>),
331 Array {
333 declarator: Option<Box<DirectAbstractDeclarator>>,
335 assignment_expression: Option<Box<Expression>>,
337 },
338 Function {
340 declarator: Option<Box<DirectAbstractDeclarator>>,
342 parameter_type_list: Option<ParameterTypeList>,
344 },
345}
346
347#[derive(Debug, Clone, PartialEq)]
349#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
350pub enum Initializer {
351 AssignmentExpression(Expression),
353 InitializerList(Vec<Initializer>),
355}
356
357#[derive(Debug, Clone, PartialEq)]
359#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
360pub enum Statement {
361 Labeled(LabeledStatement),
363 Compound(CompoundStatement),
365 Expression(ExpressionStatement),
367 Selection(SelectionStatement),
369 Iteration(IterationStatement),
371 Jump(JumpStatement),
373}
374
375#[derive(Debug, Clone, PartialEq)]
377#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
378pub enum LabeledStatement {
379 Label {
381 identifier: String,
383 statement: Box<Statement>,
385 },
386 Case {
388 constant_expression: Expression,
390 statement: Box<Statement>,
392 },
393 Default {
395 statement: Box<Statement>,
397 },
398}
399
400#[derive(Debug, Clone, PartialEq)]
402#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
403pub struct CompoundStatement {
404 pub block_items: Vec<BlockItem>,
406 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
408 pub span: SourceSpan,
409}
410
411#[derive(Debug, Clone, PartialEq)]
413#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
414pub enum BlockItem {
415 Declaration(Declaration),
417 Statement(Statement),
419}
420
421#[derive(Debug, Clone, PartialEq)]
423#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
424pub struct ExpressionStatement {
425 pub expression: Option<Expression>,
427 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
429 pub span: SourceSpan,
430}
431
432#[derive(Debug, Clone, PartialEq)]
434#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
435pub enum SelectionStatement {
436 If {
438 condition: Expression,
440 then_branch: Box<Statement>,
442 else_branch: Option<Box<Statement>>,
444 },
445 Switch {
447 condition: Expression,
449 statement: Box<Statement>,
451 },
452}
453
454#[derive(Debug, Clone, PartialEq)]
456#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
457pub enum IterationStatement {
458 While {
460 condition: Expression,
462 statement: Box<Statement>,
464 },
465 DoWhile {
467 statement: Box<Statement>,
469 condition: Expression,
471 },
472 For {
474 initializer: Option<Box<ForInitializer>>,
476 condition: Option<Expression>,
478 increment: Option<Expression>,
480 statement: Box<Statement>,
482 },
483}
484
485#[derive(Debug, Clone, PartialEq)]
487#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
488pub enum ForInitializer {
489 Expression(Expression),
491 Declaration(Declaration),
493}
494
495#[derive(Debug, Clone, PartialEq)]
497#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
498pub enum JumpStatement {
499 Goto(String),
501 Continue,
503 Break,
505 Return(Option<Expression>),
507}
508
509#[derive(Debug, Clone, PartialEq)]
511#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
512pub struct Expression {
513 pub kind: ExpressionKind,
515 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
517 pub span: SourceSpan,
518}
519
520#[derive(Debug, Clone, PartialEq)]
522#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
523pub enum ExpressionKind {
524 Identifier(String),
526 Constant(String),
528 StringLiteral(String),
530 Parenthesized(Box<Expression>),
532 ArrayAccess {
534 array: Box<Expression>,
536 index: Box<Expression>,
538 },
539 FunctionCall {
541 function: Box<Expression>,
543 arguments: Vec<Expression>,
545 },
546 MemberAccess {
548 object: Box<Expression>,
550 member: String,
552 is_pointer: bool,
554 },
555 Unary {
557 operator: UnaryOperator,
559 operand: Box<Expression>,
561 },
562 Binary {
564 left: Box<Expression>,
566 operator: BinaryOperator,
568 right: Box<Expression>,
570 },
571 Conditional {
573 condition: Box<Expression>,
575 then_branch: Box<Expression>,
577 else_branch: Box<Expression>,
579 },
580 Assignment {
582 left: Box<Expression>,
584 operator: AssignmentOperator,
586 right: Box<Expression>,
588 },
589 Comma(Vec<Expression>),
591}
592
593#[derive(Debug, Clone, Copy, PartialEq)]
595#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
596pub enum UnaryOperator {
597 PostIncrement,
599 PostDecrement,
601 PreIncrement,
603 PreDecrement,
605 AddressOf,
607 Deref,
609 Plus,
611 Minus,
613 BitNot,
615 LogicalNot,
617 Sizeof,
619 AlignOf,
621}
622
623#[derive(Debug, Clone, Copy, PartialEq)]
625#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
626pub enum BinaryOperator {
627 Add,
629 Subtract,
631 Multiply,
633 Divide,
635 Remainder,
637 ShiftLeft,
639 ShiftRight,
641 Less,
643 Greater,
645 LessEqual,
647 GreaterEqual,
649 Equal,
651 NotEqual,
653 BitAnd,
655 BitXor,
657 BitOr,
659 LogicalAnd,
661 LogicalOr,
663}
664
665#[derive(Debug, Clone, Copy, PartialEq)]
667#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
668pub enum AssignmentOperator {
669 Assign,
671 AddAssign,
673 SubAssign,
675 MulAssign,
677 DivAssign,
679 RemAssign,
681 ShlAssign,
683 ShrAssign,
685 AndAssign,
687 XorAssign,
689 OrAssign,
691}
692
693#[derive(Debug, Clone, PartialEq)]
695#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
696pub struct TypeName {
697 pub specifier_qualifiers: Vec<SpecifierQualifier>,
698 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
699 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
700 pub span: Range<usize>,
701}
702
703impl TypeName {
704 pub fn new(specifier_qualifiers: Vec<SpecifierQualifier>, abstract_declarator: Option<Box<AbstractDeclarator>>, span: Range<usize>) -> Self {
706 Self { specifier_qualifiers, abstract_declarator, span }
707 }
708}
709
710impl CppRoot {
711 pub fn new(translation_unit: TranslationUnit) -> Self {
713 Self { translation_unit }
714 }
715}
716
717impl TranslationUnit {
718 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: Range<usize>) -> Self {
720 Self { external_declarations, span }
721 }
722}