Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/closure.rs')
-rw-r--r--crates/hir-ty/src/infer/closure.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/crates/hir-ty/src/infer/closure.rs b/crates/hir-ty/src/infer/closure.rs
index d8fc20e874..38ac2e1170 100644
--- a/crates/hir-ty/src/infer/closure.rs
+++ b/crates/hir-ty/src/infer/closure.rs
@@ -9,7 +9,6 @@ use chalk_ir::{
visit::{TypeSuperVisitable, TypeVisitable, TypeVisitor},
};
use either::Either;
-use hir_def::Lookup;
use hir_def::{
DefWithBodyId, FieldId, HasModule, TupleFieldId, TupleId, VariantId,
expr_store::path::Path,
@@ -22,6 +21,7 @@ use hir_def::{
resolver::ValueNs,
type_ref::TypeRefId,
};
+use hir_def::{ItemContainerId, Lookup, TraitId};
use hir_expand::name::Name;
use intern::sym;
use rustc_hash::{FxHashMap, FxHashSet};
@@ -30,16 +30,16 @@ use stdx::{format_to, never};
use syntax::utils::is_raw_identifier;
use crate::{
- Adjust, Adjustment, AliasEq, AliasTy, Binders, BindingMode, ChalkTraitId, ClosureId, DynTy,
- DynTyExt, FnAbi, FnPointer, FnSig, Interner, OpaqueTy, ProjectionTy, ProjectionTyExt,
- Substitution, Ty, TyBuilder, TyExt, WhereClause,
+ Adjust, Adjustment, AliasEq, AliasTy, Binders, BindingMode, ClosureId, DynTy, DynTyExt, FnAbi,
+ FnPointer, FnSig, Interner, OpaqueTy, ProjectionTy, ProjectionTyExt, Substitution, Ty,
+ TyBuilder, TyExt, WhereClause,
db::{HirDatabase, InternedClosure, InternedCoroutine},
error_lifetime, from_assoc_type_id, from_chalk_trait_id, from_placeholder_idx,
generics::Generics,
infer::{BreakableKind, CoerceMany, Diverges, coerce::CoerceNever},
make_binders,
mir::{BorrowKind, MirSpan, MutBorrowKind, ProjectionElem},
- to_assoc_type_id, to_chalk_trait_id,
+ to_assoc_type_id,
traits::FnTrait,
utils::{self, elaborate_clause_supertraits},
};
@@ -321,10 +321,8 @@ impl InferenceContext<'_> {
fn deduce_sig_from_dyn_ty(&self, dyn_ty: &DynTy) -> Option<FnPointer> {
// Search for a predicate like `<$self as FnX<Args>>::Output == Ret`
- let fn_traits: SmallVec<[ChalkTraitId; 3]> =
- utils::fn_traits(self.db, self.owner.module(self.db).krate())
- .map(to_chalk_trait_id)
- .collect();
+ let fn_traits: SmallVec<[TraitId; 3]> =
+ utils::fn_traits(self.db, self.owner.module(self.db).krate()).collect();
let self_ty = self.result.standard_types.unknown.clone();
let bounds = dyn_ty.bounds.clone().substitute(Interner, &[self_ty.cast(Interner)]);
@@ -333,9 +331,13 @@ impl InferenceContext<'_> {
if let WhereClause::AliasEq(AliasEq { alias: AliasTy::Projection(projection), ty }) =
bound.skip_binders()
{
- let assoc_data =
- self.db.associated_ty_data(from_assoc_type_id(projection.associated_ty_id));
- if !fn_traits.contains(&assoc_data.trait_id) {
+ let trait_ =
+ match from_assoc_type_id(projection.associated_ty_id).lookup(self.db).container
+ {
+ ItemContainerId::TraitId(t) => t,
+ _ => panic!("associated type not in trait"),
+ };
+ if !fn_traits.contains(&trait_) {
return None;
}