use crate::ir::ir_type_info::{IrInstanceTypeInfo, IrTypeInfo}; use crate::semantic_analysis::analysis_context::AnalysisContext; use crate::semantic_analysis::type_info::TypeInfo; pub fn to_ir_type_info(ctx: &AnalysisContext, sa_type_info: &TypeInfo) -> IrTypeInfo { match sa_type_info { TypeInfo::Instance(instance_type_info) => { let class_symbol = &ctx.symbols()[instance_type_info.class_symbol_id()].unwrap_class_symbol(); if class_symbol.fqn() == "core::String" { IrTypeInfo::String } else { IrTypeInfo::Instance(IrInstanceTypeInfo::new(class_symbol.fqn_owned())) } } TypeInfo::Int => IrTypeInfo::Int, TypeInfo::Double => IrTypeInfo::Double, TypeInfo::Void => IrTypeInfo::Void, _ => { panic!("BUG! Unknown sa_type_info: {:?}", sa_type_info); } } } pub fn return_type_info_to_ir_type_info( ctx: &AnalysisContext, return_type_info: &TypeInfo, ) -> Option { match return_type_info { TypeInfo::Instance(_) | TypeInfo::Int | TypeInfo::Double => { Some(to_ir_type_info(ctx, return_type_info)) } TypeInfo::Void => None, _ => panic!("BUG! Unknown return_type_info: {:?}", return_type_info), } }