37 lines
1.3 KiB
Rust
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),
|
|
}
|
|
}
|