From fcdced115e3b101ed168b175fa63a2a07c1e839c Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Tue, 1 Feb 2022 12:33:55 +0100 Subject: [PATCH] Deprioritize ops function completions for non-method calls --- crates/ide_completion/src/render.rs | 27 ++++++++++++++++++-- crates/ide_completion/src/render/function.rs | 12 ++++----- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index 15dacc8e462..5feee48a96c 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs @@ -1354,7 +1354,7 @@ fn main() { } #[test] - fn op_method_relevances() { + fn op_function_relevances() { check_relevance( r#" #[lang = "sub"] @@ -1367,7 +1367,30 @@ fn foo(a: u32) { a.$0 } expect![[r#" me sub(…) (as Sub) [op_method] "#]], - ) + ); + check_relevance( + r#" +struct Foo; +impl Foo { + fn new() -> Self {} +} +#[lang = "eq"] +pub trait PartialEq { + fn eq(&self, other: &Rhs) -> bool; + fn ne(&self, other: &Rhs) -> bool; +} + +impl PartialEq for Foo {} +fn main() { + Foo::$0 +} +"#, + expect![[r#" + fn new() [] + me eq(…) (as PartialEq) [op_method] + me ne(…) (as PartialEq) [op_method] + "#]], + ); } #[test] diff --git a/crates/ide_completion/src/render/function.rs b/crates/ide_completion/src/render/function.rs index fc2cb933db2..224d4b054e0 100644 --- a/crates/ide_completion/src/render/function.rs +++ b/crates/ide_completion/src/render/function.rs @@ -67,16 +67,14 @@ fn render( ); let ret_type = func.ret_type(db); + let is_op_method = func + .as_assoc_item(ctx.db()) + .and_then(|trait_| trait_.containing_trait_or_trait_impl(ctx.db())) + .map_or(false, |trait_| completion.is_ops_trait(trait_)); item.set_relevance(CompletionRelevance { type_match: compute_type_match(completion, &ret_type), exact_name_match: compute_exact_name_match(completion, &call), - is_op_method: match func_type { - FuncType::Method(_) => func - .as_assoc_item(ctx.db()) - .and_then(|trait_| trait_.containing_trait_or_trait_impl(ctx.db())) - .map_or(false, |trait_| completion.is_ops_trait(trait_)), - _ => false, - }, + is_op_method, ..CompletionRelevance::default() });