use std::{ path::Path, process::exit };
use inkwell::module::Module;
use pest::Parser;
use crate::*;
pub fn compile_file(p: &Path) -> Module<'static> {
let input = match std::fs::read_to_string(p) {
Err(e) => panic!("Error while reading file {} (ERR: {})", p.to_str().unwrap(), e),
Ok(s) => s,
};
let pairs = match JunoParser::parse(Rule::program, &input.as_str()) {
Ok(pairs) => pairs,
Err(e) => {
panic!("{e}");
}
};
let expr_owned = parse_program(pairs.into_iter().next().unwrap());
let expr = Box::leak(Box::new(expr_owned));
let metairgen = Box::leak(Box::new(MetaIRGen::new(expr)));
let metair = Box::leak(Box::new(metairgen.lower_program(expr)));
let context = Box::leak(Box::new(inkwell::context::Context::create()));
let mut irgen = LLVMBackend::new(context, metair, "main");
if let Err(e) = irgen.compile() {
eprintln!("{:#?}", e);
exit(1);
}
return irgen.module;
}