cl_typeck/type_kind/
display.rs

1//! [Display] implementations for [TypeKind], [Adt], and [Intrinsic]
2
3use super::{Adt, Primitive, TypeKind};
4use crate::format_utils::*;
5use cl_ast::format::FmtAdapter;
6use std::fmt::{self, Display, Write};
7
8impl Display for TypeKind {
9    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
10        match self {
11            TypeKind::Inferred => write!(f, "_"),
12            TypeKind::Variable => write!(f, "?"),
13            TypeKind::Instance(def) => write!(f, "alias to #{def}"),
14            TypeKind::Primitive(i) => i.fmt(f),
15            TypeKind::Adt(a) => a.fmt(f),
16            TypeKind::Ref(def) => write!(f, "&{def}"),
17            TypeKind::Slice(def) => write!(f, "slice [#{def}]"),
18            TypeKind::Array(def, size) => write!(f, "array [#{def}; {size}]"),
19            TypeKind::Tuple(defs) => {
20                let mut defs = defs.iter();
21                separate(", ", || {
22                    let def = defs.next()?;
23                    Some(move |f: &mut Delimit<_>| write!(f, "#{def}"))
24                })(f.delimit_with("tuple (", ")"))
25            }
26            TypeKind::FnSig { args, rety } => write!(f, "fn (#{args}) -> #{rety}"),
27            TypeKind::Empty => f.write_str("()"),
28            TypeKind::Never => f.write_str("!"),
29            TypeKind::Module => f.write_str("mod"),
30        }
31    }
32}
33
34impl Display for Adt {
35    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36        match self {
37            Adt::Enum(variants) => {
38                let mut variants = variants.iter();
39                separate(", ", || {
40                    let (name, def) = variants.next()?;
41                    Some(move |f: &mut Delimit<_>| write!(f, "{name}: #{def}"))
42                })(f.delimit_with("enum {", "}"))
43            }
44            Adt::Struct(members) => {
45                let mut members = members.iter();
46                separate(", ", || {
47                    let (name, vis, def) = members.next()?;
48                    Some(move |f: &mut Delimit<_>| write!(f, "{vis}{name}: #{def}"))
49                })(f.delimit_with("struct {", "}"))
50            }
51            Adt::TupleStruct(members) => {
52                let mut members = members.iter();
53                separate(", ", || {
54                    let (vis, def) = members.next()?;
55                    Some(move |f: &mut Delimit<_>| write!(f, "{vis}#{def}"))
56                })(f.delimit_with("struct (", ")"))
57            }
58            Adt::UnitStruct => write!(f, "struct"),
59            Adt::Union(variants) => {
60                let mut variants = variants.iter();
61                separate(", ", || {
62                    let (name, def) = variants.next()?;
63                    Some(move |f: &mut Delimit<_>| write!(f, "{name}: #{def}"))
64                })(f.delimit_with("union {", "}"))
65            }
66        }
67    }
68}
69
70impl Display for Primitive {
71    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
72        match self {
73            Primitive::I8 => f.write_str("i8"),
74            Primitive::I16 => f.write_str("i16"),
75            Primitive::I32 => f.write_str("i32"),
76            Primitive::I64 => f.write_str("i64"),
77            Primitive::I128 => f.write_str("i128"),
78            Primitive::Isize => f.write_str("isize"),
79            Primitive::U8 => f.write_str("u8"),
80            Primitive::U16 => f.write_str("u16"),
81            Primitive::U32 => f.write_str("u32"),
82            Primitive::U64 => f.write_str("u64"),
83            Primitive::U128 => f.write_str("u128"),
84            Primitive::Usize => f.write_str("usize"),
85            Primitive::F8 => f.write_str("f8"),
86            Primitive::F16 => f.write_str("f16"),
87            Primitive::F32 => f.write_str("f32"),
88            Primitive::F64 => f.write_str("f64"),
89            Primitive::F128 => f.write_str("f128"),
90            Primitive::Fsize => f.write_str("fsize"),
91            Primitive::Integer => f.write_str("{integer}"),
92            Primitive::Float => f.write_str("{float}"),
93            Primitive::Bool => f.write_str("bool"),
94            Primitive::Char => f.write_str("char"),
95        }
96    }
97}