Skip to main content

lutra_compiler/pr/
utils.rs

1use lutra_bin::ir;
2
3impl From<ir::Ty> for super::Ty {
4    fn from(ty: ir::Ty) -> super::Ty {
5        let kind = match ty.kind {
6            ir::TyKind::Primitive(primitive) => {
7                let primitive = match primitive {
8                    ir::TyPrimitive::Prim8 => super::TyPrimitive::prim8,
9                    ir::TyPrimitive::Prim16 => super::TyPrimitive::prim16,
10                    ir::TyPrimitive::Prim32 => super::TyPrimitive::prim32,
11                    ir::TyPrimitive::Prim64 => super::TyPrimitive::prim64,
12                };
13                super::TyKind::Primitive(primitive)
14            }
15            ir::TyKind::Tuple(fields) => super::TyKind::Tuple(
16                fields
17                    .into_iter()
18                    .map(|f| {
19                        let name = f.name.clone();
20                        let ty = super::Ty::from(f.ty);
21                        super::TyTupleField {
22                            name,
23                            ty,
24                            unpack: false,
25                        }
26                    })
27                    .collect(),
28            ),
29            ir::TyKind::Array(items_ty) => {
30                super::TyKind::Array(Box::new(super::Ty::from(*items_ty)))
31            }
32            ir::TyKind::Enum(variants) => super::TyKind::Enum(
33                variants
34                    .into_iter()
35                    .map(super::TyEnumVariant::from)
36                    .collect(),
37            ),
38            ir::TyKind::Function(func) => super::TyKind::Func(super::TyFunc {
39                params: func
40                    .params
41                    .into_iter()
42                    .map(super::Ty::from)
43                    .map(|ty| super::TyFuncParam::simple(Some(ty)))
44                    .collect(),
45                body: Some(Box::new(super::Ty::from(func.body))),
46                ty_params: Vec::new(),
47            }),
48            ir::TyKind::Ident(path) => super::TyKind::Ident(super::Path::new(path.0)),
49        };
50
51        let mut r = super::Ty::new(kind);
52        r.name = ty.name;
53        r
54    }
55}
56
57impl From<ir::TyEnumVariant> for super::TyEnumVariant {
58    fn from(v: ir::TyEnumVariant) -> Self {
59        super::TyEnumVariant {
60            name: v.name,
61            ty: super::Ty::from(v.ty),
62        }
63    }
64}