deskc_concretizer/
lib.rs

1mod block_concretizer;
2mod enumdef;
3mod type_concretizer;
4
5use amir::{
6    amir::{Amir, Amirs},
7    stmt::ALink,
8    var::AVar,
9};
10use block_concretizer::BlockConcretizer;
11use enumdef::EnumDefs;
12use mir::{
13    mir::{Mir, Mirs},
14    ty::ConcType,
15    Vars,
16};
17use type_concretizer::TypeConcretizer;
18
19pub struct Concretizer {
20    pub parameters: Vec<ConcType>,
21    pub output: ConcType,
22    pub enum_defs: EnumDefs,
23}
24
25pub fn concretize(amirs: &Amirs) -> Mirs {
26    let mirs = amirs
27        .amirs
28        .iter()
29        .map(|amir| {
30            let mut concretizer = Concretizer {
31                parameters: vec![],
32                output: ConcType::Number,
33                enum_defs: Default::default(),
34            };
35            concretizer.concretize_mir(amir)
36        })
37        .collect();
38    Mirs {
39        entrypoint: amirs.entrypoint,
40        mirs,
41    }
42}
43
44impl Concretizer {
45    fn concretize_mir(&mut self, amir: &Amir) -> Mir {
46        let Amir {
47            parameters: _,
48            output: _,
49            vars,
50            scopes,
51            blocks,
52            captured,
53            links,
54        } = amir;
55        let mut type_conc = TypeConcretizer {};
56
57        let mut vars = Vars(
58            vars.iter()
59                .map(|var| AVar {
60                    ty: type_conc.gen_conc_type(&var.ty),
61                    scope: var.scope,
62                })
63                .collect(),
64        );
65
66        let mut block_conc = BlockConcretizer {
67            enum_defs: &mut self.enum_defs,
68            type_concretizer: &mut type_conc,
69            vars: &mut vars,
70            stmts: vec![],
71        };
72        let blocks = block_conc.concretize_blocks(blocks);
73
74        let captured = captured
75            .iter()
76            .map(|ty| type_conc.gen_conc_type(ty))
77            .collect();
78
79        let links = links
80            .iter()
81            .map(|link| ALink {
82                ty: type_conc.gen_conc_type(&link.ty),
83                name: link.name.clone(),
84            })
85            .collect();
86
87        Mir {
88            parameters: self.parameters.clone(),
89            captured,
90            output: self.output.clone(),
91            vars,
92            scopes: scopes.clone(),
93            blocks,
94            links,
95        }
96    }
97}
98
99#[cfg(test)]
100mod tests {
101    #[test]
102    fn it_works() {
103        let result = 2 + 2;
104        assert_eq!(result, 4);
105    }
106}