swc_estree_compat/babelify/
operators.rs1use serde::{Deserialize, Serialize};
2use swc_ecma_ast::{AssignOp, BinaryOp, UnaryOp, UpdateOp};
3use swc_estree_ast::{BinaryExprOp, LogicalExprOp, UnaryExprOp, UpdateExprOp};
4
5use crate::babelify::{Babelify, Context};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub enum BinaryOpOutput {
9 BinOp(BinaryExprOp),
10 LogicOp(LogicalExprOp),
11}
12
13impl From<BinaryOpOutput> for BinaryExprOp {
14 fn from(o: BinaryOpOutput) -> Self {
15 match o {
16 BinaryOpOutput::BinOp(op) => op,
17 BinaryOpOutput::LogicOp(_) => panic!(
18 "illegal conversion: Cannot convert {:?} to BinaryExprOp",
19 &o
20 ),
21 }
22 }
23}
24
25impl From<BinaryOpOutput> for LogicalExprOp {
26 fn from(o: BinaryOpOutput) -> Self {
27 match o {
28 BinaryOpOutput::LogicOp(op) => op,
29 BinaryOpOutput::BinOp(_) => panic!(
30 "illegal conversion: Cannot convert {:?} to LogicalExprOp",
31 &o
32 ),
33 }
34 }
35}
36
37impl Babelify for BinaryOp {
38 type Output = BinaryOpOutput;
39
40 fn babelify(self, _ctx: &Context) -> Self::Output {
41 match self {
42 BinaryOp::EqEq => BinaryOpOutput::BinOp(BinaryExprOp::Equal),
43 BinaryOp::NotEq => BinaryOpOutput::BinOp(BinaryExprOp::NotEqual),
44 BinaryOp::EqEqEq => BinaryOpOutput::BinOp(BinaryExprOp::StrictEqual),
45 BinaryOp::NotEqEq => BinaryOpOutput::BinOp(BinaryExprOp::StrictNotEqual),
46 BinaryOp::Lt => BinaryOpOutput::BinOp(BinaryExprOp::LessThan),
47 BinaryOp::LtEq => BinaryOpOutput::BinOp(BinaryExprOp::LessThanOrEqual),
48 BinaryOp::Gt => BinaryOpOutput::BinOp(BinaryExprOp::GreaterThan),
49 BinaryOp::GtEq => BinaryOpOutput::BinOp(BinaryExprOp::GreaterThanOrEqual),
50 BinaryOp::LShift => BinaryOpOutput::BinOp(BinaryExprOp::LeftShift),
51 BinaryOp::RShift => BinaryOpOutput::BinOp(BinaryExprOp::RightShift),
52 BinaryOp::ZeroFillRShift => BinaryOpOutput::BinOp(BinaryExprOp::UnsignedRightShift),
53 BinaryOp::Add => BinaryOpOutput::BinOp(BinaryExprOp::Addition),
54 BinaryOp::Sub => BinaryOpOutput::BinOp(BinaryExprOp::Subtraction),
55 BinaryOp::Mul => BinaryOpOutput::BinOp(BinaryExprOp::Multiplication),
56 BinaryOp::Div => BinaryOpOutput::BinOp(BinaryExprOp::Division),
57 BinaryOp::Mod => BinaryOpOutput::BinOp(BinaryExprOp::Remainder),
58 BinaryOp::BitOr => BinaryOpOutput::BinOp(BinaryExprOp::Or),
59 BinaryOp::BitXor => BinaryOpOutput::BinOp(BinaryExprOp::Xor),
60 BinaryOp::BitAnd => BinaryOpOutput::BinOp(BinaryExprOp::And),
61 BinaryOp::LogicalOr => BinaryOpOutput::LogicOp(LogicalExprOp::Or),
62 BinaryOp::LogicalAnd => BinaryOpOutput::LogicOp(LogicalExprOp::And),
63 BinaryOp::In => BinaryOpOutput::BinOp(BinaryExprOp::In),
64 BinaryOp::InstanceOf => BinaryOpOutput::BinOp(BinaryExprOp::Instanceof),
65 BinaryOp::Exp => BinaryOpOutput::BinOp(BinaryExprOp::Exponentiation),
66 BinaryOp::NullishCoalescing => BinaryOpOutput::LogicOp(LogicalExprOp::Nullish),
67 #[cfg(swc_ast_unknown)]
68 _ => panic!("unable to access unknown nodes"),
69 }
70 }
71}
72
73impl Babelify for AssignOp {
77 type Output = String;
78
79 fn babelify(self, _ctx: &Context) -> Self::Output {
80 match self {
81 AssignOp::Assign => "=".into(),
82 AssignOp::AddAssign => "+=".into(),
83 AssignOp::SubAssign => "-=".into(),
84 AssignOp::MulAssign => "*=".into(),
85 AssignOp::DivAssign => "/=".into(),
86 AssignOp::ModAssign => "%=".into(),
87 AssignOp::LShiftAssign => "<<=".into(),
88 AssignOp::RShiftAssign => ">>=".into(),
89 AssignOp::ZeroFillRShiftAssign => ">>>=".into(),
90 AssignOp::BitOrAssign => "|=".into(),
91 AssignOp::BitXorAssign => "^=".into(),
92 AssignOp::BitAndAssign => "&=".into(),
93 AssignOp::ExpAssign => "**=".into(),
94 AssignOp::AndAssign => "&&=".into(),
95 AssignOp::OrAssign => "||=".into(),
96 AssignOp::NullishAssign => "??=".into(),
97 #[cfg(swc_ast_unknown)]
98 _ => panic!("unable to access unknown nodes"),
99 }
100 }
101}
102
103impl Babelify for UpdateOp {
104 type Output = UpdateExprOp;
105
106 fn babelify(self, _ctx: &Context) -> Self::Output {
107 match self {
108 UpdateOp::PlusPlus => UpdateExprOp::Increment,
109 UpdateOp::MinusMinus => UpdateExprOp::Decrement,
110 #[cfg(swc_ast_unknown)]
111 _ => panic!("unable to access unknown nodes"),
112 }
113 }
114}
115
116impl Babelify for UnaryOp {
117 type Output = UnaryExprOp;
118
119 fn babelify(self, _ctx: &Context) -> Self::Output {
120 match self {
121 UnaryOp::Minus => UnaryExprOp::Negation,
123 UnaryOp::Plus => UnaryExprOp::Plus,
124 UnaryOp::Bang => UnaryExprOp::LogicalNot,
125 UnaryOp::Tilde => UnaryExprOp::BitwiseNot,
126 UnaryOp::TypeOf => UnaryExprOp::Typeof,
127 UnaryOp::Void => UnaryExprOp::Void,
128 UnaryOp::Delete => UnaryExprOp::Delete,
129 #[cfg(swc_ast_unknown)]
130 _ => panic!("unable to access unknown nodes"),
131 }
132 }
133}