deimos-lang/dmc-lib/src/lowering/util.rs
2026-08-29 20:35:29 -05:00

37 lines
1.3 KiB
Rust

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<IrTypeInfo> {
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),
}
}