diff options
author | Florian Diebold <[email protected]> | 2019-05-01 16:57:56 +0100 |
---|---|---|
committer | Florian Diebold <[email protected]> | 2019-05-04 17:18:30 +0100 |
commit | 0ad7317b24dc90c3787482f9ec563e7830d499fc (patch) | |
tree | b065393029bb8d886c3562af2e0fbcf1bc62a0e6 /crates/ra_hir/src/ty/infer.rs | |
parent | ef77d8375130d12678d4b2316cc1708c90349dad (diff) |
Canonicalize before doing method resolution
Diffstat (limited to 'crates/ra_hir/src/ty/infer.rs')
-rw-r--r-- | crates/ra_hir/src/ty/infer.rs | 13 |
1 files changed, 10 insertions, 3 deletions
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::{ | |||
45 | use super::{ | 45 | use super::{ |
46 | Ty, TypableDef, Substs, primitive, op, ApplicationTy, TypeCtor, CallableDef, TraitRef, | 46 | Ty, TypableDef, Substs, primitive, op, ApplicationTy, TypeCtor, CallableDef, TraitRef, |
47 | traits::{Solution, Obligation, Guidance}, | 47 | traits::{Solution, Obligation, Guidance}, |
48 | method_resolution, | ||
48 | }; | 49 | }; |
49 | 50 | ||
50 | mod unify; | 51 | mod unify; |
51 | 52 | ||
52 | pub(super) use unify::Canonical; | ||
53 | |||
54 | /// The entry point of type inference. | 53 | /// The entry point of type inference. |
55 | pub fn infer(db: &impl HirDatabase, def: DefWithBody) -> Arc<InferenceResult> { | 54 | pub fn infer(db: &impl HirDatabase, def: DefWithBody) -> Arc<InferenceResult> { |
56 | db.check_canceled(); | 55 | db.check_canceled(); |
@@ -878,9 +877,17 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
878 | generic_args: Option<&GenericArgs>, | 877 | generic_args: Option<&GenericArgs>, |
879 | ) -> Ty { | 878 | ) -> Ty { |
880 | let receiver_ty = self.infer_expr(receiver, &Expectation::none()); | 879 | let receiver_ty = self.infer_expr(receiver, &Expectation::none()); |
881 | let resolved = receiver_ty.clone().lookup_method(self.db, method_name, &self.resolver); | 880 | let mut canonicalizer = self.canonicalizer(); |
881 | let canonical_receiver = canonicalizer.canonicalize_ty(receiver_ty.clone()); | ||
882 | let resolved = method_resolution::lookup_method( | ||
883 | &canonical_receiver, | ||
884 | canonicalizer.ctx.db, | ||
885 | method_name, | ||
886 | &canonicalizer.ctx.resolver, | ||
887 | ); | ||
882 | let (derefed_receiver_ty, method_ty, def_generics) = match resolved { | 888 | let (derefed_receiver_ty, method_ty, def_generics) = match resolved { |
883 | Some((ty, func)) => { | 889 | Some((ty, func)) => { |
890 | let ty = canonicalizer.decanonicalize_ty(ty); | ||
884 | self.write_method_resolution(tgt_expr, func); | 891 | self.write_method_resolution(tgt_expr, func); |
885 | ( | 892 | ( |
886 | ty, | 893 | ty, |