1use dada_ir_ast::{ast::Identifier, diagnostic::Diagnostic, inputs::SourceFile};
2use dada_ir_sym::{
3 Db,
4 ir::{functions::SymFunction, types::SymGenericTerm},
5 prelude::Symbol,
6};
7
8mod cx;
9
10#[salsa::tracked(return_ref)]
11pub fn codegen_main_fn<'db>(db: &'db dyn Db, source_file: SourceFile) -> Option<Vec<u8>> {
12 let main = Identifier::main(db);
13 let module = source_file.symbol(db);
14 let main_fn = module.function_named(db, main)?;
15
16 if !main_fn.symbols(db).has_generics_of_kind(db, &[]) {
17 let error = Diagnostic::error(
18 db,
19 main_fn.name_span(db),
20 "main function must have no generics",
21 );
22 error.report(db);
23 return None;
24 }
25
26 Some(codegen(db, main_fn, vec![]).clone())
27}
28
29#[salsa::tracked(return_ref)]
31pub fn codegen<'db>(
32 db: &'db dyn crate::Db,
33 function: SymFunction<'db>,
34 generics: Vec<SymGenericTerm<'db>>,
35) -> Vec<u8> {
36 cx::Cx::new(db)
37 .generate_from_fn(function, generics)
38 .finish()
39}