1pub mod rust;
6
7use std::collections::{HashMap, HashSet};
8
9use crate::ast::{FnDef, TopLevel, TypeDef};
10use crate::types::checker::TypeCheckResult;
11
12pub struct ModuleInfo {
14 pub prefix: String,
16 pub type_defs: Vec<TypeDef>,
18 pub fn_defs: Vec<FnDef>,
20}
21
22pub struct CodegenContext {
24 pub items: Vec<TopLevel>,
26 pub fn_sigs: HashMap<String, (Vec<crate::types::Type>, crate::types::Type, Vec<String>)>,
28 pub memo_fns: HashSet<String>,
30 pub memo_safe_types: HashSet<String>,
32 pub type_defs: Vec<TypeDef>,
34 pub fn_defs: Vec<FnDef>,
36 pub project_name: String,
38 pub modules: Vec<ModuleInfo>,
40 pub module_prefixes: HashSet<String>,
42}
43
44pub struct ProjectOutput {
46 pub files: Vec<(String, String)>,
48}
49
50pub fn build_context(
52 items: Vec<TopLevel>,
53 tc_result: &TypeCheckResult,
54 memo_fns: HashSet<String>,
55 project_name: String,
56 modules: Vec<ModuleInfo>,
57) -> CodegenContext {
58 let type_defs: Vec<TypeDef> = items
59 .iter()
60 .filter_map(|item| {
61 if let TopLevel::TypeDef(td) = item {
62 Some(td.clone())
63 } else {
64 None
65 }
66 })
67 .collect();
68
69 let fn_defs: Vec<FnDef> = items
70 .iter()
71 .filter_map(|item| {
72 if let TopLevel::FnDef(fd) = item {
73 Some(fd.clone())
74 } else {
75 None
76 }
77 })
78 .collect();
79
80 let module_prefixes: HashSet<String> = modules.iter().map(|m| m.prefix.clone()).collect();
81
82 CodegenContext {
83 items,
84 fn_sigs: tc_result.fn_sigs.clone(),
85 memo_fns,
86 memo_safe_types: tc_result.memo_safe_types.clone(),
87 type_defs,
88 fn_defs,
89 project_name,
90 modules,
91 module_prefixes,
92 }
93}