#![doc = include_str!("readme.md")]
use core::range::Range;
type SourceSpan = Range<usize>;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CppRoot {
pub translation_unit: TranslationUnit,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TranslationUnit {
pub external_declarations: Vec<ExternalDeclaration>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExternalDeclaration {
FunctionDefinition(FunctionDefinition),
Declaration(Declaration),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FunctionDefinition {
pub declaration_specifiers: Vec<DeclarationSpecifier>,
pub declarator: Declarator,
pub compound_statement: CompoundStatement,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Declaration {
pub declaration_specifiers: Vec<DeclarationSpecifier>,
pub init_declarators: Vec<InitDeclarator>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DeclarationSpecifier {
StorageClassSpecifier(StorageClassSpecifier),
TypeSpecifier(TypeSpecifier),
TypeQualifier(TypeQualifier),
FunctionSpecifier(FunctionSpecifier),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum StorageClassSpecifier {
Typedef,
Extern,
Static,
Auto,
Register,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TypeSpecifier {
Void,
Char,
Short,
Int,
Long,
Float,
Double,
Signed,
Unsigned,
Bool,
Complex,
Imaginary,
StructOrUnion(StructOrUnionSpecifier),
Enum(EnumSpecifier),
TypedefName(String),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TypeQualifier {
Const,
Restrict,
Volatile,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FunctionSpecifier {
Inline,
Noreturn,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StructOrUnionSpecifier {
pub struct_or_union: StructOrUnion,
pub identifier: Option<String>,
pub struct_declarations: Option<Vec<StructDeclaration>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum StructOrUnion {
Struct,
Union,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StructDeclaration {
pub specifier_qualifiers: Vec<SpecifierQualifier>,
pub struct_declarators: Vec<StructDeclarator>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SpecifierQualifier {
TypeSpecifier(TypeSpecifier),
TypeQualifier(TypeQualifier),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StructDeclarator {
pub declarator: Option<Declarator>,
pub constant_expression: Option<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EnumSpecifier {
pub identifier: Option<String>,
pub enumerators: Option<Vec<Enumerator>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Enumerator {
pub identifier: String,
pub constant_expression: Option<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct InitDeclarator {
pub declarator: Declarator,
pub initializer: Option<Initializer>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Declarator {
pub pointer: Option<Pointer>,
pub direct_declarator: DirectDeclarator,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Pointer {
pub type_qualifiers: Vec<TypeQualifier>,
pub pointer: Option<Box<Pointer>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DirectDeclarator {
Identifier(String),
Declarator(Box<Declarator>),
Array {
declarator: Box<DirectDeclarator>,
assignment_expression: Option<Expression>,
},
Function {
declarator: Box<DirectDeclarator>,
parameter_type_list: Option<ParameterTypeList>,
identifier_list: Option<Vec<String>>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ParameterTypeList {
pub parameter_list: Vec<ParameterDeclaration>,
pub variadic: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ParameterDeclaration {
pub declaration_specifiers: Vec<DeclarationSpecifier>,
pub declarator: Option<Declarator>,
pub abstract_declarator: Option<AbstractDeclarator>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AbstractDeclarator {
pub pointer: Option<Pointer>,
pub direct_abstract_declarator: Option<Box<DirectAbstractDeclarator>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum DirectAbstractDeclarator {
AbstractDeclarator(Box<AbstractDeclarator>),
Array {
declarator: Option<Box<DirectAbstractDeclarator>>,
assignment_expression: Option<Box<Expression>>,
},
Function {
declarator: Option<Box<DirectAbstractDeclarator>>,
parameter_type_list: Option<ParameterTypeList>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Initializer {
AssignmentExpression(Expression),
InitializerList(Vec<Initializer>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Statement {
Labeled(LabeledStatement),
Compound(CompoundStatement),
Expression(ExpressionStatement),
Selection(SelectionStatement),
Iteration(IterationStatement),
Jump(JumpStatement),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum LabeledStatement {
Label {
identifier: String,
statement: Box<Statement>,
},
Case {
constant_expression: Expression,
statement: Box<Statement>,
},
Default {
statement: Box<Statement>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CompoundStatement {
pub block_items: Vec<BlockItem>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BlockItem {
Declaration(Declaration),
Statement(Statement),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExpressionStatement {
pub expression: Option<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SelectionStatement {
If {
condition: Expression,
then_branch: Box<Statement>,
else_branch: Option<Box<Statement>>,
},
Switch {
condition: Expression,
statement: Box<Statement>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum IterationStatement {
While {
condition: Expression,
statement: Box<Statement>,
},
DoWhile {
statement: Box<Statement>,
condition: Expression,
},
For {
initializer: Option<Box<ForInitializer>>,
condition: Option<Expression>,
increment: Option<Expression>,
statement: Box<Statement>,
},
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ForInitializer {
Expression(Expression),
Declaration(Declaration),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum JumpStatement {
Goto(String),
Continue,
Break,
Return(Option<Expression>),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Expression {
pub kind: ExpressionKind,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: SourceSpan,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ExpressionKind {
Identifier(String),
Constant(String),
StringLiteral(String),
Parenthesized(Box<Expression>),
ArrayAccess {
array: Box<Expression>,
index: Box<Expression>,
},
FunctionCall {
function: Box<Expression>,
arguments: Vec<Expression>,
},
MemberAccess {
object: Box<Expression>,
member: String,
is_pointer: bool,
},
Unary {
operator: UnaryOperator,
operand: Box<Expression>,
},
Binary {
left: Box<Expression>,
operator: BinaryOperator,
right: Box<Expression>,
},
Conditional {
condition: Box<Expression>,
then_branch: Box<Expression>,
else_branch: Box<Expression>,
},
Assignment {
left: Box<Expression>,
operator: AssignmentOperator,
right: Box<Expression>,
},
Comma(Vec<Expression>),
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum UnaryOperator {
PostIncrement,
PostDecrement,
PreIncrement,
PreDecrement,
AddressOf,
Deref,
Plus,
Minus,
BitNot,
LogicalNot,
Sizeof,
AlignOf,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BinaryOperator {
Add,
Subtract,
Multiply,
Divide,
Remainder,
ShiftLeft,
ShiftRight,
Less,
Greater,
LessEqual,
GreaterEqual,
Equal,
NotEqual,
BitAnd,
BitXor,
BitOr,
LogicalAnd,
LogicalOr,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AssignmentOperator {
Assign,
AddAssign,
SubAssign,
MulAssign,
DivAssign,
RemAssign,
ShlAssign,
ShrAssign,
AndAssign,
XorAssign,
OrAssign,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TypeName {
pub specifier_qualifiers: Vec<SpecifierQualifier>,
pub abstract_declarator: Option<Box<AbstractDeclarator>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: Range<usize>,
}
impl TypeName {
pub fn new(specifier_qualifiers: Vec<SpecifierQualifier>, abstract_declarator: Option<Box<AbstractDeclarator>>, span: Range<usize>) -> Self {
Self { specifier_qualifiers, abstract_declarator, span }
}
}
impl CppRoot {
pub fn new(translation_unit: TranslationUnit) -> Self {
Self { translation_unit }
}
}
impl TranslationUnit {
pub fn new(external_declarations: Vec<ExternalDeclaration>, span: Range<usize>) -> Self {
Self { external_declarations, span }
}
}