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