@@ -7,6 +7,7 @@ pub mod type_conversion;
77use melior:: ir:: BlockRef ;
88use melior:: ir:: Value ;
99use melior:: ir:: ValueLike ;
10+ use slang_solidity:: backend:: built_ins:: BuiltIn ;
1011use slang_solidity:: backend:: ir:: ast:: ArgumentsDeclaration ;
1112use slang_solidity:: backend:: ir:: ast:: ElementaryType ;
1213use slang_solidity:: backend:: ir:: ast:: Expression ;
@@ -154,38 +155,36 @@ impl<'emitter, 'state, 'context, 'block> CallEmitter<'emitter, 'state, 'context,
154155
155156 /// Emits a member access expression (e.g. `tx.origin`, `msg.sender`).
156157 ///
158+ /// Resolves the member via slang's binder to a specific `BuiltIn` variant
159+ /// rather than string-matching the member name.
160+ ///
157161 /// # Errors
158162 ///
159163 /// Returns an error if the member access is not a recognized EVM intrinsic.
160164 pub fn emit_member_access (
161165 & self ,
162- operand : & Expression ,
163- member : & str ,
166+ member_identifier : & slang_solidity:: backend:: ir:: ast:: Identifier ,
164167 block : BlockRef < ' context , ' block > ,
165168 ) -> anyhow:: Result < ( Value < ' context , ' block > , BlockRef < ' context , ' block > ) > {
166- if let Expression :: Identifier ( identifier) = operand {
167- let object = identifier. name ( ) ;
168- let intrinsic = match ( object. as_str ( ) , member) {
169- ( "tx" , "origin" ) => solx_mlir:: Builder :: SOL_ORIGIN ,
170- ( "tx" , "gasprice" ) => solx_mlir:: Builder :: SOL_GASPRICE ,
171- ( "msg" , "sender" ) => solx_mlir:: Builder :: SOL_CALLER ,
172- ( "msg" , "value" ) => solx_mlir:: Builder :: SOL_CALLVALUE ,
173- ( "block" , "timestamp" ) => solx_mlir:: Builder :: SOL_TIMESTAMP ,
174- ( "block" , "number" ) => solx_mlir:: Builder :: SOL_BLOCKNUMBER ,
175- ( "block" , "coinbase" ) => solx_mlir:: Builder :: SOL_COINBASE ,
176- ( "block" , "chainid" ) => solx_mlir:: Builder :: SOL_CHAINID ,
177- ( "block" , "basefee" ) => solx_mlir:: Builder :: SOL_BASEFEE ,
178- ( "block" , "gaslimit" ) => solx_mlir:: Builder :: SOL_GASLIMIT ,
179- _ => anyhow:: bail!( "unsupported member access: {object}.{member}" ) ,
180- } ;
181- let value = self
182- . expression_emitter
183- . state
184- . builder
185- . emit_sol_intrinsic ( intrinsic, & block) ;
186- return Ok ( ( value, block) ) ;
187- }
188- anyhow:: bail!( "unsupported member access on non-identifier operand" )
169+ let intrinsic = match member_identifier. resolved_built_in ( ) {
170+ Some ( BuiltIn :: TxOrigin ) => solx_mlir:: Builder :: SOL_ORIGIN ,
171+ Some ( BuiltIn :: TxGasPrice ) => solx_mlir:: Builder :: SOL_GASPRICE ,
172+ Some ( BuiltIn :: MsgSender ) => solx_mlir:: Builder :: SOL_CALLER ,
173+ Some ( BuiltIn :: MsgValue ) => solx_mlir:: Builder :: SOL_CALLVALUE ,
174+ Some ( BuiltIn :: BlockTimestamp ) => solx_mlir:: Builder :: SOL_TIMESTAMP ,
175+ Some ( BuiltIn :: BlockNumber ) => solx_mlir:: Builder :: SOL_BLOCKNUMBER ,
176+ Some ( BuiltIn :: BlockCoinbase ) => solx_mlir:: Builder :: SOL_COINBASE ,
177+ Some ( BuiltIn :: BlockChainid ) => solx_mlir:: Builder :: SOL_CHAINID ,
178+ Some ( BuiltIn :: BlockBasefee ) => solx_mlir:: Builder :: SOL_BASEFEE ,
179+ Some ( BuiltIn :: BlockGaslimit ) => solx_mlir:: Builder :: SOL_GASLIMIT ,
180+ _ => anyhow:: bail!( "unsupported member access: {}" , member_identifier. name( ) ) ,
181+ } ;
182+ let value = self
183+ . expression_emitter
184+ . state
185+ . builder
186+ . emit_sol_intrinsic ( intrinsic, & block) ;
187+ Ok ( ( value, block) )
189188 }
190189
191190 /// Emits a `require(condition)` built-in via `sol.require`.
0 commit comments