use super::Expression;
use super::Span;
#[derive(Clone, Debug)]
pub enum ExprBinary {
Add(ExprBinaryData),
Sub(ExprBinaryData),
Mul(ExprBinaryData),
Div(ExprBinaryData),
FloorDiv(ExprBinaryData),
Mod(ExprBinaryData),
Pow(ExprBinaryData),
Concat(ExprBinaryData),
BitwiseAnd(ExprBinaryData),
BitwiseOr(ExprBinaryData),
BitwiseXor(ExprBinaryData),
ShiftLeft(ExprBinaryData),
ShiftRight(ExprBinaryData),
Equal(ExprBinaryData),
NotEqual(ExprBinaryData),
LessThan(ExprBinaryData),
LessEqual(ExprBinaryData),
GreaterThan(ExprBinaryData),
GreaterEqual(ExprBinaryData),
LogicalAnd(ExprBinaryData),
LogicalOr(ExprBinaryData),
}
impl ExprBinary {
pub fn span(&self) -> Span {
match self {
Self::Add(data) => data.span(),
Self::Sub(data) => data.span(),
Self::Mul(data) => data.span(),
Self::Div(data) => data.span(),
Self::FloorDiv(data) => data.span(),
Self::Mod(data) => data.span(),
Self::Pow(data) => data.span(),
Self::Concat(data) => data.span(),
Self::BitwiseAnd(data) => data.span(),
Self::BitwiseOr(data) => data.span(),
Self::BitwiseXor(data) => data.span(),
Self::ShiftLeft(data) => data.span(),
Self::ShiftRight(data) => data.span(),
Self::Equal(data) => data.span(),
Self::NotEqual(data) => data.span(),
Self::LessThan(data) => data.span(),
Self::LessEqual(data) => data.span(),
Self::GreaterThan(data) => data.span(),
Self::GreaterEqual(data) => data.span(),
Self::LogicalAnd(data) => data.span(),
Self::LogicalOr(data) => data.span(),
}
}
pub fn span_op(&self) -> Span {
match self {
Self::Add(data) => data.span_op(),
Self::Sub(data) => data.span_op(),
Self::Mul(data) => data.span_op(),
Self::Div(data) => data.span_op(),
Self::FloorDiv(data) => data.span_op(),
Self::Mod(data) => data.span_op(),
Self::Pow(data) => data.span_op(),
Self::Concat(data) => data.span_op(),
Self::BitwiseAnd(data) => data.span_op(),
Self::BitwiseOr(data) => data.span_op(),
Self::BitwiseXor(data) => data.span_op(),
Self::ShiftLeft(data) => data.span_op(),
Self::ShiftRight(data) => data.span_op(),
Self::Equal(data) => data.span_op(),
Self::NotEqual(data) => data.span_op(),
Self::LessThan(data) => data.span_op(),
Self::LessEqual(data) => data.span_op(),
Self::GreaterThan(data) => data.span_op(),
Self::GreaterEqual(data) => data.span_op(),
Self::LogicalAnd(data) => data.span_op(),
Self::LogicalOr(data) => data.span_op(),
}
}
}
#[derive(Clone, Debug)]
pub struct ExprBinaryData {
pub lhs: Box<Expression>,
pub rhs: Box<Expression>,
pub span: Span,
pub span_op: Span,
}
impl ExprBinaryData {
pub fn new(lhs: Expression, rhs: Expression, span: Span, span_op: Span) -> Self {
Self {
lhs: Box::new(lhs),
rhs: Box::new(rhs),
span,
span_op,
}
}
pub fn span(&self) -> Span {
self.span
}
pub fn span_op(&self) -> Span {
self.span_op
}
}