1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
//! Diagnostics related methods for `TyS`.
use crate::ty::sty::InferTy;
use crate::ty::TyKind::*;
use crate::ty::TyS;
impl<'tcx> TyS<'tcx> {
/// Similar to `TyS::is_primitive`, but also considers inferred numeric values to be primitive.
pub fn is_primitive_ty(&self) -> bool {
match self.kind {
Bool
| Char
| Str
| Int(_)
| Uint(_)
| Float(_)
| Infer(InferTy::IntVar(_))
| Infer(InferTy::FloatVar(_))
| Infer(InferTy::FreshIntTy(_))
| Infer(InferTy::FreshFloatTy(_)) => true,
_ => false,
}
}
/// Whether the type is succinctly representable as a type instead of just referred to with a
/// description in error messages. This is used in the main error message.
pub fn is_simple_ty(&self) -> bool {
match self.kind {
Bool
| Char
| Str
| Int(_)
| Uint(_)
| Float(_)
| Infer(InferTy::IntVar(_))
| Infer(InferTy::FloatVar(_))
| Infer(InferTy::FreshIntTy(_))
| Infer(InferTy::FreshFloatTy(_)) => true,
Ref(_, x, _) | Array(x, _) | Slice(x) => x.peel_refs().is_simple_ty(),
Tuple(tys) if tys.is_empty() => true,
_ => false,
}
}
/// Whether the type is succinctly representable as a type instead of just referred to with a
/// description in error messages. This is used in the primary span label. Beyond what
/// `is_simple_ty` includes, it also accepts ADTs with no type arguments and references to
/// ADTs with no type arguments.
pub fn is_simple_text(&self) -> bool {
match self.kind {
Adt(_, substs) => substs.types().next().is_none(),
Ref(_, ty, _) => ty.is_simple_text(),
_ => self.is_simple_ty(),
}
}
/// Whether the type can be safely suggested during error recovery.
pub fn is_suggestable(&self) -> bool {
match self.kind {
Opaque(..) | FnDef(..) | FnPtr(..) | Dynamic(..) | Closure(..) | Infer(..)
| Projection(..) => false,
_ => true,
}
}
}
|