aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/traits/chalk.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/traits/chalk.rs')
-rw-r--r--crates/ra_hir/src/ty/traits/chalk.rs42
1 files changed, 26 insertions, 16 deletions
diff --git a/crates/ra_hir/src/ty/traits/chalk.rs b/crates/ra_hir/src/ty/traits/chalk.rs
index 49fa95508..7b2e530a2 100644
--- a/crates/ra_hir/src/ty/traits/chalk.rs
+++ b/crates/ra_hir/src/ty/traits/chalk.rs
@@ -11,7 +11,8 @@ use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum
11use ra_db::CrateId; 11use ra_db::CrateId;
12 12
13use hir_def::{ 13use 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};
16use hir_expand::name; 17use hir_expand::name;
17 18
@@ -22,7 +23,7 @@ use crate::{
22 db::HirDatabase, 23 db::HirDatabase,
23 ty::display::HirDisplay, 24 ty::display::HirDisplay,
24 ty::{ApplicationTy, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk}, 25 ty::{ApplicationTy, GenericPredicate, ProjectionTy, Substs, TraitRef, Ty, TypeCtor, TypeWalk},
25 ImplBlock, TypeAlias, 26 ImplBlock,
26}; 27};
27 28
28/// This represents a trait whose name we could not resolve. 29/// This represents a trait whose name we could not resolve.
@@ -452,7 +453,7 @@ where
452 .impls_for_trait(self.krate, trait_.into()) 453 .impls_for_trait(self.krate, trait_.into())
453 .iter() 454 .iter()
454 .copied() 455 .copied()
455 .map(Impl::ImplBlock) 456 .map(|it| Impl::ImplBlock(it.into()))
456 .map(|impl_| impl_.to_chalk(self.db)) 457 .map(|impl_| impl_.to_chalk(self.db))
457 .collect(); 458 .collect();
458 459
@@ -670,7 +671,7 @@ fn impl_block_datum(
670 // don't include associated types that don't exist in the trait 671 // don't include associated types that don't exist in the trait
671 trait_data.associated_type_by_name(&type_alias.name(db)).is_some() 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 .collect(); 675 .collect();
675 debug!("impl_datum: {:?}", impl_datum_bound); 676 debug!("impl_datum: {:?}", impl_datum_bound);
676 let impl_datum = ImplDatum { 677 let impl_datum = ImplDatum {
@@ -773,24 +774,33 @@ pub(crate) fn associated_ty_value_query(
773fn type_alias_associated_ty_value( 774fn type_alias_associated_ty_value(
774 db: &impl HirDatabase, 775 db: &impl HirDatabase,
775 _krate: CrateId, 776 _krate: CrateId,
776 type_alias: TypeAlias, 777 type_alias: TypeAliasId,
777) -> Arc<AssociatedTyValue<ChalkIr>> { 778) -> Arc<AssociatedTyValue<ChalkIr>> {
778 let impl_block = type_alias.impl_block(db).expect("assoc ty value should be in impl"); 779 let type_alias_data = db.type_alias_data(type_alias);
779 let impl_id = Impl::ImplBlock(impl_block).to_chalk(db); 780 let impl_id = match type_alias.lookup(db).container {
780 let trait_ = impl_block 781 ContainerId::ImplId(it) => it,
781 .target_trait_ref(db) 782 _ => panic!("assoc ty value should be in impl"),
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 };
783 .trait_; 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 let assoc_ty = db 794 let assoc_ty = db
785 .trait_data(trait_) 795 .trait_data(target_trait.trait_)
786 .associated_type_by_name(&type_alias.name(db)) 796 .associated_type_by_name(&type_alias_data.name)
787 .expect("assoc ty value should not exist"); // validated when building the impl data as well 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 let bound_vars = Substs::bound_vars(&generic_params); 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 let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: ty.to_chalk(db) }; 801 let value_bound = chalk_rust_ir::AssociatedTyValueBound { ty: ty.to_chalk(db) };
792 let value = chalk_rust_ir::AssociatedTyValue { 802 let value = chalk_rust_ir::AssociatedTyValue {
793 impl_id, 803 impl_id: Impl::ImplBlock(impl_id.into()).to_chalk(db),
794 associated_ty_id: assoc_ty.to_chalk(db), 804 associated_ty_id: assoc_ty.to_chalk(db),
795 value: make_binders(value_bound, bound_vars.len()), 805 value: make_binders(value_bound, bound_vars.len()),
796 }; 806 };