aboutsummaryrefslogtreecommitdiff
path: root/crates/completion/src/render/function.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/completion/src/render/function.rs')
-rw-r--r--crates/completion/src/render/function.rs53
1 files changed, 42 insertions, 11 deletions
diff --git a/crates/completion/src/render/function.rs b/crates/completion/src/render/function.rs
index 09d9f85bc..00e3eb203 100644
--- a/crates/completion/src/render/function.rs
+++ b/crates/completion/src/render/function.rs
@@ -2,6 +2,7 @@
2 2
3use hir::{HasSource, Type}; 3use hir::{HasSource, Type};
4use syntax::{ast::Fn, display::function_declaration}; 4use syntax::{ast::Fn, display::function_declaration};
5use test_utils::mark;
5 6
6use crate::{ 7use crate::{
7 item::{CompletionItem, CompletionItemKind, CompletionKind, ImportToAdd}, 8 item::{CompletionItem, CompletionItemKind, CompletionKind, ImportToAdd},
@@ -67,24 +68,32 @@ impl<'a> FunctionRender<'a> {
67 } 68 }
68 69
69 fn params(&self) -> Params { 70 fn params(&self) -> Params {
71 let ast_params = match self.ast_node.param_list() {
72 Some(it) => it,
73 None => return Params::Named(Vec::new()),
74 };
75
76 let mut params_pats = Vec::new();
70 let params_ty = if self.ctx.completion.dot_receiver.is_some() { 77 let params_ty = if self.ctx.completion.dot_receiver.is_some() {
71 self.func.method_params(self.ctx.db()).unwrap_or_default() 78 self.func.method_params(self.ctx.db()).unwrap_or_default()
72 } else { 79 } else {
80 if let Some(s) = ast_params.self_param() {
81 mark::hit!(parens_for_method_call_as_assoc_fn);
82 params_pats.push(Some(s.to_string()));
83 }
73 self.func.assoc_fn_params(self.ctx.db()) 84 self.func.assoc_fn_params(self.ctx.db())
74 }; 85 };
75 let params = self 86 params_pats
76 .ast_node 87 .extend(ast_params.params().into_iter().map(|it| it.pat().map(|it| it.to_string())));
77 .param_list() 88
89 let params = params_pats
78 .into_iter() 90 .into_iter()
79 .flat_map(|it| it.params())
80 .zip(params_ty) 91 .zip(params_ty)
81 .flat_map(|(it, param_ty)| { 92 .flat_map(|(pat, param_ty)| {
82 if let Some(pat) = it.pat() { 93 let pat = pat?;
83 let name = pat.to_string(); 94 let name = pat.to_string();
84 let arg = name.trim_start_matches("mut ").trim_start_matches('_'); 95 let arg = name.trim_start_matches("mut ").trim_start_matches('_');
85 return Some(self.add_arg(arg, param_ty.ty())); 96 Some(self.add_arg(arg, param_ty.ty()))
86 }
87 None
88 }) 97 })
89 .collect(); 98 .collect();
90 Params::Named(params) 99 Params::Named(params)
@@ -177,6 +186,28 @@ fn bar(s: &S) {
177 } 186 }
178 187
179 #[test] 188 #[test]
189 fn parens_for_method_call_as_assoc_fn() {
190 mark::check!(parens_for_method_call_as_assoc_fn);
191 check_edit(
192 "foo",
193 r#"
194struct S;
195impl S {
196 fn foo(&self) {}
197}
198fn main() { S::f<|> }
199"#,
200 r#"
201struct S;
202impl S {
203 fn foo(&self) {}
204}
205fn main() { S::foo(${1:&self})$0 }
206"#,
207 );
208 }
209
210 #[test]
180 fn suppress_arg_snippets() { 211 fn suppress_arg_snippets() {
181 mark::check!(suppress_arg_snippets); 212 mark::check!(suppress_arg_snippets);
182 check_edit_with_config( 213 check_edit_with_config(