about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMohammad Mustakim Ali <mustakimali@users.noreply.github.com>2024-02-12 23:11:06 +0000
committerMohammad Mustakim Ali <mustakimali@users.noreply.github.com>2024-02-12 23:11:06 +0000
commit0af14ef8c32f2fd633023d8ff6ba47b820cde7fe (patch)
tree03c757663113cf000ae00da86ee28efaf76dfb50
parent24a3c42bd6b8b7aa994191ad4559cd4ec0d3ed4a (diff)
downloadrust-0af14ef8c32f2fd633023d8ff6ba47b820cde7fe.tar.gz
rust-0af14ef8c32f2fd633023d8ff6ba47b820cde7fe.zip
chore: optimise
-rw-r--r--crates/ide-completion/src/item.rs8
-rw-r--r--crates/ide-completion/src/render.rs64
-rw-r--r--crates/ide-completion/src/render/function.rs43
3 files changed, 50 insertions, 65 deletions
diff --git a/crates/ide-completion/src/item.rs b/crates/ide-completion/src/item.rs
index 6b5392b704b..c2c0641961a 100644
--- a/crates/ide-completion/src/item.rs
+++ b/crates/ide-completion/src/item.rs
@@ -211,8 +211,8 @@ pub enum CompletionRelevancePostfixMatch {
 
 #[derive(Debug, Clone, Copy, Eq, PartialEq)]
 pub struct CompletionRelevanceFn {
-    pub has_args: bool,
-    pub has_self_arg: bool,
+    pub has_params: bool,
+    pub has_self_param: bool,
     pub return_type: CompletionRelevanceReturnType,
 }
 
@@ -310,10 +310,10 @@ impl CompletionRelevance {
                 // Bump Constructor or Builder methods with no arguments,
                 // over them tha with self arguments
                 if fn_score > 0 {
-                    if !asf.has_args {
+                    if !asf.has_params {
                         // bump associated functions
                         fn_score += 1;
-                    } else if asf.has_self_arg {
+                    } else if asf.has_self_param {
                         // downgrade methods (below Constructor)
                         fn_score = 1;
                     }
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs
index 629f4a51c1b..3f374b307fb 100644
--- a/crates/ide-completion/src/render.rs
+++ b/crates/ide-completion/src/render.rs
@@ -1420,8 +1420,8 @@ impl S {
                             is_definite: false,
                             function: Some(
                                 CompletionRelevanceFn {
-                                    has_args: true,
-                                    has_self_arg: true,
+                                    has_params: true,
+                                    has_self_param: true,
                                     return_type: Other,
                                 },
                             ),
@@ -1545,8 +1545,8 @@ fn foo(s: S) { s.$0 }
                             is_definite: false,
                             function: Some(
                                 CompletionRelevanceFn {
-                                    has_args: true,
-                                    has_self_arg: true,
+                                    has_params: true,
+                                    has_self_param: true,
                                     return_type: Other,
                                 },
                             ),
@@ -2207,8 +2207,8 @@ fn test() {
                         "fn(&self, u32) -> Bar",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: Other,
                             },
                         ),
@@ -2217,8 +2217,8 @@ fn test() {
                         "fn(&self)",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: Other,
                             },
                         ),
@@ -2227,8 +2227,8 @@ fn test() {
                         "fn(&self) -> Foo",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: DirectConstructor,
                             },
                         ),
@@ -2237,8 +2237,8 @@ fn test() {
                         "fn(&self, u32) -> Foo",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: DirectConstructor,
                             },
                         ),
@@ -2247,8 +2247,8 @@ fn test() {
                         "fn(&self) -> Option<Foo>",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: Constructor,
                             },
                         ),
@@ -2257,8 +2257,8 @@ fn test() {
                         "fn(&self) -> Result<Foo, Bar>",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: Constructor,
                             },
                         ),
@@ -2267,8 +2267,8 @@ fn test() {
                         "fn(&self) -> Result<Bar, Foo>",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: Constructor,
                             },
                         ),
