Skip to main content

cl_typeck/type_kind/
display.rs

1//! [Display] implementations for [TypeKind], [Adt], and [Primitive]
2
3use super::{Adt, Primitive, TypeKind};
4use crate::{format_utils::*, type_kind::Visibility};
5use cl_ast::fmt::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("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 Visibility {
34    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
35        f.write_str(match self {
36            Self::Public => "pub ",
37            Self::Private => "",
38        })
39    }
40}
41
42impl Display for Adt {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        match self {
45            Adt::Enum(variants) => {
46                let mut variants = variants.iter();
47                separate(", ", || {
48                    let (name, def) = variants.next()?;
49                    Some(move |f: &mut Delimit<_>| write!(f, "{name}: #{def}"))
50                })(f.delimit("enum {", "}"))
51            }
52            Adt::Struct(members) => {
53                let mut members = members.iter();
54                separate(", ", || {
55                    let (name, vis, def) = members.next()?;
56                    Some(move |f: &mut Delimit<_>| write!(f, "{vis}{name}: #{def}"))
57                })(f.delimit("struct {", "}"))
58            }
59            Adt::TupleStruct(members) => {
60                let mut members = members.iter();
61                separate(", ", || {
62                    let (vis, def) = members.next()?;
63                    Some(move |f: &mut Delimit<_>| write!(f, "{vis}#{def}"))
64                })(f.delimit("struct (", ")"))
65            }
66            Adt::UnitStruct => write!(f, "struct"),
67            Adt::Union(variants) => {
68                let mut variants = variants.iter();
69                separate(", ", || {
70                    let (name, def) = variants.next()?;
71                    Some(move |f: &mut Delimit<_>| write!(f, "{name}: #{def}"))
72                })(f.delimit("union {", "}"))
73            }
74        }
75    }
76}
77
78impl Display for Primitive {
79    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80        match self {
81            Primitive::I8 => f.write_str("i8"),
82            Primitive::I16 => f.write_str("i16"),
83            Primitive::I32 => f.write_str("i32"),
84            Primitive::I64 => f.write_str("i64"),
85            Primitive::I128 => f.write_str("i128"),
86            Primitive::Isize => f.write_str("isize"),
87            Primitive::U8 => f.write_str("u8"),
88            Primitive::U16 => f.write_str("u16"),
89            Primitive::U32 => f.write_str("u32"),
90            Primitive::U64 => f.write_str("u64"),
91            Primitive::U128 => f.write_str("u128"),
92            Primitive::Usize => f.write_str("usize"),
93            Primitive::F8 => f.write_str("f8"),
94            Primitive::F16 => f.write_str("f16"),
95            Primitive::F32 => f.write_str("f32"),
96            Primitive::F64 => f.write_str("f64"),
97            Primitive::F128 => f.write_str("f128"),
98            Primitive::Fsize => f.write_str("fsize"),
99            Primitive::Integer => f.write_str("{integer}"),
100            Primitive::Float => f.write_str("{float}"),
101            Primitive::Bool => f.write_str("bool"),
102            Primitive::Char => f.write_str("char"),
103            Primitive::Str => f.write_str("str"),
104            Primitive::Never => f.write_str("!"),
105        }
106    }
107}