2
2
3
3
use hir_def:: {
4
4
path:: { Path , PathSegment } ,
5
- resolver:: { ResolveValueResult , Resolver , TypeNs , ValueNs } ,
5
+ resolver:: { HasResolver , ResolveValueResult , Resolver , TypeNs , ValueNs } ,
6
+ AssocItemId , ContainerId , Lookup ,
6
7
} ;
7
8
use hir_expand:: name:: Name ;
8
9
9
10
use crate :: {
10
11
db:: HirDatabase ,
11
12
ty:: { method_resolution, Substs , Ty , TypeWalk , ValueTyDefId } ,
12
- AssocItem , Container , Function ,
13
13
} ;
14
14
15
15
use super :: { ExprOrPatId , InferenceContext , TraitRef } ;
@@ -143,31 +143,35 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
143
143
id : ExprOrPatId ,
144
144
) -> Option < ( ValueNs , Option < Substs > ) > {
145
145
let trait_ = trait_ref. trait_ ;
146
- let item =
147
- self . db . trait_data ( trait_) . items . iter ( ) . map ( |( _name, id) | ( * id) . into ( ) ) . find_map (
148
- |item| match item {
149
- AssocItem :: Function ( func) => {
150
- if segment. name == func. name ( self . db ) {
151
- Some ( AssocItem :: Function ( func) )
152
- } else {
153
- None
154
- }
146
+ let item = self
147
+ . db
148
+ . trait_data ( trait_)
149
+ . items
150
+ . iter ( )
151
+ . map ( |( _name, id) | ( * id) . into ( ) )
152
+ . find_map ( |item| match item {
153
+ AssocItemId :: FunctionId ( func) => {
154
+ if segment. name == self . db . function_data ( func) . name {
155
+ Some ( AssocItemId :: FunctionId ( func) )
156
+ } else {
157
+ None
155
158
}
159
+ }
156
160
157
- AssocItem :: Const ( konst) => {
158
- if konst. name ( self . db ) . map_or ( false , |n| n == segment. name ) {
159
- Some ( AssocItem :: Const ( konst ) )
160
- } else {
161
- None
162
- }
161
+ AssocItemId :: ConstId ( konst) => {
162
+ if self . db . const_data ( konst) . name . as_ref ( ) . map_or ( false , |n| n == & segment. name )
163
+ {
164
+ Some ( AssocItemId :: ConstId ( konst ) )
165
+ } else {
166
+ None
163
167
}
164
- AssocItem :: TypeAlias ( _ ) => None ,
165
- } ,
166
- ) ?;
168
+ }
169
+ AssocItemId :: TypeAliasId ( _ ) => None ,
170
+ } ) ?;
167
171
let def = match item {
168
- AssocItem :: Function ( f) => ValueNs :: FunctionId ( f. id ) ,
169
- AssocItem :: Const ( c) => ValueNs :: ConstId ( c. id ) ,
170
- AssocItem :: TypeAlias ( _) => unreachable ! ( ) ,
172
+ AssocItemId :: FunctionId ( f) => ValueNs :: FunctionId ( f) ,
173
+ AssocItemId :: ConstId ( c) => ValueNs :: ConstId ( c) ,
174
+ AssocItemId :: TypeAliasId ( _) => unreachable ! ( ) ,
171
175
} ;
172
176
let substs = Substs :: build_for_def ( self . db , item)
173
177
. use_parent_substs ( & trait_ref. substs )
@@ -197,16 +201,18 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
197
201
Some ( name) ,
198
202
method_resolution:: LookupMode :: Path ,
199
203
move |_ty, item| {
200
- let def = match item {
201
- AssocItem :: Function ( f) => ValueNs :: FunctionId ( f. id ) ,
202
- AssocItem :: Const ( c) => ValueNs :: ConstId ( c. id ) ,
203
- AssocItem :: TypeAlias ( _) => unreachable ! ( ) ,
204
+ let ( def, container) = match item {
205
+ AssocItemId :: FunctionId ( f) => {
206
+ ( ValueNs :: FunctionId ( f) , f. lookup ( self . db ) . container )
207
+ }
208
+ AssocItemId :: ConstId ( c) => ( ValueNs :: ConstId ( c) , c. lookup ( self . db ) . container ) ,
209
+ AssocItemId :: TypeAliasId ( _) => unreachable ! ( ) ,
204
210
} ;
205
- let substs = match item . container ( self . db ) {
206
- Container :: ImplBlock ( _) => self . find_self_types ( & def, ty. clone ( ) ) ,
207
- Container :: Trait ( t ) => {
211
+ let substs = match container {
212
+ ContainerId :: ImplId ( _) => self . find_self_types ( & def, ty. clone ( ) ) ,
213
+ ContainerId :: TraitId ( trait_ ) => {
208
214
// we're picking this method
209
- let trait_substs = Substs :: build_for_def ( self . db , t . id )
215
+ let trait_substs = Substs :: build_for_def ( self . db , trait_ )
210
216
. push ( ty. clone ( ) )
211
217
. fill ( std:: iter:: repeat_with ( || self . new_type_var ( ) ) )
212
218
. build ( ) ;
@@ -215,29 +221,35 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
215
221
. fill_with_params ( )
216
222
. build ( ) ;
217
223
self . obligations . push ( super :: Obligation :: Trait ( TraitRef {
218
- trait_ : t . id ,
224
+ trait_,
219
225
substs : trait_substs,
220
226
} ) ) ;
221
227
Some ( substs)
222
228
}
229
+ ContainerId :: ModuleId ( _) => None ,
223
230
} ;
224
231
225
- self . write_assoc_resolution ( id, item) ;
232
+ self . write_assoc_resolution ( id, item. into ( ) ) ;
226
233
Some ( ( def, substs) )
227
234
} ,
228
235
)
229
236
}
230
237
231
238
fn find_self_types ( & self , def : & ValueNs , actual_def_ty : Ty ) -> Option < Substs > {
232
- if let ValueNs :: FunctionId ( func) = def {
233
- let func = Function :: from ( * func) ;
239
+ if let ValueNs :: FunctionId ( func) = * def {
234
240
// We only do the infer if parent has generic params
235
- let gen = self . db . generic_params ( func. id . into ( ) ) ;
241
+ let gen = self . db . generic_params ( func. into ( ) ) ;
236
242
if gen. count_parent_params ( ) == 0 {
237
243
return None ;
238
244
}
239
245
240
- let impl_block = func. impl_block ( self . db ) ?. target_ty ( self . db ) ;
246
+ let impl_id = match func. lookup ( self . db ) . container {
247
+ ContainerId :: ImplId ( it) => it,
248
+ _ => return None ,
249
+ } ;
250
+ let resolver = impl_id. resolver ( self . db ) ;
251
+ let impl_data = self . db . impl_data ( impl_id) ;
252
+ let impl_block = Ty :: from_hir ( self . db , & resolver, & impl_data. target_type ) ;
241
253
let impl_block_substs = impl_block. substs ( ) ?;
242
254
let actual_substs = actual_def_ty. substs ( ) ?;
243
255
0 commit comments