1use crate::{kw, Spanned};
2use proc_macro2::Span;
3use syn::{
4 parse::{Parse, ParseStream},
5 Result, Token,
6};
7
8macro_rules! yul_evm_builtin_enum_builder {
9 ($( $variant:ident($($token:tt)* ) ),* $(,)?) => {
10 #[derive(Clone, Debug)]
15 pub enum YulEVMBuiltIn {
16 $( $variant($($token)*), )*
17 }
18
19 impl Parse for YulEVMBuiltIn {
21 fn parse(input: ParseStream<'_>) -> Result<Self> {
22 let lookahead = input.lookahead1();
23 $(
24 if lookahead.peek($($token)*) {
25 return input.parse().map(Self::$variant);
26 }
27 )*
28 Err(lookahead.error())
29 }
30 }
31
32 impl Spanned for YulEVMBuiltIn {
33 fn span(&self) -> Span {
34 match self {
35 $( Self::$variant(inner) => inner.span(), )*
36 }
37 }
38
39 fn set_span(&mut self, span: proc_macro2::Span) {
40 match self {
41 $( Self::$variant(inner) => inner.span = span, )*
42 }
43 }
44 }
45 };
46}
47
48yul_evm_builtin_enum_builder!(
49 Stop(kw::stop),
50 Add(kw::add),
51 Sub(kw::sub),
52 Mul(kw::mul),
53 Div(kw::div),
54 Sdiv(kw::sdiv),
55 Mod(Token![mod]),
56 Smod(kw::smod),
57 Exp(kw::exp),
58 Not(kw::not),
59 Lt(kw::lt),
60 Gt(kw::gt),
61 Slt(kw::slt),
62 Sgt(kw::sgt),
63 Eq(kw::eq),
64 Iszero(kw::iszero),
65 And(kw::and),
66 Or(kw::or),
67 Xor(kw::xor),
68 Byte(kw::byte),
69 Shl(kw::shl),
70 Shr(kw::shr),
71 Sar(kw::sar),
72 Addmod(kw::addmod),
73 Mulmod(kw::mulmod),
74 Signextend(kw::signextend),
75 Keccak256(kw::keccak256),
76 Pop(kw::pop),
77 Mload(kw::mload),
78 Mstore(kw::mstore),
79 Mstore8(kw::mstore8),
80 Sload(kw::sload),
81 Sstore(kw::sstore),
82 Msize(kw::msize),
83 Gas(kw::gas),
84 Address(kw::address),
85 Balance(kw::balance),
86 Selfbalance(kw::selfbalance),
87 Caller(kw::caller),
88 Callvalue(kw::callvalue),
89 Calldataload(kw::calldataload),
90 Calldatasize(kw::calldatasize),
91 Calldatacopy(kw::calldatacopy),
92 Extcodesize(kw::extcodesize),
93 Extcodecopy(kw::extcodecopy),
94 Returndatasize(kw::returndatasize),
95 Returndatacopy(kw::returndatacopy),
96 Extcodehash(kw::extcodehash),
97 Create(kw::create),
98 Create2(kw::create2),
99 Call(kw::call),
100 Callcode(kw::callcode),
101 Delegatecall(kw::delegatecall),
102 Staticcall(kw::staticcall),
103 Return(Token![return]),
104 Revert(kw::revert),
105 Selfdestruct(kw::selfdestruct),
106 Invalid(kw::invalid),
107 Log0(kw::log0),
108 Log1(kw::log1),
109 Log2(kw::log2),
110 Log3(kw::log3),
111 Log4(kw::log4),
112 Chainid(kw::chainid),
113 Origin(kw::origin),
114 Gasprice(kw::gasprice),
115 Blockhash(kw::blockhash),
116 Coinbase(kw::coinbase),
117 Timestamp(kw::timestamp),
118 Number(kw::number),
119 Difficulty(kw::difficulty),
120 Prevrandao(kw::prevrandao),
121 Gaslimit(kw::gaslimit),
122 Basefee(kw::basefee),
123);