From 7d2ddfd3c85b9c6505f09497ba94c98e8c78e822 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 4 Mar 2020 13:01:16 +0100 Subject: Skip self param when completing methods --- crates/ra_ide/src/completion/presentation.rs | 58 +++++++++++++++++++++------- 1 file changed, 45 insertions(+), 13 deletions(-) (limited to 'crates') diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index 39d2b1c19..dac232a85 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs @@ -218,18 +218,20 @@ impl Completions { { tested_by!(inserts_parens_for_function_calls); - let (snippet, label) = - if params.is_empty() || has_self_param && params.len() == 1 { - (format!("{}()$0", name), format!("{}()", name)) - } else { - let function_params_snippet = - join(function_signature.parameter_names.iter().enumerate().map( + let (snippet, label) = if params.is_empty() || has_self_param && params.len() == 1 { + (format!("{}()$0", name), format!("{}()", name)) + } else { + let to_skip = if has_self_param { 1 } else { 0 }; + let function_params_snippet = + join( + function_signature.parameter_names.iter().skip(to_skip).enumerate().map( |(index, param_name)| format!("${{{}:{}}}", index + 1, param_name), - )) - .separator(", ") - .to_string(); - (format!("{}({})$0", name, function_params_snippet), format!("{}(…)", name)) - }; + ), + ) + .separator(", ") + .to_string(); + (format!("{}({})$0", name, function_params_snippet), format!("{}(…)", name)) + }; builder = builder.lookup_by(name).label(label).insert_snippet(snippet); } @@ -307,8 +309,8 @@ mod tests { use crate::completion::{do_completion, CompletionItem, CompletionKind}; - fn do_reference_completion(code: &str) -> Vec { - do_completion(code, CompletionKind::Reference) + fn do_reference_completion(ra_fixture: &str) -> Vec { + do_completion(ra_fixture, CompletionKind::Reference) } #[test] @@ -530,6 +532,36 @@ mod tests { ); } + #[test] + fn parens_for_method_call() { + assert_debug_snapshot!( + do_reference_completion( + r" + struct S {} + impl S { + fn foo(&self, x: i32) {} + } + fn bar(s: &S) { + s.f<|> + } + " + ), + @r###" + [ + CompletionItem { + label: "foo(…)", + source_range: [171; 172), + delete: [171; 172), + insert: "foo(${1:x})$0", + kind: Method, + lookup: "foo", + detail: "fn foo(&self, x: i32)", + }, + ] + "### + ) + } + #[test] fn dont_render_function_parens_in_use_item() { assert_debug_snapshot!( -- cgit v1.2.3