use inkwell::types::{ AnyTypeEnum, ArrayType, BasicType };
use inkwell::types::VectorType;
use crate::metair::*;
use super::*;
use inkwell::types::BasicTypeEnum;
impl<'ctx> LLVMBackend<'ctx> {
pub fn lower_type(&self, ty: &MetaType) -> Result<BasicTypeEnum<'ctx>, LLVMError> {
match ty {
MetaType::Pointer(inner) => {
Ok(self.lower_type(inner)?.ptr_type(inkwell::AddressSpace::default()).into())
}
MetaType::Reference(inner) => {
Ok(self.lower_type(inner)?.ptr_type(inkwell::AddressSpace::default()).into())
}
MetaType::Array { elem, size } => Ok(self.lower_type(elem)?.array_type(*size).into()),
MetaType::Named(id) => {
let name = &self.program.symbol_table[*id as usize];
match name.as_str() {
"bool" => Ok(self.context.bool_type().into()),
"char" => Ok(self.context.i8_type().into()),
"str" => Ok(self.context.i32_type().into()),
"i8" => Ok(self.context.i8_type().into()),
"i16" => Ok(self.context.i16_type().into()),
"i32" => Ok(self.context.i32_type().into()),
"i64" => Ok(self.context.i64_type().into()),
"u8" => Ok(self.context.i8_type().into()),
"u16" => Ok(self.context.i16_type().into()),
"u32" => Ok(self.context.i32_type().into()),
"u64" => Ok(self.context.i64_type().into()),
"f32" => Ok(self.context.f32_type().into()),
"f64" => Ok(self.context.f64_type().into()),
_ => {
if self.program.get_struct(*id).is_some() {
todo!("LLVM struct lowering");
}
Err(LLVMError::UnknownType(*id))
}
}
}
MetaType::Unit => todo!()
}
}
}