@@ -31,7 +31,6 @@ use crate::{
31
31
utils:: { all_super_traits, associated_type_by_name_including_super_traits, variant_data} ,
32
32
} ,
33
33
util:: make_mut_slice,
34
- ImplBlock , Trait ,
35
34
} ;
36
35
37
36
impl Ty {
@@ -148,13 +147,8 @@ impl Ty {
148
147
) -> Ty {
149
148
let ty = match resolution {
150
149
TypeNs :: TraitId ( trait_) => {
151
- let trait_ref = TraitRef :: from_resolved_path (
152
- db,
153
- resolver,
154
- trait_. into ( ) ,
155
- resolved_segment,
156
- None ,
157
- ) ;
150
+ let trait_ref =
151
+ TraitRef :: from_resolved_path ( db, resolver, trait_, resolved_segment, None ) ;
158
152
return if remaining_segments. len ( ) == 1 {
159
153
let segment = & remaining_segments[ 0 ] ;
160
154
let associated_ty = associated_type_by_name_including_super_traits (
@@ -187,7 +181,11 @@ impl Ty {
187
181
let name = resolved_segment. name . clone ( ) ;
188
182
Ty :: Param { idx, name }
189
183
}
190
- TypeNs :: SelfType ( impl_block) => ImplBlock :: from ( impl_block) . target_ty ( db) ,
184
+ TypeNs :: SelfType ( impl_id) => {
185
+ let impl_data = db. impl_data ( impl_id) ;
186
+ let resolver = impl_id. resolver ( db) ;
187
+ Ty :: from_hir ( db, & resolver, & impl_data. target_type )
188
+ }
191
189
TypeNs :: AdtSelfType ( adt) => db. ty ( adt. into ( ) ) ,
192
190
193
191
TypeNs :: AdtId ( it) => Ty :: from_hir_path_inner ( db, resolver, resolved_segment, it. into ( ) ) ,
@@ -250,14 +248,11 @@ impl Ty {
250
248
GenericPredicate :: Implemented ( tr) if tr. self_ty ( ) == & self_ty => Some ( tr. trait_ ) ,
251
249
_ => None ,
252
250
} ) ;
253
- let traits = traits_from_env. flat_map ( |t| all_super_traits ( db, t) ) . map ( Trait :: from ) ;
251
+ let traits = traits_from_env. flat_map ( |t| all_super_traits ( db, t) ) ;
254
252
for t in traits {
255
- if let Some ( associated_ty) = db. trait_data ( t. id ) . associated_type_by_name ( & segment. name )
256
- {
257
- let substs = Substs :: build_for_def ( db, t. id )
258
- . push ( self_ty. clone ( ) )
259
- . fill_with_unknown ( )
260
- . build ( ) ;
253
+ if let Some ( associated_ty) = db. trait_data ( t) . associated_type_by_name ( & segment. name ) {
254
+ let substs =
255
+ Substs :: build_for_def ( db, t) . push ( self_ty. clone ( ) ) . fill_with_unknown ( ) . build ( ) ;
261
256
// FIXME handle type parameters on the segment
262
257
return Ty :: Projection ( ProjectionTy { associated_ty, parameters : substs } ) ;
263
258
}
@@ -391,15 +386,15 @@ impl TraitRef {
391
386
pub ( super ) fn from_resolved_path (
392
387
db : & impl HirDatabase ,
393
388
resolver : & Resolver ,
394
- resolved : Trait ,
389
+ resolved : TraitId ,
395
390
segment : & PathSegment ,
396
391
explicit_self_ty : Option < Ty > ,
397
392
) -> Self {
398
393
let mut substs = TraitRef :: substs_from_path ( db, resolver, segment, resolved) ;
399
394
if let Some ( self_ty) = explicit_self_ty {
400
395
make_mut_slice ( & mut substs. 0 ) [ 0 ] = self_ty;
401
396
}
402
- TraitRef { trait_ : resolved. id , substs }
397
+ TraitRef { trait_ : resolved, substs }
403
398
}
404
399
405
400
pub ( crate ) fn from_hir (
@@ -419,11 +414,11 @@ impl TraitRef {
419
414
db : & impl HirDatabase ,
420
415
resolver : & Resolver ,
421
416
segment : & PathSegment ,
422
- resolved : Trait ,
417
+ resolved : TraitId ,
423
418
) -> Substs {
424
419
let has_self_param =
425
420
segment. args_and_bindings . as_ref ( ) . map ( |a| a. has_self_type ) . unwrap_or ( false ) ;
426
- substs_from_path_segment ( db, resolver, segment, Some ( resolved. id . into ( ) ) , !has_self_param)
421
+ substs_from_path_segment ( db, resolver, segment, Some ( resolved. into ( ) ) , !has_self_param)
427
422
}
428
423
429
424
pub ( crate ) fn for_trait ( db : & impl HirDatabase , trait_ : TraitId ) -> TraitRef {
0 commit comments