diff options
Diffstat (limited to 'crates/hir_ty/src/traits/chalk/tls.rs')
-rw-r--r-- | crates/hir_ty/src/traits/chalk/tls.rs | 108 |
1 files changed, 9 insertions, 99 deletions
diff --git a/crates/hir_ty/src/traits/chalk/tls.rs b/crates/hir_ty/src/traits/chalk/tls.rs index b4568cff6..3c9766550 100644 --- a/crates/hir_ty/src/traits/chalk/tls.rs +++ b/crates/hir_ty/src/traits/chalk/tls.rs | |||
@@ -1,12 +1,12 @@ | |||
1 | //! Implementation of Chalk debug helper functions using TLS. | 1 | //! Implementation of Chalk debug helper functions using TLS. |
2 | use std::fmt; | 2 | use std::fmt; |
3 | 3 | ||
4 | use chalk_ir::{AliasTy, GenericArg, Goal, Goals, Lifetime, ProgramClauseImplication, TypeName}; | 4 | use chalk_ir::{AliasTy, GenericArg, Goal, Goals, Lifetime, ProgramClauseImplication}; |
5 | use itertools::Itertools; | 5 | use itertools::Itertools; |
6 | 6 | ||
7 | use super::{from_chalk, Interner, TypeAliasAsAssocType}; | 7 | use super::{from_chalk, Interner, TypeAliasAsAssocType}; |
8 | use crate::{db::HirDatabase, CallableDefId, TypeCtor}; | 8 | use crate::{db::HirDatabase, CallableDefId}; |
9 | use hir_def::{AdtId, AssocContainerId, DefWithBodyId, Lookup, TypeAliasId}; | 9 | use hir_def::{AdtId, AssocContainerId, Lookup, TypeAliasId}; |
10 | 10 | ||
11 | pub use unsafe_tls::{set_current_program, with_current_program}; | 11 | pub use unsafe_tls::{set_current_program, with_current_program}; |
12 | 12 | ||
@@ -18,94 +18,12 @@ impl DebugContext<'_> { | |||
18 | id: super::AdtId, | 18 | id: super::AdtId, |
19 | f: &mut fmt::Formatter<'_>, | 19 | f: &mut fmt::Formatter<'_>, |
20 | ) -> Result<(), fmt::Error> { | 20 | ) -> Result<(), fmt::Error> { |
21 | let type_ctor: TypeCtor = from_chalk(self.0, TypeName::Adt(id)); | 21 | let name = match id.0 { |
22 | match type_ctor { | 22 | AdtId::StructId(it) => self.0.struct_data(it).name.clone(), |
23 | TypeCtor::Bool => write!(f, "bool")?, | 23 | AdtId::UnionId(it) => self.0.union_data(it).name.clone(), |
24 | TypeCtor::Char => write!(f, "char")?, | 24 | AdtId::EnumId(it) => self.0.enum_data(it).name.clone(), |
25 | TypeCtor::Int(t) => write!(f, "{}", t)?, | 25 | }; |
26 | TypeCtor::Float(t) => write!(f, "{}", t)?, | 26 | write!(f, "{}", name) |
27 | TypeCtor::Str => write!(f, "str")?, | ||
28 | TypeCtor::Slice => write!(f, "slice")?, | ||
29 | TypeCtor::Array => write!(f, "array")?, | ||
30 | TypeCtor::RawPtr(m) => write!(f, "*{}", m.as_keyword_for_ptr())?, | ||
31 | TypeCtor::Ref(m) => write!(f, "&{}", m.as_keyword_for_ref())?, | ||
32 | TypeCtor::Never => write!(f, "!")?, | ||
33 | TypeCtor::Tuple { .. } => { | ||
34 | write!(f, "()")?; | ||
35 | } | ||
36 | TypeCtor::FnPtr { .. } => { | ||
37 | write!(f, "fn")?; | ||
38 | } | ||
39 | TypeCtor::FnDef(def) => { | ||
40 | let name = match def { | ||
41 | CallableDefId::FunctionId(ff) => self.0.function_data(ff).name.clone(), | ||
42 | CallableDefId::StructId(s) => self.0.struct_data(s).name.clone(), | ||
43 | CallableDefId::EnumVariantId(e) => { | ||
44 | let enum_data = self.0.enum_data(e.parent); | ||
45 | enum_data.variants[e.local_id].name.clone() | ||
46 | } | ||
47 | }; | ||
48 | match def { | ||
49 | CallableDefId::FunctionId(_) => write!(f, "{{fn {}}}", name)?, | ||
50 | CallableDefId::StructId(_) | CallableDefId::EnumVariantId(_) => { | ||
51 | write!(f, "{{ctor {}}}", name)? | ||
52 | } | ||
53 | } | ||
54 | } | ||
55 | TypeCtor::Adt(def_id) => { | ||
56 | let name = match def_id { | ||
57 | AdtId::StructId(it) => self.0.struct_data(it).name.clone(), | ||
58 | AdtId::UnionId(it) => self.0.union_data(it).name.clone(), | ||
59 | AdtId::EnumId(it) => self.0.enum_data(it).name.clone(), | ||
60 | }; | ||
61 | write!(f, "{}", name)?; | ||
62 | } | ||
63 | TypeCtor::AssociatedType(type_alias) => { | ||
64 | let trait_ = match type_alias.lookup(self.0.upcast()).container { | ||
65 | AssocContainerId::TraitId(it) => it, | ||
66 | _ => panic!("not an associated type"), | ||
67 | }; | ||
68 | let trait_name = self.0.trait_data(trait_).name.clone(); | ||
69 | let name = self.0.type_alias_data(type_alias).name.clone(); | ||
70 | write!(f, "{}::{}", trait_name, name)?; | ||
71 | } | ||
72 | TypeCtor::OpaqueType(opaque_ty_id) => match opaque_ty_id { | ||
73 | crate::OpaqueTyId::ReturnTypeImplTrait(func, idx) => { | ||
74 | write!(f, "{{impl trait {} of {:?}}}", idx, func)?; | ||
75 | } | ||
76 | crate::OpaqueTyId::AsyncBlockTypeImplTrait(def, idx) => { | ||
77 | write!(f, "{{impl trait of async block {} of {:?}}}", idx.into_raw(), def)?; | ||
78 | } | ||
79 | }, | ||
80 | TypeCtor::ForeignType(type_alias) => { | ||
81 | let name = self.0.type_alias_data(type_alias).name.clone(); | ||
82 | write!(f, "{}", name)?; | ||
83 | } | ||
84 | TypeCtor::Closure { def, expr } => { | ||
85 | write!(f, "{{closure {:?} in ", expr.into_raw())?; | ||
86 | match def { | ||
87 | DefWithBodyId::FunctionId(func) => { | ||
88 | write!(f, "fn {}", self.0.function_data(func).name)? | ||
89 | } | ||
90 | DefWithBodyId::StaticId(s) => { | ||
91 | if let Some(name) = self.0.static_data(s).name.as_ref() { | ||
92 | write!(f, "body of static {}", name)?; | ||
93 | } else { | ||
94 | write!(f, "body of unnamed static {:?}", s)?; | ||
95 | } | ||
96 | } | ||
97 | DefWithBodyId::ConstId(c) => { | ||
98 | if let Some(name) = self.0.const_data(c).name.as_ref() { | ||
99 | write!(f, "body of const {}", name)?; | ||
100 | } else { | ||
101 | write!(f, "body of unnamed const {:?}", c)?; | ||
102 | } | ||
103 | } | ||
104 | }; | ||
105 | write!(f, "}}")?; | ||
106 | } | ||
107 | } | ||
108 | Ok(()) | ||
109 | } | 27 | } |
110 | 28 | ||
111 | pub fn debug_trait_id( | 29 | pub fn debug_trait_id( |
@@ -234,14 +152,6 @@ impl DebugContext<'_> { | |||
234 | write!(fmt, "{:?}", pci.debug(&Interner)) | 152 | write!(fmt, "{:?}", pci.debug(&Interner)) |
235 | } | 153 | } |
236 | 154 | ||
237 | pub fn debug_application_ty( | ||
238 | &self, | ||
239 | application_ty: &chalk_ir::ApplicationTy<Interner>, | ||
240 | fmt: &mut fmt::Formatter<'_>, | ||
241 | ) -> Result<(), fmt::Error> { | ||
242 | write!(fmt, "{:?}", application_ty.debug(&Interner)) | ||
243 | } | ||
244 | |||
245 | pub fn debug_substitution( | 155 | pub fn debug_substitution( |
246 | &self, | 156 | &self, |
247 | substitution: &chalk_ir::Substitution<Interner>, | 157 | substitution: &chalk_ir::Substitution<Interner>, |