cl_typeck/type_kind/
display.rs1use 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}