diff options
author | Florian Diebold <[email protected]> | 2020-01-25 22:38:33 +0000 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2020-02-07 17:28:10 +0000 |
commit | 16c69374471a0072541c21a5551b4fd97f7e12ba (patch) | |
tree | 72564c6b99eb6f1aaf44f740d654b1725daed0c2 /crates/ra_hir_ty/src/utils.rs | |
parent | 93aa166748eef9560df2435391dc3f3b53f8262d (diff) |
Lower impl trait to variables, move away from using placeholders where they don't belong
Diffstat (limited to 'crates/ra_hir_ty/src/utils.rs')
-rw-r--r-- | crates/ra_hir_ty/src/utils.rs | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/crates/ra_hir_ty/src/utils.rs b/crates/ra_hir_ty/src/utils.rs index 314a3241f..f116b95e7 100644 --- a/crates/ra_hir_ty/src/utils.rs +++ b/crates/ra_hir_ty/src/utils.rs | |||
@@ -5,7 +5,7 @@ use std::sync::Arc; | |||
5 | use hir_def::{ | 5 | use hir_def::{ |
6 | adt::VariantData, | 6 | adt::VariantData, |
7 | db::DefDatabase, | 7 | db::DefDatabase, |
8 | generics::{GenericParams, TypeParamData}, | 8 | generics::{GenericParams, TypeParamData, TypeParamProvenance}, |
9 | path::Path, | 9 | path::Path, |
10 | resolver::{HasResolver, TypeNs}, | 10 | resolver::{HasResolver, TypeNs}, |
11 | type_ref::TypeRef, | 11 | type_ref::TypeRef, |
@@ -117,19 +117,31 @@ impl Generics { | |||
117 | pub(crate) fn len(&self) -> usize { | 117 | pub(crate) fn len(&self) -> usize { |
118 | self.len_split().0 | 118 | self.len_split().0 |
119 | } | 119 | } |
120 | |||
120 | /// (total, parents, child) | 121 | /// (total, parents, child) |
121 | pub(crate) fn len_split(&self) -> (usize, usize, usize) { | 122 | pub(crate) fn len_split(&self) -> (usize, usize, usize) { |
122 | let parent = self.parent_generics.as_ref().map_or(0, |p| p.len()); | 123 | let parent = self.parent_generics.as_ref().map_or(0, |p| p.len()); |
123 | let child = self.params.types.len(); | 124 | let child = self.params.types.len(); |
124 | (parent + child, parent, child) | 125 | (parent + child, parent, child) |
125 | } | 126 | } |
127 | |||
128 | /// (self, type param list, impl trait) | ||
129 | pub(crate) fn provenance_split(&self) -> (usize, usize, usize) { | ||
130 | let self_params = self.params.types.iter().filter(|(_, p)| p.provenance == TypeParamProvenance::TraitSelf).count(); | ||
131 | let list_params = self.params.types.iter().filter(|(_, p)| p.provenance == TypeParamProvenance::TypeParamList).count(); | ||
132 | let impl_trait_params = self.params.types.iter().filter(|(_, p)| p.provenance == TypeParamProvenance::ArgumentImplTrait).count(); | ||
133 | (self_params, list_params, impl_trait_params) | ||
134 | } | ||
135 | |||
126 | pub(crate) fn param_idx(&self, param: TypeParamId) -> u32 { | 136 | pub(crate) fn param_idx(&self, param: TypeParamId) -> u32 { |
127 | self.find_param(param).0 | 137 | self.find_param(param).0 |
128 | } | 138 | } |
139 | |||
129 | pub(crate) fn param_name(&self, param: TypeParamId) -> Name { | 140 | pub(crate) fn param_name(&self, param: TypeParamId) -> Name { |
130 | // FIXME make this return Option | 141 | // FIXME make this return Option |
131 | self.find_param(param).1.name.clone().unwrap_or_else(Name::missing) | 142 | self.find_param(param).1.name.clone().unwrap_or_else(Name::missing) |
132 | } | 143 | } |
144 | |||
133 | fn find_param(&self, param: TypeParamId) -> (u32, &TypeParamData) { | 145 | fn find_param(&self, param: TypeParamId) -> (u32, &TypeParamData) { |
134 | if param.parent == self.def { | 146 | if param.parent == self.def { |
135 | let (idx, (_local_id, data)) = self | 147 | let (idx, (_local_id, data)) = self |