lutra_compiler/pr/
utils.rs1use 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}