1use super::types::SolidityExpr;
12use std::fmt;
13
14impl fmt::Display for SolidityExpr {
15 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16 match self {
17 SolidityExpr::IntLit(n) => write!(f, "{}", n),
18 SolidityExpr::BoolLit(b) => write!(f, "{}", b),
19 SolidityExpr::StrLit(s) => write!(f, "\"{}\"", s),
20 SolidityExpr::AddressLit(a) => write!(f, "{}", a),
21 SolidityExpr::HexLit(h) => write!(f, "{}", h),
22 SolidityExpr::Var(v) => write!(f, "{}", v),
23 SolidityExpr::This => write!(f, "this"),
24 SolidityExpr::MsgSender => write!(f, "msg.sender"),
25 SolidityExpr::MsgValue => write!(f, "msg.value"),
26 SolidityExpr::MsgData => write!(f, "msg.data"),
27 SolidityExpr::BlockTimestamp => write!(f, "block.timestamp"),
28 SolidityExpr::BlockNumber => write!(f, "block.number"),
29 SolidityExpr::BlockBasefee => write!(f, "block.basefee"),
30 SolidityExpr::TxOrigin => write!(f, "tx.origin"),
31 SolidityExpr::GasLeft => write!(f, "gasleft()"),
32 SolidityExpr::FieldAccess(e, field) => write!(f, "{}.{}", e, field),
33 SolidityExpr::Index(e, idx) => write!(f, "{}[{}]", e, idx),
34 SolidityExpr::Call(func, args) => {
35 write!(f, "{}(", func)?;
36 for (i, a) in args.iter().enumerate() {
37 if i > 0 {
38 write!(f, ", ")?;
39 }
40 write!(f, "{}", a)?;
41 }
42 write!(f, ")")
43 }
44 SolidityExpr::NamedCall(func, args) => {
45 write!(f, "{}({{", func)?;
46 for (i, (k, v)) in args.iter().enumerate() {
47 if i > 0 {
48 write!(f, ", ")?;
49 }
50 write!(f, "{}: {}", k, v)?;
51 }
52 write!(f, "}})")
53 }
54 SolidityExpr::Cast(ty, expr) => write!(f, "{}({})", ty, expr),
55 SolidityExpr::AbiEncode(args) => {
56 write!(f, "abi.encode(")?;
57 for (i, a) in args.iter().enumerate() {
58 if i > 0 {
59 write!(f, ", ")?;
60 }
61 write!(f, "{}", a)?;
62 }
63 write!(f, ")")
64 }
65 SolidityExpr::AbiEncodePacked(args) => {
66 write!(f, "abi.encodePacked(")?;
67 for (i, a) in args.iter().enumerate() {
68 if i > 0 {
69 write!(f, ", ")?;
70 }
71 write!(f, "{}", a)?;
72 }
73 write!(f, ")")
74 }
75 SolidityExpr::AbiEncodeWithSelector(sel, args) => {
76 write!(f, "abi.encodeWithSelector({}", sel)?;
77 for a in args.iter() {
78 write!(f, ", {}", a)?;
79 }
80 write!(f, ")")
81 }
82 SolidityExpr::Keccak256(data) => write!(f, "keccak256({})", data),
83 SolidityExpr::Sha256(data) => write!(f, "sha256({})", data),
84 SolidityExpr::Ecrecover(h, v, r, s) => {
85 write!(f, "ecrecover({}, {}, {}, {})", h, v, r, s)
86 }
87 SolidityExpr::BinOp(op, lhs, rhs) => write!(f, "({} {} {})", lhs, op, rhs),
88 SolidityExpr::UnaryOp(op, expr) => write!(f, "{}({})", op, expr),
89 SolidityExpr::Ternary(cond, then_, else_) => {
90 write!(f, "({} ? {} : {})", cond, then_, else_)
91 }
92 SolidityExpr::New(ty, args) => {
93 write!(f, "new {}(", ty)?;
94 for (i, a) in args.iter().enumerate() {
95 if i > 0 {
96 write!(f, ", ")?;
97 }
98 write!(f, "{}", a)?;
99 }
100 write!(f, ")")
101 }
102 SolidityExpr::Delete(expr) => write!(f, "delete {}", expr),
103 SolidityExpr::ArrayLit(elems) => {
104 write!(f, "[")?;
105 for (i, e) in elems.iter().enumerate() {
106 if i > 0 {
107 write!(f, ", ")?;
108 }
109 write!(f, "{}", e)?;
110 }
111 write!(f, "]")
112 }
113 SolidityExpr::TupleLit(elems) => {
114 write!(f, "(")?;
115 for (i, e) in elems.iter().enumerate() {
116 if i > 0 {
117 write!(f, ", ")?;
118 }
119 write!(f, "{}", e)?;
120 }
121 write!(f, ")")
122 }
123 SolidityExpr::TypeMax(ty) => write!(f, "type({}).max", ty),
124 SolidityExpr::TypeMin(ty) => write!(f, "type({}).min", ty),
125 SolidityExpr::Payable(addr) => write!(f, "payable({})", addr),
126 }
127 }
128}