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