use super::ValueId; use crate::ast::ASTNode; impl super::MirBuilder { // Indirect call: (callee)(args...) pub(super) fn build_indirect_call_expression( &mut self, callee: ASTNode, arguments: Vec, ) -> Result { let callee_id = self.build_expression_impl(callee)?; let mut arg_ids: Vec = Vec::new(); for a in arguments { arg_ids.push(self.build_expression_impl(a)?); } // Phase 3.1: Use unified call with CallTarget::Value for indirect calls let use_unified = super::calls::call_unified::is_unified_call_enabled(); if use_unified { // New unified path - use emit_unified_call with Value target let dst = self.next_value_id(); self.emit_unified_call( Some(dst), super::builder_calls::CallTarget::Value(callee_id), arg_ids, )?; Ok(dst) } else { // Unified-off path: still encode callee as Value to avoid by-name resolution let dst = self.next_value_id(); self.emit_instruction(super::MirInstruction::Call { dst: Some(dst), func: callee_id, callee: Some(crate::mir::definitions::call_unified::Callee::Value( callee_id, )), args: arg_ids, effects: super::EffectMask::PURE, })?; Ok(dst) } } }