use inkwell::types::BasicType;
use crate::metair::*;
use super::*;
use inkwell::types::BasicTypeEnum;
impl<'ctx> LLVMBackend<'ctx> {
pub fn lower_type(&mut 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.structs.get(*id as usize).is_some() {
if self.structs.get(id).is_none(){
self.lower_struct(&self.program.structs[*id as usize])?;
}
return match self.get_struct(vec![*id].as_slice()) {
Err(e) => Err(e),
Ok(s) => Ok(s.into())
};
}
Err(LLVMError::UnknownType(*id))
}
}
}
MetaType::Unit => todo!()
}
}
}