diff options
-rw-r--r-- | crates/ra_hir/src/ty/method_resolution.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/traits.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/traits/chalk.rs | 40 |
3 files changed, 29 insertions, 19 deletions
diff --git a/crates/ra_hir/src/ty/method_resolution.rs b/crates/ra_hir/src/ty/method_resolution.rs index 92645e2a5..7df2649c9 100644 --- a/crates/ra_hir/src/ty/method_resolution.rs +++ b/crates/ra_hir/src/ty/method_resolution.rs | |||
@@ -62,7 +62,7 @@ impl CrateImplBlocks { | |||
62 | let impl_data = db.impl_data(impl_id); | 62 | let impl_data = db.impl_data(impl_id); |
63 | let resolver = impl_id.resolver(db); | 63 | let resolver = impl_id.resolver(db); |
64 | 64 | ||
65 | let target_ty = { Ty::from_hir(db, &resolver, &impl_data.target_type) }; | 65 | let target_ty = Ty::from_hir(db, &resolver, &impl_data.target_type); |
66 | 66 | ||
67 | match &impl_data.target_trait { | 67 | match &impl_data.target_trait { |
68 | Some(trait_ref) => { | 68 | Some(trait_ref) => { |
diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs index 39b489a4c..99afeb35f 100644 --- a/crates/ra_hir/src/ty/traits.rs +++ b/crates/ra_hir/src/ty/traits.rs | |||
@@ -2,13 +2,13 @@ | |||
2 | use std::sync::{Arc, Mutex}; | 2 | use std::sync::{Arc, Mutex}; |
3 | 3 | ||
4 | use chalk_ir::{cast::Cast, family::ChalkIr}; | 4 | use chalk_ir::{cast::Cast, family::ChalkIr}; |
5 | use hir_def::{expr::ExprId, DefWithBodyId, TraitId}; | 5 | use hir_def::{expr::ExprId, DefWithBodyId, TraitId, TypeAliasId}; |
6 | use log::debug; | 6 | use log::debug; |
7 | use ra_db::{impl_intern_key, salsa, CrateId}; | 7 | use ra_db::{impl_intern_key, salsa, CrateId}; |
8 | use ra_prof::profile; | 8 | use ra_prof::profile; |
9 | use rustc_hash::FxHashSet; | 9 | use rustc_hash::FxHashSet; |
10 | 10 | ||
11 | use crate::{db::HirDatabase, ImplBlock, TypeAlias}; | 11 | use crate::{db::HirDatabase, ImplBlock}; |
12 | 12 | ||
13 | use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty, TypeWalk}; | 13 | use super::{Canonical, GenericPredicate, HirDisplay, ProjectionTy, TraitRef, Ty, TypeWalk}; |
14 | 14 | ||
@@ -317,7 +317,7 @@ impl_intern_key!(GlobalImplId); | |||
317 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 317 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
318 | pub enum AssocTyValue { | 318 | pub enum AssocTyValue { |
319 | /// A normal assoc type value from an impl block. | 319 | /// A normal assoc type value from an impl block. |
320 | TypeAlias(TypeAlias), | 320 | TypeAlias(TypeAliasId), |
321 | /// The output type of the Fn trait implementation. | 321 | /// The output type of the Fn trait implementation. |
322 | ClosureFnTraitImplOutput(ClosureFnTraitImplData), | 322 | ClosureFnTraitImplOutput(ClosureFnTraitImplData), |
323 | } | 323 | } |
diff --git a/crates/ra_hir/src/ty/traits/chalk.rs b/crates/ra_hir/src/ty/traits/chalk.rs index 49fa95508..76ff6f67f 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 | |||
11 | use ra_db::CrateId; | 11 | use ra_db::CrateId; |
12 | 12 | ||
13 | use hir_def::{ | 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 | use hir_expand::name; | 17 | use 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. |
@@ -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( | |||
773 | fn type_alias_associated_ty_value( | 774 | fn 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 | }; |