libjuno 0.1.1

Library for JunoLang
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!()
            //e => Err(LLVMError::Message(format!("type not implemented: {:#?}", e).into())),
        }
    }
}