diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-03-10 20:35:45 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-03-10 20:35:45 +0000 |
commit | 0714a065d578e8b22b0451bfc64378c875fe858f (patch) | |
tree | 75665c712625782d88e03447fcd10245c903d6f8 /crates/ra_ide | |
parent | e5df8c402847d5bedb8ebcb621aac46dbe215cdd (diff) | |
parent | adc7b8ea2d0ff1dafecaa697638825463f4b8891 (diff) |
Merge #3552
3552: Fix completion with a partially unknown type r=matklad a=flodiebold
To test whether the receiver type matches for the impl, we unify the given self
type (in this case `HashSet<{unknown}>`) with the self type of the
impl (`HashSet<?0>`), but if the given self type contains Unknowns, they won't
be unified with the variables in those places. So we got a receiver type that
was different from the expected one, and concluded the impl doesn't match.
The fix is slightly hacky; if after the unification, our variables are still
there, we make them fall back to Unknown. This does make some sense though,
since we don't want to 'leak' the variables.
Fixes #3547.
Co-authored-by: Florian Diebold <[email protected]>
Diffstat (limited to 'crates/ra_ide')
-rw-r--r-- | crates/ra_ide/src/completion/complete_dot.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/crates/ra_ide/src/completion/complete_dot.rs b/crates/ra_ide/src/completion/complete_dot.rs index f275305e2..d8f6f0d9d 100644 --- a/crates/ra_ide/src/completion/complete_dot.rs +++ b/crates/ra_ide/src/completion/complete_dot.rs | |||
@@ -718,4 +718,35 @@ mod tests { | |||
718 | "### | 718 | "### |
719 | ); | 719 | ); |
720 | } | 720 | } |
721 | |||
722 | #[test] | ||
723 | fn test_method_completion_3547() { | ||
724 | assert_debug_snapshot!( | ||
725 | do_ref_completion( | ||
726 | r" | ||
727 | struct HashSet<T> {} | ||
728 | impl<T> HashSet<T> { | ||
729 | pub fn the_method(&self) {} | ||
730 | } | ||
731 | fn foo() { | ||
732 | let s: HashSet<_>; | ||
733 | s.<|> | ||
734 | } | ||
735 | ", | ||
736 | ), | ||
737 | @r###" | ||
738 | [ | ||
739 | CompletionItem { | ||
740 | label: "the_method()", | ||
741 | source_range: [201; 201), | ||
742 | delete: [201; 201), | ||
743 | insert: "the_method()$0", | ||
744 | kind: Method, | ||
745 | lookup: "the_method", | ||
746 | detail: "pub fn the_method(&self)", | ||
747 | }, | ||
748 | ] | ||
749 | "### | ||
750 | ); | ||
751 | } | ||
721 | } | 752 | } |