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,
138 Restrict,
140 Volatile,
142}
143
144#[derive(Debug, Clone, PartialEq)]
146#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
147pub enum FunctionSpecifier {
148 Inline,
150 Noreturn,
152}
153
154#[derive(Debug, Clone, PartialEq)]
156#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
157pub struct StructOrUnionSpecifier {
158 pub struct_or_union: StructOrUnion,
160 pub identifier: Option<String>,
162 pub struct_declarations: Option<Vec<StructDeclaration>>,
164 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
166 pub span: SourceSpan,
167}
168
169#[derive(Debug, Clone, PartialEq)]
171#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
172pub enum StructOrUnion {
173 Struct,
175 Union,
177}
178
179#[derive(Debug, Clone, PartialEq)]
181#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
182pub struct StructDeclaration {
183 pub specifier_qualifiers: Vec<SpecifierQualifier>,
185 pub struct_declarators: Vec<StructDeclarator>,
187 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
189 pub span: SourceSpan,
190}
191
192#[derive(Debug, Clone, PartialEq)]
194#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
195pub enum SpecifierQualifier {
196 TypeSpecifier(TypeSpecifier),
198 TypeQualifier(TypeQualifier),
200}
201
202#[derive(Debug, Clone, PartialEq)]
204#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
205pub struct StructDeclarator {
206 pub declarator: Option<Declarator>,
208 pub constant_expression: Option<Expression>,
210 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
212 pub span: SourceSpan,
213}
214
215#[derive(Debug, Clone, PartialEq)]
217#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
218pub struct EnumSpecifier {
219 pub identifier: Option<String>,
221 pub enumerators: Option<Vec<Enumerator>>,
223 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
225 pub span: SourceSpan,
226}
227
228#[derive(Debug, Clone, PartialEq)]
230#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
231pub struct Enumerator {
232 pub identifier: String,
234 pub constant_expression: Option<Expression>,
236 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
238 pub span: SourceSpan,
239}
240
241#[derive(Debug, Clone, PartialEq)]
243#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
244pub struct InitDeclarator {
245 pub declarator: Declarator,
247 pub initializer: Option<Initializer>,
249 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
251 pub span: SourceSpan,
252}
253
254#[derive(Debug, Clone, PartialEq)]
256#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
257pub struct Declarator {
258 pub pointer: Option<Pointer>,
260 pub direct_declarator: DirectDeclarator,
262 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
264 pub span: SourceSpan,
265}
266
267#[derive(Debug, Clone, PartialEq)]
269#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
270pub struct Pointer {
271 pub type_qualifiers: Vec<TypeQualifier>,
273 pub pointer: Option<Box<Pointer>>,
275 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
277 pub span: SourceSpan,
278}
279
280#[derive(Debug, Clone, PartialEq)]
282#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
283pub enum DirectDeclarator {
284 Identifier(String),
286 Declarator(Box<Declarator>),
288 Array {
290 declarator: Box<DirectDeclarator>,
292 assignment_expression: Option<Expression>,
294 },
295 Function {
297 declarator: Box<DirectDeclarator>,
299 parameter_type_list: Option<ParameterTypeList>,
301 identifier_list: Option<Vec<String>>,
303 },
304}
305
306#[derive(Debug, Clone, PartialEq)]
308#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
309pub struct ParameterTypeList {
310 pub parameter_list: Vec<ParameterDeclaration>,
312 pub variadic: bool,
314 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
316 pub span: SourceSpan,
317}
318
319#[derive(Debug, Clone, PartialEq)]
321#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
322pub struct ParameterDeclaration {
323 pub declaration_specifiers: Vec<DeclarationSpecifier>,
325 pub declarator: Option<Declarator>,
327 pub abstract_declarator: Option<AbstractDeclarator>,
329 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
331 pub span: SourceSpan,
332}
333
334#[derive(Debug, Clone, PartialEq)]
336#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
337pub struct AbstractDeclarator {
338 pub pointer: Option<Pointer>,
340 pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
342 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
344 pub span: Range<usize>,
345}
346
347#[derive(Debug, Clone, PartialEq)]
349#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
350pub enum DirectAbstractDeclarator {
351 AbstractDeclarator(Box<AbstractDeclarator>),
353 Array {
355 declarator: Option<Box<DirectAbstractDeclarator>>,
357 assignment_expression: Option<Box<Expression>>,
359 },
360 Function {
362 declarator: Option<Box<DirectAbstractDeclarator>>,
364 parameter_type_list: Option<ParameterTypeList>,
366 },
367}
368
369#[derive(Debug, Clone, PartialEq)]
371#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
372pub enum Initializer {
373 AssignmentExpression(Expression),
375 InitializerList(Vec<Initializer>),
377}
378
379#[derive(Debug, Clone, PartialEq)]
381#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
382pub enum Statement {
383 Labeled(LabeledStatement),
385 Compound(CompoundStatement),
387 Expression(ExpressionStatement),
389 Selection(SelectionStatement),
391 Iteration(IterationStatement),
393 Jump(JumpStatement),
395}
396
397#[derive(Debug, Clone, PartialEq)]
399#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
400pub enum LabeledStatement {
401 Label {
403 identifier: String,
405 statement: Box<Statement>,
407 },
408 Case {
410 constant_expression: Expression,
412 statement: Box<Statement>,
414 },
415 Default {
417 statement: Box<Statement>,
419 },
420}
421
422#[derive(Debug, Clone, PartialEq)]
424#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
425pub struct CompoundStatement {
426 pub block_items: Vec<BlockItem>,
428 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
430 pub span: SourceSpan,
431}
432
433#[derive(Debug, Clone, PartialEq)]
435#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
436pub enum BlockItem {
437 Declaration(Declaration),
439 Statement(Statement),
441}
442
443#[derive(Debug, Clone, PartialEq)]
445#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
446pub struct ExpressionStatement {
447 pub expression: Option<Expression>,
449 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
451 pub span: SourceSpan,
452}
453
454#[derive(Debug, Clone, PartialEq)]
456#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
457pub enum SelectionStatement {
458 If {
460 condition: Expression,
462 then_branch: Box<Statement>,
464 else_branch: Option<Box<Statement>>,
466 },
467 Switch {
469 condition: Expression,
471 statement: Box<Statement>,
473 },
474}
475
476#[derive(Debug, Clone, PartialEq)]
478#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
479pub enum IterationStatement {
480 While {
482 condition: Expression,
484 statement: Box<Statement>,
486 },
487 DoWhile {
489 statement: Box<Statement>,
491 condition: Expression,
493 },
494 For {
496 initializer: Option<Box<ForInitializer>>,
498 condition: Option<Expression>,
500 increment: Option<Expression>,
502 statement: Box<Statement>,
504 },
505}
506
507#[derive(Debug, Clone, PartialEq)]
509#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
510pub enum ForInitializer {
511 Expression(Expression),
513 Declaration(Declaration),
515}
516
517#[derive(Debug, Clone, PartialEq)]
519#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
520pub enum JumpStatement {
521 Goto(String),
523 Continue,
525 Break,
527 Return(Option<Expression>),
529}
530
531#[derive(Debug, Clone, PartialEq)]
533#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
534pub struct Expression {
535 pub kind: ExpressionKind,
537 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
539 pub span: SourceSpan,
540}
541
542#[derive(Debug, Clone, PartialEq)]
544#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
545pub enum ExpressionKind {
546 Identifier(String),
548 Constant(String),
550 StringLiteral(String),
552 Parenthesized(Box<Expression>),
554 ArrayAccess {
556 array: Box<Expression>,
558 index: Box<Expression>,
560 },
561 FunctionCall {
563 function: Box<Expression>,
565 arguments: Vec<Expression>,
567 },
568 MemberAccess {
570 object: Box<Expression>,
572 member: String,
574 is_pointer: bool,
576 },
577 Unary {
579 operator: UnaryOperator,
581 operand: Box<Expression>,
583 },
584 Binary {
586 left: Box<Expression>,
588 operator: BinaryOperator,
590 right: Box<Expression>,
592 },
593 Conditional {
595 condition: Box<Expression>,
597 then_branch: Box<Expression>,
599 else_branch: Box<Expression>,
601 },
602 Assignment {
604 left: Box<Expression>,
606 operator: AssignmentOperator,
608 right: Box<Expression>,
610 },
611 Comma(Vec<Expression>),
613}
614
615#[derive(Debug, Clone, Copy, PartialEq)]
617#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
618pub enum UnaryOperator {
619 PostIncrement,
621 PostDecrement,
623 PreIncrement,
625 PreDecrement,
627 AddressOf,
629 Deref,
631 Plus,
633 Minus,
635 BitNot,
637 LogicalNot,
639 Sizeof,
641 AlignOf,
643}
644
645#[derive(Debug, Clone, Copy, PartialEq)]
647#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
648pub enum BinaryOperator {
649 Add,
651 Subtract,
653 Multiply,
655 Divide,
657 Remainder,
659 ShiftLeft,
661 ShiftRight,
663 Less,
665 Greater,
667 LessEqual,
669 GreaterEqual,
671 Equal,
673 NotEqual,
675 BitAnd,
677 BitXor,
679 BitOr,
681 LogicalAnd,
683 LogicalOr,
685}
686
687#[derive(Debug, Clone, Copy, PartialEq)]
689#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
690pub enum AssignmentOperator {
691 Assign,
693 AddAssign,
695 SubAssign,
697 MulAssign,
699 DivAssign,
701 RemAssign,
703 ShlAssign,
705 ShrAssign,
707 AndAssign,
709 XorAssign,
711 OrAssign,
713}
714
715#[derive(Debug, Clone, PartialEq)]
717#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
718pub struct TypeName {
719 pub specifier_qualifiers: Vec<SpecifierQualifier>,
721 pub abstract_declarator: Option<Box<AbstractDeclarator>>,
723 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
725 pub span: Range<usize>,
726}
727
728impl TypeName {
729 pub fn new(specifier_qualifiers: Vec<SpecifierQualifier>, abstract_declarator: Option<Box<AbstractDeclarator>>, span: Range<usize>) -> Self {
731 Self { specifier_qualifiers, abstract_declarator, span }
732 }
733}
734
735impl CppRoot {
736 pub fn new(translation_unit: TranslationUnit) -> Self {
738 Self { translation_unit }
739 }
740}
741
742impl TranslationUnit {
743 pub fn new(external_declarations: Vec<ExternalDeclaration>, span: Range<usize>) -> Self {
745 Self { external_declarations, span }
746 }
747}