Skip to main content

uika_codegen/cpp_gen/
mod.rs

1// C++ code generation orchestrator.
2
3pub mod wrapper;
4pub mod func_ids;
5pub mod fill_table;
6
7use std::collections::BTreeMap;
8use std::path::Path;
9
10use crate::context::CodegenContext;
11
12/// Generate all C++ code into the output directory.
13pub fn generate(ctx: &CodegenContext, out_dir: &Path) {
14    std::fs::create_dir_all(out_dir).expect("Failed to create C++ output directory");
15
16    // Group func entries by (module, class) for per-file generation
17    let mut by_class: BTreeMap<(String, String), Vec<&crate::context::FuncEntry>> = BTreeMap::new();
18    for entry in &ctx.func_table {
19        by_class
20            .entry((entry.module_name.clone(), entry.class_name.clone()))
21            .or_default()
22            .push(entry);
23    }
24
25    // Generate per-class wrapper files
26    for ((module, class), entries) in &by_class {
27        let code = wrapper::generate_wrapper_file(entries, ctx);
28        let filename = format!("UikaFunc_{}_{}.cpp", module, class);
29        std::fs::write(out_dir.join(&filename), code)
30            .unwrap_or_else(|e| panic!("Failed to write {filename}: {e}"));
31    }
32
33    // Generate UikaFuncIds.h
34    let ids_code = func_ids::generate_cpp_func_ids(&ctx.func_table);
35    std::fs::write(out_dir.join("UikaFuncIds.h"), ids_code)
36        .expect("Failed to write UikaFuncIds.h");
37
38    // Generate UikaFillFuncTable.cpp
39    let fill_code = fill_table::generate_fill_table(&ctx.func_table, &by_class);
40    std::fs::write(out_dir.join("UikaFillFuncTable.cpp"), fill_code)
41        .expect("Failed to write UikaFillFuncTable.cpp");
42}