diff options
Diffstat (limited to 'crates/hir_ty/src/utils.rs')
-rw-r--r-- | crates/hir_ty/src/utils.rs | 29 |
1 files changed, 4 insertions, 25 deletions
diff --git a/crates/hir_ty/src/utils.rs b/crates/hir_ty/src/utils.rs index d11708299..5f6cb052a 100644 --- a/crates/hir_ty/src/utils.rs +++ b/crates/hir_ty/src/utils.rs | |||
@@ -1,10 +1,8 @@ | |||
1 | //! Helper functions for working with def, which don't need to be a separate | 1 | //! Helper functions for working with def, which don't need to be a separate |
2 | //! query, but can't be computed directly from `*Data` (ie, which need a `db`). | 2 | //! query, but can't be computed directly from `*Data` (ie, which need a `db`). |
3 | use std::sync::Arc; | ||
4 | 3 | ||
5 | use chalk_ir::{BoundVar, DebruijnIndex}; | 4 | use chalk_ir::{fold::Shift, BoundVar, DebruijnIndex}; |
6 | use hir_def::{ | 5 | use hir_def::{ |
7 | adt::VariantData, | ||
8 | db::DefDatabase, | 6 | db::DefDatabase, |
9 | generics::{ | 7 | generics::{ |
10 | GenericParams, TypeParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget, | 8 | GenericParams, TypeParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget, |
@@ -13,11 +11,11 @@ use hir_def::{ | |||
13 | path::Path, | 11 | path::Path, |
14 | resolver::{HasResolver, TypeNs}, | 12 | resolver::{HasResolver, TypeNs}, |
15 | type_ref::TypeRef, | 13 | type_ref::TypeRef, |
16 | AssocContainerId, GenericDefId, Lookup, TraitId, TypeAliasId, TypeParamId, VariantId, | 14 | AssocContainerId, GenericDefId, Lookup, TraitId, TypeAliasId, TypeParamId, |
17 | }; | 15 | }; |
18 | use hir_expand::name::{name, Name}; | 16 | use hir_expand::name::{name, Name}; |
19 | 17 | ||
20 | use crate::{db::HirDatabase, Interner, Substitution, TraitRef, TyKind, TypeWalk, WhereClause}; | 18 | use crate::{db::HirDatabase, Interner, Substitution, TraitRef, TraitRefExt, TyKind, WhereClause}; |
21 | 19 | ||
22 | fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> Vec<TraitId> { | 20 | fn direct_super_traits(db: &dyn DefDatabase, trait_: TraitId) -> Vec<TraitId> { |
23 | let resolver = trait_.resolver(db); | 21 | let resolver = trait_.resolver(db); |
@@ -68,7 +66,7 @@ fn direct_super_trait_refs(db: &dyn HirDatabase, trait_ref: &TraitRef) -> Vec<Tr | |||
68 | // FIXME: how to correctly handle higher-ranked bounds here? | 66 | // FIXME: how to correctly handle higher-ranked bounds here? |
69 | WhereClause::Implemented(tr) => Some( | 67 | WhereClause::Implemented(tr) => Some( |
70 | tr.clone() | 68 | tr.clone() |
71 | .shifted_out_to(DebruijnIndex::ONE) | 69 | .shifted_out_to(&Interner, DebruijnIndex::ONE) |
72 | .expect("FIXME unexpected higher-ranked trait bound"), | 70 | .expect("FIXME unexpected higher-ranked trait bound"), |
73 | ), | 71 | ), |
74 | _ => None, | 72 | _ => None, |
@@ -136,25 +134,6 @@ pub(super) fn associated_type_by_name_including_super_traits( | |||
136 | }) | 134 | }) |
137 | } | 135 | } |
138 | 136 | ||
139 | pub(super) fn variant_data(db: &dyn DefDatabase, var: VariantId) -> Arc<VariantData> { | ||
140 | match var { | ||
141 | VariantId::StructId(it) => db.struct_data(it).variant_data.clone(), | ||
142 | VariantId::UnionId(it) => db.union_data(it).variant_data.clone(), | ||
143 | VariantId::EnumVariantId(it) => { | ||
144 | db.enum_data(it.parent).variants[it.local_id].variant_data.clone() | ||
145 | } | ||
146 | } | ||
147 | } | ||
148 | |||
149 | /// Helper for mutating `Arc<[T]>` (i.e. `Arc::make_mut` for Arc slices). | ||
150 | /// The underlying values are cloned if there are other strong references. | ||
151 | pub(crate) fn make_mut_slice<T: Clone>(a: &mut Arc<[T]>) -> &mut [T] { | ||
152 | if Arc::get_mut(a).is_none() { | ||
153 | *a = a.iter().cloned().collect(); | ||
154 | } | ||
155 | Arc::get_mut(a).unwrap() | ||
156 | } | ||
157 | |||
158 | pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics { | 137 | pub(crate) fn generics(db: &dyn DefDatabase, def: GenericDefId) -> Generics { |
159 | let parent_generics = parent_generic_def(db, def).map(|def| Box::new(generics(db, def))); | 138 | let parent_generics = parent_generic_def(db, def).map(|def| Box::new(generics(db, def))); |
160 | Generics { def, params: db.generic_params(def), parent_generics } | 139 | Generics { def, params: db.generic_params(def), parent_generics } |