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::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}