use crate::{ir::ty::HirTypeCache, CodeGenDatabase};
use inkwell::{context::Context, module::Module, targets::TargetMachine, types::StructType};
use std::{cell::RefCell, collections::HashMap, sync::Arc};
pub struct CodeGenContext<'db, 'ink> {
pub context: &'ink Context,
pub db: &'db dyn mun_hir::HirDatabase,
pub rust_types: RefCell<HashMap<&'static str, StructType<'ink>>>,
pub hir_types: HirTypeCache<'db, 'ink>,
pub optimization_level: inkwell::OptimizationLevel,
pub target_machine: Arc<TargetMachine>,
}
impl<'db, 'ink> CodeGenContext<'db, 'ink> {
pub fn new(context: &'ink Context, db: &'db dyn CodeGenDatabase) -> Self {
let target_machine = db.target_machine().0;
Self {
context,
rust_types: RefCell::new(HashMap::default()),
hir_types: HirTypeCache::new(context, db.upcast(), target_machine.get_target_data()),
optimization_level: db.optimization_level(),
target_machine,
db: db.upcast(),
}
}
pub fn create_module(&self, name: impl AsRef<str>) -> Module<'ink> {
let module = self.context.create_module(name.as_ref());
module.set_data_layout(&self.target_machine.get_target_data().get_data_layout());
module.set_triple(&self.target_machine.get_triple());
module
}
}