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