use super::*;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum Type {
Base(TypeSpecifier),
Pointer(Box<Type>),
Array {
element_type: Box<Type>,
size: Option<Box<Expression>>,
},
Function {
return_type: Box<Type>,
parameters: Vec<Type>,
variadic: bool,
},
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum ExternalDeclaration {
FunctionDefinition(FunctionDefinition),
Declaration(Declaration),
}
impl ExternalDeclaration {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::FunctionDefinition(n) => n.span.clone(),
Self::Declaration(n) => n.span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
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: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
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: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum DeclarationSpecifier {
StorageClassSpecifier(StorageClassSpecifier),
TypeSpecifier(TypeSpecifier),
TypeQualifier(TypeQualifier),
FunctionSpecifier(FunctionSpecifier),
}
impl DeclarationSpecifier {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::StorageClassSpecifier(n) => n.span(),
Self::TypeSpecifier(n) => n.span(),
Self::TypeQualifier(n) => n.span(),
Self::FunctionSpecifier(n) => n.span(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum StorageClassSpecifier {
Typedef {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Extern {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Static {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Auto {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Register {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl StorageClassSpecifier {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Typedef { span } => span.clone(),
Self::Extern { span } => span.clone(),
Self::Static { span } => span.clone(),
Self::Auto { span } => span.clone(),
Self::Register { span } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum TypeSpecifier {
Void {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Char {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Short {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Int {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Long {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Float {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Double {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Signed {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Unsigned {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Bool {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Complex {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Imaginary {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
StructOrUnion(StructOrUnionSpecifier),
Enum(EnumSpecifier),
TypedefName(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
}
impl TypeSpecifier {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Void { span } => span.clone(),
Self::Char { span } => span.clone(),
Self::Short { span } => span.clone(),
Self::Int { span } => span.clone(),
Self::Long { span } => span.clone(),
Self::Float { span } => span.clone(),
Self::Double { span } => span.clone(),
Self::Signed { span } => span.clone(),
Self::Unsigned { span } => span.clone(),
Self::Bool { span } => span.clone(),
Self::Complex { span } => span.clone(),
Self::Imaginary { span } => span.clone(),
Self::StructOrUnion(n) => n.span.clone(),
Self::Enum(n) => n.span.clone(),
Self::TypedefName(_, span) => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum TypeQualifier {
Const {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Restrict {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Volatile {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl TypeQualifier {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Const { span } => span.clone(),
Self::Restrict { span } => span.clone(),
Self::Volatile { span } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum FunctionSpecifier {
Inline {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl FunctionSpecifier {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Inline { span } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct StructOrUnionSpecifier {
pub kind: StructOrUnion,
pub identifier: Option<String>,
pub struct_declarations: Vec<StructDeclaration>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum StructOrUnion {
Struct {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Union {
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl StructOrUnion {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Struct { span } => span.clone(),
Self::Union { span } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct StructDeclaration {
pub specifier_qualifier_list: Vec<SpecifierQualifier>,
pub struct_declarator_list: Vec<StructDeclarator>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum SpecifierQualifier {
TypeSpecifier(TypeSpecifier),
TypeQualifier(TypeQualifier),
}
impl SpecifierQualifier {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::TypeSpecifier(n) => n.span(),
Self::TypeQualifier(n) => n.span(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct StructDeclarator {
pub declarator: Option<Declarator>,
pub constant_expression: Option<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct EnumSpecifier {
pub identifier: Option<String>,
pub enumerators: Vec<Enumerator>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct Enumerator {
pub identifier: String,
pub constant_expression: Option<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct InitDeclarator {
pub declarator: Declarator,
pub initializer: Option<Initializer>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct Declarator {
pub pointer: Option<Pointer>,
pub direct_declarator: DirectDeclarator,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
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: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum DirectDeclarator {
Identifier(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
Declarator(Box<Declarator>, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
Array {
direct_declarator: Box<DirectDeclarator>,
type_qualifiers: Vec<TypeQualifier>,
assignment_expression: Option<Box<Expression>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Function {
direct_declarator: Box<DirectDeclarator>,
parameter_list: ParameterList,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl DirectDeclarator {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Identifier(_, span) => span.clone(),
Self::Declarator(n, _) => n.span.clone(),
Self::Array { span, .. } => span.clone(),
Self::Function { span, .. } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct ParameterList {
pub parameter_declarations: Vec<ParameterDeclaration>,
pub variadic: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
pub span: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
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: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
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: core::range::Range<usize>,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum DirectAbstractDeclarator {
AbstractDeclarator(Box<AbstractDeclarator>),
Array {
declarator: Option<Box<DirectAbstractDeclarator>>,
assignment_expression: Option<Box<Expression>>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Function {
declarator: Option<Box<DirectAbstractDeclarator>>,
parameter_list: Option<ParameterList>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl DirectAbstractDeclarator {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::AbstractDeclarator(n) => n.span.clone(),
Self::Array { span, .. } => span.clone(),
Self::Function { span, .. } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum Initializer {
AssignmentExpression(Expression),
InitializerList(Vec<Initializer>, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
}
impl Initializer {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::AssignmentExpression(n) => n.span.clone(),
Self::InitializerList(_, span) => span.clone(),
}
}
}