@@ -11,7 +11,8 @@ use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum
11
11
use ra_db:: CrateId ;
12
12
13
13
use hir_def:: {
14
- lang_item:: LangItemTarget , AstItemDef , ContainerId , GenericDefId , Lookup , TraitId , TypeAliasId ,
14
+ lang_item:: LangItemTarget , resolver:: HasResolver , AstItemDef , ContainerId , GenericDefId ,
15
+ Lookup , TraitId , TypeAliasId ,
15
16
} ;
16
17
use hir_expand:: name;
17
18
@@ -22,7 +23,7 @@ use crate::{
22
23
db:: HirDatabase ,
23
24
ty:: display:: HirDisplay ,
24
25
ty:: { ApplicationTy , GenericPredicate , ProjectionTy , Substs , TraitRef , Ty , TypeCtor , TypeWalk } ,
25
- ImplBlock , TypeAlias ,
26
+ ImplBlock ,
26
27
} ;
27
28
28
29
/// This represents a trait whose name we could not resolve.
@@ -670,7 +671,7 @@ fn impl_block_datum(
670
671
// don't include associated types that don't exist in the trait
671
672
trait_data. associated_type_by_name ( & type_alias. name ( db) ) . is_some ( )
672
673
} )
673
- . map ( |type_alias| AssocTyValue :: TypeAlias ( type_alias) . to_chalk ( db) )
674
+ . map ( |type_alias| AssocTyValue :: TypeAlias ( type_alias. id ) . to_chalk ( db) )
674
675
. collect ( ) ;
675
676
debug ! ( "impl_datum: {:?}" , impl_datum_bound) ;
676
677
let impl_datum = ImplDatum {
@@ -773,24 +774,33 @@ pub(crate) fn associated_ty_value_query(
773
774
fn type_alias_associated_ty_value (
774
775
db : & impl HirDatabase ,
775
776
_krate : CrateId ,
776
- type_alias : TypeAlias ,
777
+ type_alias : TypeAliasId ,
777
778
) -> Arc < AssociatedTyValue < ChalkIr > > {
778
- let impl_block = type_alias. impl_block ( db) . expect ( "assoc ty value should be in impl" ) ;
779
- let impl_id = Impl :: ImplBlock ( impl_block) . to_chalk ( db) ;
780
- let trait_ = impl_block
781
- . target_trait_ref ( db)
782
- . expect ( "assoc ty value should not exist" ) // we don't return any assoc ty values if the impl'd trait can't be resolved
783
- . trait_ ;
779
+ let type_alias_data = db. type_alias_data ( type_alias) ;
780
+ let impl_id = match type_alias. lookup ( db) . container {
781
+ ContainerId :: ImplId ( it) => it,
782
+ _ => panic ! ( "assoc ty value should be in impl" ) ,
783
+ } ;
784
+
785
+ let impl_data = db. impl_data ( impl_id) ;
786
+ let resolver = impl_id. resolver ( db) ;
787
+ let target_ty = Ty :: from_hir ( db, & resolver, & impl_data. target_type ) ;
788
+ let target_trait = impl_data
789
+ . target_trait
790
+ . as_ref ( )
791
+ . and_then ( |trait_ref| TraitRef :: from_hir ( db, & resolver, & trait_ref, Some ( target_ty) ) )
792
+ . expect ( "assoc ty value should not exist" ) ; // we don't return any assoc ty values if the impl'd trait can't be resolved
793
+
784
794
let assoc_ty = db
785
- . trait_data ( trait_)
786
- . associated_type_by_name ( & type_alias . name ( db ) )
795
+ . trait_data ( target_trait . trait_ )
796
+ . associated_type_by_name ( & type_alias_data . name )
787
797
. expect ( "assoc ty value should not exist" ) ; // validated when building the impl data as well
788
- let generic_params = db. generic_params ( impl_block . id . into ( ) ) ;
798
+ let generic_params = db. generic_params ( impl_id . into ( ) ) ;
789
799
let bound_vars = Substs :: bound_vars ( & generic_params) ;
790
- let ty = db. ty ( type_alias. id . into ( ) ) . subst ( & bound_vars) ;
800
+ let ty = db. ty ( type_alias. into ( ) ) . subst ( & bound_vars) ;
791
801
let value_bound = chalk_rust_ir:: AssociatedTyValueBound { ty : ty. to_chalk ( db) } ;
792
802
let value = chalk_rust_ir:: AssociatedTyValue {
793
- impl_id,
803
+ impl_id : Impl :: ImplBlock ( impl_id . into ( ) ) . to_chalk ( db ) ,
794
804
associated_ty_id : assoc_ty. to_chalk ( db) ,
795
805
value : make_binders ( value_bound, bound_vars. len ( ) ) ,
796
806
} ;
0 commit comments