]> git.lizzy.rs Git - rust.git/commitdiff
add: Adding self keyword completion in complete_fn_param
authorvi_mi <fenil.jain2018@vitstudent.ac.in>
Sat, 10 Jul 2021 09:42:16 +0000 (15:12 +0530)
committervi_mi <fenil.jain2018@vitstudent.ac.in>
Sat, 10 Jul 2021 10:41:15 +0000 (16:11 +0530)
crates/ide_completion/src/completions/fn_param.rs

index c9f0e2473afeea69365e11883036074599d586ff..7805da24abd6681ec834f8b1510582ea622514a6 100644 (file)
@@ -12,9 +12,9 @@
 /// functions in a file have a `spam: &mut Spam` parameter, a completion with
 /// `spam: &mut Spam` insert text/label and `spam` lookup string will be
 /// suggested.
-pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext) {
+pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
     if !ctx.is_param {
-        return;
+        return None;
     }
 
     let mut params = FxHashMap::default();
@@ -53,11 +53,27 @@ pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext)
         };
     }
 
-    params.into_iter().for_each(|(label, lookup)| {
-        let mut item = CompletionItem::new(CompletionKind::Magic, ctx.source_range(), label);
-        item.kind(CompletionItemKind::Binding).lookup_by(lookup);
-        item.add_to(acc)
-    });
+    let self_completion_items = ["self", "&self", "mut self", "&mut self"];
+    if ctx.impl_def.is_some() && me?.param_list()?.params().next().is_none() {
+        self_completion_items.iter().for_each(|self_item| {
+            add_new_item_to_acc(ctx, acc, self_item.to_string(), self_item.to_string())
+        });
+    }
+
+    params.into_iter().for_each(|(label, lookup)| add_new_item_to_acc(ctx, acc, label, lookup));
+
+    Some(())
+}
+
+fn add_new_item_to_acc(
+    ctx: &CompletionContext,
+    acc: &mut Completions,
+    label: String,
+    lookup: String,
+) {
+    let mut item = CompletionItem::new(CompletionKind::Magic, ctx.source_range(), label);
+    item.kind(CompletionItemKind::Binding).lookup_by(lookup);
+    item.add_to(acc)
 }
 
 #[cfg(test)]
@@ -143,4 +159,26 @@ fn foo2($0) {}
             "#]],
         )
     }
+
+    #[test]
+    fn test_param_completion_self_param() {
+        check(
+            r#"
+                struct A {}
+
+                impl A {
+                    fn foo(file_id: FileId) {}
+                    fn new($0) {
+                    }
+                }
+            "#,
+            expect![[r#"
+                bn self
+                bn &self
+                bn mut self
+                bn &mut self
+                bn file_id: FileId
+            "#]],
+        )
+    }
 }