syn_solidity/yul/type/
evm_builtin.rs

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        /// Representation of an EVM builtin opcode.
11        ///
12        /// Solidity Reference:
13        /// <https://docs.soliditylang.org/en/latest/grammar.html#a4.SolidityLexer.YulEVMBuiltin>
14        #[derive(Clone, Debug)]
15        pub enum YulEVMBuiltIn {
16            $( $variant($($token)*), )*
17        }
18
19        // Generate the parser
20        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);