use gc::{unsafe_empty_trace, Finalize, Trace};
use std::fmt::{Display, Formatter, Result};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum NumOp {
Add,
Sub,
Div,
Mul,
Exp,
Mod,
}
impl Display for NumOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::Add => "+",
Self::Sub => "-",
Self::Div => "/",
Self::Mul => "*",
Self::Exp => "**",
Self::Mod => "%",
}
)
}
}
unsafe impl Trace for NumOp {
unsafe_empty_trace!();
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum UnaryOp {
IncrementPost,
IncrementPre,
DecrementPost,
DecrementPre,
Minus,
Plus,
Not,
Tilde,
TypeOf,
Delete,
Void,
}
impl Display for UnaryOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::IncrementPost | Self::IncrementPre => "++",
Self::DecrementPost | Self::DecrementPre => "--",
Self::Plus => "+",
Self::Minus => "-",
Self::Not => "!",
Self::Tilde => "~",
Self::Delete => "delete",
Self::TypeOf => "typeof",
Self::Void => "void",
}
)
}
}
unsafe impl Trace for UnaryOp {
unsafe_empty_trace!();
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum BitOp {
And,
Or,
Xor,
Shl,
Shr,
UShr,
}
impl Display for BitOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::And => "&",
Self::Or => "|",
Self::Xor => "^",
Self::Shl => "<<",
Self::Shr => ">>",
Self::UShr => ">>>",
}
)
}
}
unsafe impl Trace for BitOp {
unsafe_empty_trace!();
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum CompOp {
Equal,
NotEqual,
StrictEqual,
StrictNotEqual,
GreaterThan,
GreaterThanOrEqual,
LessThan,
LessThanOrEqual,
In,
InstanceOf,
}
impl Display for CompOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::Equal => "==",
Self::NotEqual => "!=",
Self::StrictEqual => "===",
Self::StrictNotEqual => "!==",
Self::GreaterThan => ">",
Self::GreaterThanOrEqual => ">=",
Self::LessThan => "<",
Self::LessThanOrEqual => "<=",
Self::In => "in",
Self::InstanceOf => "instanceof",
}
)
}
}
unsafe impl Trace for CompOp {
unsafe_empty_trace!();
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum LogOp {
And,
Or,
}
impl Display for LogOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::And => "&&",
Self::Or => "||",
}
)
}
}
unsafe impl Trace for LogOp {
unsafe_empty_trace!();
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum BinOp {
Num(NumOp),
Bit(BitOp),
Comp(CompOp),
Log(LogOp),
Assign(AssignOp),
Comma,
}
impl From<NumOp> for BinOp {
fn from(op: NumOp) -> Self {
Self::Num(op)
}
}
impl From<BitOp> for BinOp {
fn from(op: BitOp) -> Self {
Self::Bit(op)
}
}
impl From<CompOp> for BinOp {
fn from(op: CompOp) -> Self {
Self::Comp(op)
}
}
impl From<LogOp> for BinOp {
fn from(op: LogOp) -> Self {
Self::Log(op)
}
}
impl From<AssignOp> for BinOp {
fn from(op: AssignOp) -> Self {
Self::Assign(op)
}
}
impl Display for BinOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::Num(ref op) => op.to_string(),
Self::Bit(ref op) => op.to_string(),
Self::Comp(ref op) => op.to_string(),
Self::Log(ref op) => op.to_string(),
Self::Assign(ref op) => op.to_string(),
Self::Comma => ",".to_string(),
}
)
}
}
unsafe impl Trace for BinOp {
unsafe_empty_trace!();
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Copy, Debug, Finalize, PartialEq)]
pub enum AssignOp {
Add,
Sub,
Mul,
Div,
Mod,
Exp,
And,
Or,
Xor,
Shl,
Shr,
Ushr,
}
unsafe impl Trace for AssignOp {
unsafe_empty_trace!();
}
impl Display for AssignOp {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
write!(
f,
"{}",
match *self {
Self::Add => "+=",
Self::Sub => "-=",
Self::Mul => "*=",
Self::Exp => "**=",
Self::Div => "/=",
Self::Mod => "%=",
Self::And => "&=",
Self::Or => "|=",
Self::Xor => "^=",
Self::Shl => "<<=",
Self::Shr => ">>=",
Self::Ushr => ">>>=",
}
)
}
}