diff options
Diffstat (limited to 'crates/completion/src/render')
-rw-r--r-- | crates/completion/src/render/builder_ext.rs | 1 | ||||
-rw-r--r-- | crates/completion/src/render/function.rs | 53 |
2 files changed, 43 insertions, 11 deletions
diff --git a/crates/completion/src/render/builder_ext.rs b/crates/completion/src/render/builder_ext.rs index 79599de4b..ce8718bd5 100644 --- a/crates/completion/src/render/builder_ext.rs +++ b/crates/completion/src/render/builder_ext.rs | |||
@@ -5,6 +5,7 @@ use test_utils::mark; | |||
5 | 5 | ||
6 | use crate::{item::Builder, CompletionContext}; | 6 | use crate::{item::Builder, CompletionContext}; |
7 | 7 | ||
8 | #[derive(Debug)] | ||
8 | pub(super) enum Params { | 9 | pub(super) enum Params { |
9 | Named(Vec<String>), | 10 | Named(Vec<String>), |
10 | Anonymous(usize), | 11 | Anonymous(usize), |
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 | ||
3 | use hir::{HasSource, Type}; | 3 | use hir::{HasSource, Type}; |
4 | use syntax::{ast::Fn, display::function_declaration}; | 4 | use syntax::{ast::Fn, display::function_declaration}; |
5 | use test_utils::mark; | ||
5 | 6 | ||
6 | use crate::{ | 7 | use 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#" | ||
194 | struct S; | ||
195 | impl S { | ||
196 | fn foo(&self) {} | ||
197 | } | ||
198 | fn main() { S::f<|> } | ||
199 | "#, | ||
200 | r#" | ||
201 | struct S; | ||
202 | impl S { | ||
203 | fn foo(&self) {} | ||
204 | } | ||
205 | fn 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( |