From 0ad7317b24dc90c3787482f9ec563e7830d499fc Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Wed, 1 May 2019 17:57:56 +0200 Subject: Canonicalize before doing method resolution --- crates/ra_hir/src/ty/infer.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir/src/ty/infer.rs') diff --git a/crates/ra_hir/src/ty/infer.rs b/crates/ra_hir/src/ty/infer.rs index a6d08dbcb..41ae569f7 100644 --- a/crates/ra_hir/src/ty/infer.rs +++ b/crates/ra_hir/src/ty/infer.rs @@ -45,12 +45,11 @@ use crate::{ use super::{ Ty, TypableDef, Substs, primitive, op, ApplicationTy, TypeCtor, CallableDef, TraitRef, traits::{Solution, Obligation, Guidance}, + method_resolution, }; mod unify; -pub(super) use unify::Canonical; - /// The entry point of type inference. pub fn infer(db: &impl HirDatabase, def: DefWithBody) -> Arc { db.check_canceled(); @@ -878,9 +877,17 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { generic_args: Option<&GenericArgs>, ) -> Ty { let receiver_ty = self.infer_expr(receiver, &Expectation::none()); - let resolved = receiver_ty.clone().lookup_method(self.db, method_name, &self.resolver); + let mut canonicalizer = self.canonicalizer(); + let canonical_receiver = canonicalizer.canonicalize_ty(receiver_ty.clone()); + let resolved = method_resolution::lookup_method( + &canonical_receiver, + canonicalizer.ctx.db, + method_name, + &canonicalizer.ctx.resolver, + ); let (derefed_receiver_ty, method_ty, def_generics) = match resolved { Some((ty, func)) => { + let ty = canonicalizer.decanonicalize_ty(ty); self.write_method_resolution(tgt_expr, func); ( ty, -- cgit v1.2.3