1pub mod lean;
6pub mod rust;
7
8use std::collections::{HashMap, HashSet};
9
10use crate::ast::{FnDef, TopLevel, TypeDef};
11use crate::types::checker::TypeCheckResult;
12
13pub struct ModuleInfo {
15 pub prefix: String,
17 pub type_defs: Vec<TypeDef>,
19 pub fn_defs: Vec<FnDef>,
21}
22
23pub struct CodegenContext {
25 pub items: Vec<TopLevel>,
27 pub fn_sigs: HashMap<String, (Vec<crate::types::Type>, crate::types::Type, Vec<String>)>,
29 pub memo_fns: HashSet<String>,
31 pub memo_safe_types: HashSet<String>,
33 pub type_defs: Vec<TypeDef>,
35 pub fn_defs: Vec<FnDef>,
37 pub project_name: String,
39 pub modules: Vec<ModuleInfo>,
41 pub module_prefixes: HashSet<String>,
43}
44
45pub struct ProjectOutput {
47 pub files: Vec<(String, String)>,
49}
50
51pub fn build_context(
53 items: Vec<TopLevel>,
54 tc_result: &TypeCheckResult,
55 memo_fns: HashSet<String>,
56 project_name: String,
57 modules: Vec<ModuleInfo>,
58) -> CodegenContext {
59 let type_defs: Vec<TypeDef> = items
60 .iter()
61 .filter_map(|item| {
62 if let TopLevel::TypeDef(td) = item {
63 Some(td.clone())
64 } else {
65 None
66 }
67 })
68 .collect();
69
70 let fn_defs: Vec<FnDef> = items
71 .iter()
72 .filter_map(|item| {
73 if let TopLevel::FnDef(fd) = item {
74 Some(fd.clone())
75 } else {
76 None
77 }
78 })
79 .collect();
80
81 let module_prefixes: HashSet<String> = modules.iter().map(|m| m.prefix.clone()).collect();
82
83 CodegenContext {
84 items,
85 fn_sigs: tc_result.fn_sigs.clone(),
86 memo_fns,
87 memo_safe_types: tc_result.memo_safe_types.clone(),
88 type_defs,
89 fn_defs,
90 project_name,
91 modules,
92 module_prefixes,
93 }
94}