Skip to main content

dada_codegen/
lib.rs

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/// Generate a self-contained wasm module from a starting function.
30#[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}