From 529c369c9bc15a73e7a03260eca84ccef99ac281 Mon Sep 17 00:00:00 2001 From: oxalica Date: Sat, 12 Sep 2020 01:03:28 +0800 Subject: Fix type walking about type of async block --- crates/hir_ty/src/lib.rs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'crates/hir_ty') diff --git a/crates/hir_ty/src/lib.rs b/crates/hir_ty/src/lib.rs index 4a7d3a0d9..f16d1fc97 100644 --- a/crates/hir_ty/src/lib.rs +++ b/crates/hir_ty/src/lib.rs @@ -33,7 +33,6 @@ use hir_def::{ AdtId, AssocContainerId, DefWithBodyId, GenericDefId, HasModule, Lookup, TraitId, TypeAliasId, TypeParamId, }; -use hir_expand::name::name; use itertools::Itertools; use crate::{ @@ -848,26 +847,22 @@ impl Ty { pub fn impl_trait_bounds(&self, db: &dyn HirDatabase) -> Option> { match self { - Ty::Apply(ApplicationTy { ctor: TypeCtor::OpaqueType(opaque_ty_id), parameters }) => { + Ty::Apply(ApplicationTy { ctor: TypeCtor::OpaqueType(opaque_ty_id), .. }) => { match opaque_ty_id { OpaqueTyId::AsyncBlockTypeImplTrait(def, _expr) => { let krate = def.module(db.upcast()).krate; - if let Some(future_output) = db + if let Some(future_trait) = db .lang_item(krate, "future_trait".into()) .and_then(|item| item.as_trait()) - .and_then(|trait_| { - db.trait_data(trait_).associated_type_by_name(&name![Output]) - }) { - let proj = GenericPredicate::Projection(ProjectionPredicate { - projection_ty: ProjectionTy { - associated_ty: future_output, - // Self type. - parameters: Substs::single(self.clone()), - }, - ty: parameters[0].clone(), + // This is only used by type walking. + // Parameters will be walked outside, and projection predicate is not used. + // So just provide the Future trait. + let impl_bound = GenericPredicate::Implemented(TraitRef { + trait_: future_trait, + substs: Substs::empty(), }); - Some(vec![proj]) + Some(vec![impl_bound]) } else { None } -- cgit v1.2.3