From 11aed78e2b0aa573f152a2159ae3525b01c9581d Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:44:27 +0500 Subject: [PATCH] fix: replace errors in receiver type when iterating method candidates --- crates/hir/src/lib.rs | 4 +--- crates/ide_completion/src/completions/dot.rs | 22 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 99ab630a30..a28e93d53b 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -2601,9 +2601,7 @@ impl Type { ) { // There should be no inference vars in types passed here // FIXME check that? - // FIXME replace Unknown by bound vars here - let canonical = - Canonical { value: self.ty.clone(), binders: CanonicalVarKinds::empty(&Interner) }; + let canonical = hir_ty::replace_errors_with_variables(&self.ty); let env = self.env.clone(); let krate = krate.id; diff --git a/crates/ide_completion/src/completions/dot.rs b/crates/ide_completion/src/completions/dot.rs index 94a5ebabf9..213cb70170 100644 --- a/crates/ide_completion/src/completions/dot.rs +++ b/crates/ide_completion/src/completions/dot.rs @@ -697,4 +697,26 @@ fn f() { "#]], ); } + + #[test] + fn completes_method_call_when_receiver_type_has_errors_issue_10297() { + check( + r#" +//- minicore: iterator, sized +struct Vec; +impl IntoIterator for Vec { + type Item = (); + type IntoIter = (); + fn into_iter(self); +} +fn main() { + let x: Vec<_>; + x.$0; +} +"#, + expect![[r#" + me into_iter() (as IntoIterator) fn(self) -> ::IntoIter + "#]], + ) + } }