Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/dot.rs')
-rw-r--r--crates/ide-completion/src/completions/dot.rs26
1 files changed, 14 insertions, 12 deletions
diff --git a/crates/ide-completion/src/completions/dot.rs b/crates/ide-completion/src/completions/dot.rs
index f75123324f..8b4f315ac5 100644
--- a/crates/ide-completion/src/completions/dot.rs
+++ b/crates/ide-completion/src/completions/dot.rs
@@ -2,7 +2,7 @@
use std::ops::ControlFlow;
-use hir::{Complete, HasContainer, ItemContainer, MethodCandidateCallback, Name};
+use hir::{Complete, Function, HasContainer, ItemContainer, MethodCandidateCallback};
use ide_db::FxHashSet;
use syntax::SmolStr;
@@ -237,7 +237,10 @@ fn complete_methods(
struct Callback<'a, F> {
ctx: &'a CompletionContext<'a>,
f: F,
- seen_methods: FxHashSet<Name>,
+ // We deliberately deduplicate by function ID and not name, because while inherent methods cannot be
+ // duplicated, trait methods can. And it is still useful to show all of them (even when there
+ // is also an inherent method, especially considering that it may be private, and filtered later).
+ seen_methods: FxHashSet<Function>,
}
impl<F> MethodCandidateCallback for Callback<'_, F>
@@ -247,9 +250,7 @@ fn complete_methods(
// We don't want to exclude inherent trait methods - that is, methods of traits available from
// `where` clauses or `dyn Trait`.
fn on_inherent_method(&mut self, func: hir::Function) -> ControlFlow<()> {
- if func.self_param(self.ctx.db).is_some()
- && self.seen_methods.insert(func.name(self.ctx.db))
- {
+ if func.self_param(self.ctx.db).is_some() && self.seen_methods.insert(func) {
(self.f)(func);
}
ControlFlow::Continue(())
@@ -265,9 +266,7 @@ fn complete_methods(
return ControlFlow::Continue(());
}
- if func.self_param(self.ctx.db).is_some()
- && self.seen_methods.insert(func.name(self.ctx.db))
- {
+ if func.self_param(self.ctx.db).is_some() && self.seen_methods.insert(func) {
(self.f)(func);
}
@@ -1384,14 +1383,15 @@ fn baz() {
fn skip_iter() {
check_no_kw(
r#"
- //- minicore: iterator
+ //- minicore: iterator, clone, builtin_impls
fn foo() {
[].$0
}
"#,
expect![[r#"
- me clone() (as Clone) fn(&self) -> Self
- me into_iter() (as IntoIterator) fn(self) -> <Self as IntoIterator>::IntoIter
+ me clone() (as Clone) fn(&self) -> Self
+ me fmt(…) (use core::fmt::Debug) fn(&self, &mut Formatter<'_>) -> Result<(), Error>
+ me into_iter() (as IntoIterator) fn(self) -> <Self as IntoIterator>::IntoIter
"#]],
);
check_no_kw(
@@ -1501,7 +1501,9 @@ fn main() {
bar.$0
}
"#,
- expect![[r#""#]],
+ expect![[r#"
+ me foo() fn(self: Bar)
+ "#]],
);
}