use super::*;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub struct Expression {
pub kind: Box<ExpressionKind>,
#[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 ExpressionKind {
Identifier(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
Constant(Constant, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
StringLiteral(String, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
ArraySubscript {
array: Box<Expression>,
index: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
FunctionCall {
function: Box<Expression>,
arguments: Vec<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
MemberAccess {
object: Box<Expression>,
member: String,
is_pointer: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
PostfixIncDec {
operand: Box<Expression>,
is_increment: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
PrefixIncDec {
operand: Box<Expression>,
is_increment: bool,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Unary {
operator: UnaryOperator,
operand: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Cast {
type_name: Box<TypeName>,
expression: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Binary {
left: Box<Expression>,
operator: BinaryOperator,
right: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Conditional {
condition: Box<Expression>,
then_expr: Box<Expression>,
else_expr: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Assignment {
left: Box<Expression>,
operator: AssignmentOperator,
right: Box<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
Comma {
expressions: Vec<Expression>,
#[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
span: core::range::Range<usize>,
},
}
impl ExpressionKind {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Identifier(_, span) => span.clone(),
Self::Constant(_, span) => span.clone(),
Self::StringLiteral(_, span) => span.clone(),
Self::ArraySubscript { span, .. } => span.clone(),
Self::FunctionCall { span, .. } => span.clone(),
Self::MemberAccess { span, .. } => span.clone(),
Self::PostfixIncDec { span, .. } => span.clone(),
Self::PrefixIncDec { span, .. } => span.clone(),
Self::Unary { span, .. } => span.clone(),
Self::Cast { span, .. } => span.clone(),
Self::Binary { span, .. } => span.clone(),
Self::Conditional { span, .. } => span.clone(),
Self::Assignment { span, .. } => span.clone(),
Self::Comma { span, .. } => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
pub enum Constant {
Integer(i64, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
Float(f64, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
Character(char, #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))] core::range::Range<usize>),
}
impl Constant {
pub fn span(&self) -> core::range::Range<usize> {
match self {
Self::Integer(_, span) => span.clone(),
Self::Float(_, span) => span.clone(),
Self::Character(_, span) => span.clone(),
}
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnaryOperator {
AddressOf,
Indirection,
Plus,
Minus,
BitNot,
LogicalNot,
Sizeof,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinaryOperator {
Multiply,
Divide,
Modulo,
Add,
Subtract,
ShiftLeft,
ShiftRight,
Less,
Greater,
LessEqual,
GreaterEqual,
Equal,
NotEqual,
BitAnd,
BitXor,
BitOr,
LogicalAnd,
LogicalOr,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AssignmentOperator {
Assign,
MulAssign,
DivAssign,
ModAssign,
AddAssign,
SubAssign,
ShlAssign,
ShrAssign,
AndAssign,
XorAssign,
OrAssign,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq)]
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: core::range::Range<usize>,
}
impl TypeName {
pub fn span(&self) -> core::range::Range<usize> {
self.span.clone()
}
}