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