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 depends: Vec<String>,
20 pub type_defs: Vec<TypeDef>,
22 pub fn_defs: Vec<FnDef>,
24}
25
26pub struct CodegenContext {
28 pub items: Vec<TopLevel>,
30 pub fn_sigs: HashMap<String, (Vec<crate::types::Type>, crate::types::Type, Vec<String>)>,
32 pub memo_fns: HashSet<String>,
34 pub memo_safe_types: HashSet<String>,
36 pub type_defs: Vec<TypeDef>,
38 pub fn_defs: Vec<FnDef>,
40 pub project_name: String,
42 pub modules: Vec<ModuleInfo>,
44 pub module_prefixes: HashSet<String>,
46 pub policy: Option<crate::config::ProjectConfig>,
48}
49
50pub struct ProjectOutput {
52 pub files: Vec<(String, String)>,
54}
55
56pub fn build_context(
58 items: Vec<TopLevel>,
59 tc_result: &TypeCheckResult,
60 memo_fns: HashSet<String>,
61 project_name: String,
62 modules: Vec<ModuleInfo>,
63) -> CodegenContext {
64 let type_defs: Vec<TypeDef> = items
65 .iter()
66 .filter_map(|item| {
67 if let TopLevel::TypeDef(td) = item {
68 Some(td.clone())
69 } else {
70 None
71 }
72 })
73 .collect();
74
75 let fn_defs: Vec<FnDef> = items
76 .iter()
77 .filter_map(|item| {
78 if let TopLevel::FnDef(fd) = item {
79 Some(fd.clone())
80 } else {
81 None
82 }
83 })
84 .collect();
85
86 let module_prefixes: HashSet<String> = modules.iter().map(|m| m.prefix.clone()).collect();
87
88 CodegenContext {
89 items,
90 fn_sigs: tc_result.fn_sigs.clone(),
91 memo_fns,
92 memo_safe_types: tc_result.memo_safe_types.clone(),
93 type_defs,
94 fn_defs,
95 project_name,
96 modules,
97 module_prefixes,
98 policy: None,
99 }
100}