@@ -2277,8 +2277,8 @@ fn test() {
                         "fn(&self, u32) -> Option<Foo>",
                         Some(
                             CompletionRelevanceFn {
-                                has_args: true,
-                                has_self_arg: true,
+                                has_params: true,
+                                has_self_param: true,
                                 return_type: Constructor,
                             },
                         ),
@@ -2433,8 +2433,8 @@ fn foo(f: Foo) { let _: &u32 = f.b$0 }
                             is_definite: false,
                             function: Some(
                                 CompletionRelevanceFn {
-                                    has_args: true,
-                                    has_self_arg: true,
+                                    has_params: true,
+                                    has_self_param: true,
                                     return_type: Other,
                                 },
                             ),
@@ -2565,8 +2565,8 @@ fn main() {
                             is_definite: false,
                             function: Some(
                                 CompletionRelevanceFn {
-                                    has_args: false,
-                                    has_self_arg: false,
+                                    has_params: false,
+                                    has_self_param: false,
                                     return_type: Other,
                                 },
                             ),
@@ -2932,13 +2932,7 @@ fn main() {
                             is_private_editable: false,
                             postfix_match: None,
                             is_definite: false,
-                            function: Some(
-                                CompletionRelevanceFn {
-                                    has_args: true,
-                                    has_self_arg: true,
-                                    return_type: Other,
-                                },
-                            ),
+                            function: None,
                         },
                     },
                     CompletionItem {
@@ -2961,13 +2955,7 @@ fn main() {
                             is_private_editable: false,
                             postfix_match: None,
                             is_definite: false,
-                            function: Some(
-                                CompletionRelevanceFn {
-                                    has_args: true,
-                                    has_self_arg: true,
-                                    return_type: Other,
-                                },
-                            ),
+                            function: None,
                         },
                     },
                 ]
diff --git a/crates/ide-completion/src/render/function.rs b/crates/ide-completion/src/render/function.rs
index 32075baef51..dc92a127de1 100644
--- a/crates/ide-completion/src/render/function.rs
+++ b/crates/ide-completion/src/render/function.rs
@@ -66,9 +66,9 @@ fn render(
         ),
         _ => (name.unescaped().to_smol_str(), name.to_smol_str()),
     };
-
+    let has_self_param = func.self_param(db).is_some();
     let mut item = CompletionItem::new(
-        if func.self_param(db).is_some() {
+        if has_self_param {
             CompletionItemKind::Method
         } else {
             CompletionItemKind::SymbolKind(SymbolKind::Function)
@@ -104,18 +104,21 @@ fn render(
         .filter(|_| !has_call_parens)
         .and_then(|cap| Some((cap, params(ctx.completion, func, &func_kind, has_dot_receiver)?)));
 
-    let type_match = if has_call_parens || complete_call_parens.is_some() {
-        compute_type_match(completion, &ret_type)
-    } else {
-        compute_type_match(completion, &func.ty(db))
-    };
-
     let function = assoc_item
         .and_then(|assoc_item| assoc_item.implementing_ty(db))
-        .and_then(|self_type| compute_function_match(db, &ctx, self_type, func, &ret_type));
+        .map(|self_type| compute_return_type_match(db, &ctx, self_type, &ret_type))
+        .map(|return_type| CompletionRelevanceFn {
+            has_params: has_self_param || func.num_params(db) > 0,
+            has_self_param,
+            return_type,
+        });
 
     item.set_relevance(CompletionRelevance {
-        type_match,
+        type_match: if has_call_parens || complete_call_parens.is_some() {
+            compute_type_match(completion, &ret_type)
+        } else {
+            compute_type_match(completion, &func.ty(db))
+        },
         exact_name_match: compute_exact_name_match(completion, &call),
         function,
         is_op_method,
@@ -168,26 +171,22 @@ fn render(
     item
 }
 
-fn compute_function_match(
+fn compute_return_type_match(
     db: &dyn HirDatabase,
     ctx: &RenderContext<'_>,
     self_type: hir::Type,
-    func: hir::Function,
-    func_return_type: &hir::Type,
-) -> Option<CompletionRelevanceFn> {
-    let has_args = func.num_params(db) > 0;
-    let has_self_arg = func.self_param(db).is_some();
-
-    let return_type = if match_types(ctx.completion, &self_type, &func_return_type).is_some() {
+    ret_type: &hir::Type,
+) -> CompletionRelevanceReturnType {
+    if match_types(ctx.completion, &self_type, &ret_type).is_some() {
         // fn([..]) -> Self
         CompletionRelevanceReturnType::DirectConstructor
-    } else if func_return_type
+    } else if ret_type
         .type_arguments()
         .any(|ret_type_arg| match_types(ctx.completion, &self_type, &ret_type_arg).is_some())
     {
         // fn([..]) -> Result<Self, E> OR Wrapped<Foo, Self>
         CompletionRelevanceReturnType::Constructor
-    } else if func_return_type
+    } else if ret_type
         .as_adt()
         .and_then(|adt| adt.name(db).as_str().map(|name| name.ends_with("Builder")))
         .unwrap_or(false)
@@ -196,9 +195,7 @@ fn compute_function_match(
         CompletionRelevanceReturnType::Builder
     } else {
         CompletionRelevanceReturnType::Other
-    };
-
-    Some(CompletionRelevanceFn { return_type, has_args, has_self_arg })
+    }
 }
 
 pub(super) fn add_call_parens<'b>(