From e18f00882dd75cd5d9e89fc76e1cf67bbeaf36c5 Mon Sep 17 00:00:00 2001 From: vain0x Date: Sat, 9 May 2020 16:14:33 +0900 Subject: Add call postfix completion To make it easier to wrap an expression with Ok/Some/Rc::new etc. --- crates/ra_ide/src/completion/complete_postfix.rs | 59 ++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_postfix.rs b/crates/ra_ide/src/completion/complete_postfix.rs index f2a52a407..02e660ca8 100644 --- a/crates/ra_ide/src/completion/complete_postfix.rs +++ b/crates/ra_ide/src/completion/complete_postfix.rs @@ -184,6 +184,16 @@ pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { &format!("dbg!({})", receiver_text), ) .add_to(acc); + + postfix_snippet( + ctx, + cap, + &dot_receiver, + "call", + "function(expr)", + &format!("${{1}}({})", receiver_text), + ) + .add_to(acc); } fn get_receiver_text(receiver: &ast::Expr, receiver_is_ambiguous_float_literal: bool) -> String { @@ -255,6 +265,13 @@ mod tests { insert: "Box::new(bar)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 89..89, + delete: 85..89, + insert: "${1}(bar)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 89..89, @@ -334,6 +351,13 @@ mod tests { insert: "Box::new(bar)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 210..210, + delete: 206..210, + insert: "${1}(bar)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 210..210, @@ -413,6 +437,13 @@ mod tests { insert: "Box::new(bar)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 211..211, + delete: 207..211, + insert: "${1}(bar)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 211..211, @@ -487,6 +518,13 @@ mod tests { insert: "Box::new(bar)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 91..91, + delete: 87..91, + insert: "${1}(bar)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 91..91, @@ -546,6 +584,13 @@ mod tests { insert: "Box::new(42)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 52..52, + delete: 49..52, + insert: "${1}(42)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 52..52, @@ -607,6 +652,13 @@ mod tests { insert: "Box::new(bar)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 149..150, + delete: 145..150, + insert: "${1}(bar)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 149..150, @@ -666,6 +718,13 @@ mod tests { insert: "Box::new(&&&&42)", detail: "Box::new(expr)", }, + CompletionItem { + label: "call", + source_range: 56..56, + delete: 49..56, + insert: "${1}(&&&&42)", + detail: "function(expr)", + }, CompletionItem { label: "dbg", source_range: 56..56, -- cgit v1.2.3 From 0e814a3b5f5c7d034b0249cfb4391d9fcb9d8e42 Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Sun, 24 May 2020 16:47:35 +0200 Subject: fix textedit range returned for completion when left token is a keyword #4545 Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- .../src/completion/complete_unqualified_path.rs | 35 ++++++++++++++++++++++ crates/ra_ide/src/completion/completion_context.rs | 11 ++++++- 2 files changed, 45 insertions(+), 1 deletion(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_unqualified_path.rs b/crates/ra_ide/src/completion/complete_unqualified_path.rs index db791660a..417a92001 100644 --- a/crates/ra_ide/src/completion/complete_unqualified_path.rs +++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs @@ -297,6 +297,41 @@ mod tests { ); } + #[test] + fn completes_bindings_from_for_with_in_prefix() { + assert_debug_snapshot!( + do_reference_completion( + r" + fn test() { + for index in &[1, 2, 3] { + let t = in<|> + } + } + " + ), + @r###" + [ + CompletionItem { + label: "index", + source_range: 107..107, + delete: 107..107, + insert: "index", + kind: Binding, + }, + CompletionItem { + label: "test()", + source_range: 107..107, + delete: 107..107, + insert: "test()$0", + kind: Function, + lookup: "test", + detail: "fn test()", + }, + ] + "### + ); + } + #[test] fn completes_generic_params() { assert_debug_snapshot!( diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index da336973c..e8bf07d6e 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs @@ -169,7 +169,16 @@ impl<'a> CompletionContext<'a> { match self.token.kind() { // workaroud when completion is triggered by trigger characters. IDENT => self.original_token.text_range(), - _ => TextRange::empty(self.offset), + _ => { + // If we haven't characters between keyword and our cursor we take the keyword start range to edit + if self.token.kind().is_keyword() + && self.offset == self.original_token.text_range().end() + { + TextRange::empty(self.original_token.text_range().start()) + } else { + TextRange::empty(self.offset) + } + } } } -- cgit v1.2.3 From 4d13691ad192c20b2fb0f349582622cb5230da99 Mon Sep 17 00:00:00 2001 From: Yuki Kodama Date: Sun, 24 May 2020 22:39:09 +0900 Subject: Reflect test case --- crates/ra_ide/src/completion/presentation.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index 440ffa31d..6b29f58d5 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs @@ -641,7 +641,7 @@ mod tests { assert_debug_snapshot!( do_reference_completion( r" - fn with_args(x: i32, y: String) {} + fn with_args(x: i32, y: String, _z: bool) {} fn main() { with_<|> } " ), @@ -649,8 +649,8 @@ mod tests { [ CompletionItem { label: "main()", - source_range: 80..85, - delete: 80..85, + source_range: 90..95, + delete: 90..95, insert: "main()$0", kind: Function, lookup: "main", @@ -658,12 +658,12 @@ mod tests { }, CompletionItem { label: "with_args(…)", - source_range: 80..85, - delete: 80..85, - insert: "with_args(${1:x}, ${2:y})$0", + source_range: 90..95, + delete: 90..95, + insert: "with_args(${1:x}, ${2:y}, ${3:z})$0", kind: Function, lookup: "with_args", - detail: "fn with_args(x: i32, y: String)", + detail: "fn with_args(x: i32, y: String, _z: bool)", trigger_call_info: true, }, ] -- cgit v1.2.3 From 378bfc3c8f1c63f44f972e11c9de00f9733b13c0 Mon Sep 17 00:00:00 2001 From: Yuki Kodama Date: Sun, 24 May 2020 23:01:26 +0900 Subject: Separate assertions --- crates/ra_ide/src/completion/presentation.rs | 72 +++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 7 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index 6b29f58d5..5708ff291 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs @@ -641,7 +641,7 @@ mod tests { assert_debug_snapshot!( do_reference_completion( r" - fn with_args(x: i32, y: String, _z: bool) {} + fn with_args(x: i32, y: String) {} fn main() { with_<|> } " ), @@ -649,8 +649,8 @@ mod tests { [ CompletionItem { label: "main()", - source_range: 90..95, - delete: 90..95, + source_range: 80..85, + delete: 80..85, insert: "main()$0", kind: Function, lookup: "main", @@ -658,12 +658,43 @@ mod tests { }, CompletionItem { label: "with_args(…)", - source_range: 90..95, - delete: 90..95, - insert: "with_args(${1:x}, ${2:y}, ${3:z})$0", + source_range: 80..85, + delete: 80..85, + insert: "with_args(${1:x}, ${2:y})$0", kind: Function, lookup: "with_args", - detail: "fn with_args(x: i32, y: String, _z: bool)", + detail: "fn with_args(x: i32, y: String)", + trigger_call_info: true, + }, + ] + "### + ); + assert_debug_snapshot!( + do_reference_completion( + r" + fn with_ignored_args(_foo: i32, b_a_r_: bool) {} + fn main() { with_<|> } + " + ), + @r###" + [ + CompletionItem { + label: "main()", + source_range: 94..99, + delete: 94..99, + insert: "main()$0", + kind: Function, + lookup: "main", + detail: "fn main()", + }, + CompletionItem { + label: "with_ignored_args(…)", + source_range: 94..99, + delete: 94..99, + insert: "with_ignored_args(${1:foo}, ${2:b_a_r_})$0", + kind: Function, + lookup: "with_ignored_args", + detail: "fn with_ignored_args(_foo: i32, b_a_r_: bool)", trigger_call_info: true, }, ] @@ -695,6 +726,33 @@ mod tests { ] "### ); + assert_debug_snapshot!( + do_reference_completion( + r" + struct S {} + impl S { + fn foo_ignored_args(&self, _a: bool, b: i32) {} + } + fn bar(s: &S) { + s.f<|> + } + " + ), + @r###" + [ + CompletionItem { + label: "foo_ignored_args(…)", + source_range: 194..195, + delete: 194..195, + insert: "foo_ignored_args(${1:a}, ${2:b})$0", + kind: Method, + lookup: "foo_ignored_args", + detail: "fn foo_ignored_args(&self, _a: bool, b: i32)", + trigger_call_info: true, + }, + ] + "### + ); } #[test] -- cgit v1.2.3 From 41d0f7f24ef924440ee710e134c01d6e47056c3f Mon Sep 17 00:00:00 2001 From: Yuki Kodama Date: Mon, 25 May 2020 00:14:56 +0900 Subject: Fix test to consider multiple underscores --- crates/ra_ide/src/completion/presentation.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index 5708ff291..e59f730ff 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs @@ -672,7 +672,7 @@ mod tests { assert_debug_snapshot!( do_reference_completion( r" - fn with_ignored_args(_foo: i32, b_a_r_: bool) {} + fn with_ignored_args(_foo: i32, ___bar: bool, ho_ge_: String) {} fn main() { with_<|> } " ), @@ -680,8 +680,8 @@ mod tests { [ CompletionItem { label: "main()", - source_range: 94..99, - delete: 94..99, + source_range: 110..115, + delete: 110..115, insert: "main()$0", kind: Function, lookup: "main", @@ -689,12 +689,12 @@ mod tests { }, CompletionItem { label: "with_ignored_args(…)", - source_range: 94..99, - delete: 94..99, - insert: "with_ignored_args(${1:foo}, ${2:b_a_r_})$0", + source_range: 110..115, + delete: 110..115, + insert: "with_ignored_args(${1:foo}, ${2:bar}, ${3:ho_ge_})$0", kind: Function, lookup: "with_ignored_args", - detail: "fn with_ignored_args(_foo: i32, b_a_r_: bool)", + detail: "fn with_ignored_args(_foo: i32, ___bar: bool, ho_ge_: String)", trigger_call_info: true, }, ] -- cgit v1.2.3 From fd83f469e9643c7a9da2d9e4c796bd89c441458d Mon Sep 17 00:00:00 2001 From: Yuki Kodama Date: Tue, 26 May 2020 01:05:50 +0900 Subject: Trim at presentation layer --- crates/ra_ide/src/completion/presentation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/presentation.rs b/crates/ra_ide/src/completion/presentation.rs index e59f730ff..61565c84f 100644 --- a/crates/ra_ide/src/completion/presentation.rs +++ b/crates/ra_ide/src/completion/presentation.rs @@ -211,7 +211,7 @@ impl Completions { .parameter_names .iter() .skip(if function_signature.has_self_param { 1 } else { 0 }) - .cloned() + .map(|name| name.trim_start_matches('_').into()) .collect(); builder = builder.add_call_parens(ctx, name, Params::Named(params)); -- cgit v1.2.3 From bee4f8f9fee56bb00b462cdf4ad3ed317fed682f Mon Sep 17 00:00:00 2001 From: kjeremy Date: Tue, 26 May 2020 14:12:13 -0400 Subject: Pass trivially copy types as copy --- .../ra_ide/src/completion/complete_trait_impl.rs | 61 ++++++++++------------ 1 file changed, 29 insertions(+), 32 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_trait_impl.rs b/crates/ra_ide/src/completion/complete_trait_impl.rs index 039df03e0..21c9316e6 100644 --- a/crates/ra_ide/src/completion/complete_trait_impl.rs +++ b/crates/ra_ide/src/completion/complete_trait_impl.rs @@ -49,56 +49,53 @@ use crate::{ pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext) { if let Some((trigger, impl_def)) = completion_match(ctx) { match trigger.kind() { - SyntaxKind::NAME_REF => { - get_missing_assoc_items(&ctx.sema, &impl_def).iter().for_each(|item| match item { + SyntaxKind::NAME_REF => get_missing_assoc_items(&ctx.sema, &impl_def) + .into_iter() + .for_each(|item| match item { hir::AssocItem::Function(fn_item) => { - add_function_impl(&trigger, acc, ctx, &fn_item) + add_function_impl(&trigger, acc, ctx, fn_item) } hir::AssocItem::TypeAlias(type_item) => { - add_type_alias_impl(&trigger, acc, ctx, &type_item) + add_type_alias_impl(&trigger, acc, ctx, type_item) } hir::AssocItem::Const(const_item) => { - add_const_impl(&trigger, acc, ctx, &const_item) + add_const_impl(&trigger, acc, ctx, const_item) } - }) - } + }), SyntaxKind::FN_DEF => { - for missing_fn in - get_missing_assoc_items(&ctx.sema, &impl_def).iter().filter_map(|item| { - match item { - hir::AssocItem::Function(fn_item) => Some(fn_item), - _ => None, - } + for missing_fn in get_missing_assoc_items(&ctx.sema, &impl_def) + .into_iter() + .filter_map(|item| match item { + hir::AssocItem::Function(fn_item) => Some(fn_item), + _ => None, }) { - add_function_impl(&trigger, acc, ctx, &missing_fn); + add_function_impl(&trigger, acc, ctx, missing_fn); } } SyntaxKind::TYPE_ALIAS_DEF => { - for missing_fn in - get_missing_assoc_items(&ctx.sema, &impl_def).iter().filter_map(|item| { - match item { - hir::AssocItem::TypeAlias(type_item) => Some(type_item), - _ => None, - } + for missing_fn in get_missing_assoc_items(&ctx.sema, &impl_def) + .into_iter() + .filter_map(|item| match item { + hir::AssocItem::TypeAlias(type_item) => Some(type_item), + _ => None, }) { - add_type_alias_impl(&trigger, acc, ctx, &missing_fn); + add_type_alias_impl(&trigger, acc, ctx, missing_fn); } } SyntaxKind::CONST_DEF => { - for missing_fn in - get_missing_assoc_items(&ctx.sema, &impl_def).iter().filter_map(|item| { - match item { - hir::AssocItem::Const(const_item) => Some(const_item), - _ => None, - } + for missing_fn in get_missing_assoc_items(&ctx.sema, &impl_def) + .into_iter() + .filter_map(|item| match item { + hir::AssocItem::Const(const_item) => Some(const_item), + _ => None, }) { - add_const_impl(&trigger, acc, ctx, &missing_fn); + add_const_impl(&trigger, acc, ctx, missing_fn); } } @@ -126,9 +123,9 @@ fn add_function_impl( fn_def_node: &SyntaxNode, acc: &mut Completions, ctx: &CompletionContext, - func: &hir::Function, + func: hir::Function, ) { - let signature = FunctionSignature::from_hir(ctx.db, *func); + let signature = FunctionSignature::from_hir(ctx.db, func); let fn_name = func.name(ctx.db).to_string(); @@ -167,7 +164,7 @@ fn add_type_alias_impl( type_def_node: &SyntaxNode, acc: &mut Completions, ctx: &CompletionContext, - type_alias: &hir::TypeAlias, + type_alias: hir::TypeAlias, ) { let alias_name = type_alias.name(ctx.db).to_string(); @@ -187,7 +184,7 @@ fn add_const_impl( const_def_node: &SyntaxNode, acc: &mut Completions, ctx: &CompletionContext, - const_: &hir::Const, + const_: hir::Const, ) { let const_name = const_.name(ctx.db).map(|n| n.to_string()); -- cgit v1.2.3 From 36f97d39a461ae52489428867704590b78cd3257 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 26 May 2020 18:45:14 -0400 Subject: Fix the `should_panic` snippet Closes #4628 --- crates/ra_ide/src/completion/complete_attribute.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_attribute.rs b/crates/ra_ide/src/completion/complete_attribute.rs index f17266221..fb3f0b743 100644 --- a/crates/ra_ide/src/completion/complete_attribute.rs +++ b/crates/ra_ide/src/completion/complete_attribute.rs @@ -112,7 +112,7 @@ const ATTRIBUTES: &[AttrCompletion] = &[ AttrCompletion { label: "repr", snippet: Some("repr(${0:C})"), should_be_inner: false }, AttrCompletion { label: "should_panic", - snippet: Some(r#"expected = "${0:reason}""#), + snippet: Some(r#"should_panic(expected = "${0:reason}")"#), should_be_inner: false, }, AttrCompletion { @@ -571,7 +571,7 @@ mod tests { label: "should_panic", source_range: 19..19, delete: 19..19, - insert: "expected = \"${0:reason}\"", + insert: "should_panic(expected = \"${0:reason}\")", kind: Attribute, }, CompletionItem { @@ -810,7 +810,7 @@ mod tests { label: "should_panic", source_range: 20..20, delete: 20..20, - insert: "expected = \"${0:reason}\"", + insert: "should_panic(expected = \"${0:reason}\")", kind: Attribute, }, CompletionItem { -- cgit v1.2.3 From 846cefa4917dc68a85b7b307be5d1890b83e1e2d Mon Sep 17 00:00:00 2001 From: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> Date: Wed, 27 May 2020 15:15:19 +0200 Subject: fix textedit range returned for completion when left token is a keyword Signed-off-by: Benjamin Coenen <5719034+bnjjj@users.noreply.github.com> --- crates/ra_ide/src/completion/complete_unqualified_path.rs | 1 + crates/ra_ide/src/completion/completion_context.rs | 2 ++ 2 files changed, 3 insertions(+) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_unqualified_path.rs b/crates/ra_ide/src/completion/complete_unqualified_path.rs index 417a92001..68032c37e 100644 --- a/crates/ra_ide/src/completion/complete_unqualified_path.rs +++ b/crates/ra_ide/src/completion/complete_unqualified_path.rs @@ -299,6 +299,7 @@ mod tests { #[test] fn completes_bindings_from_for_with_in_prefix() { + mark::check!(completes_bindings_from_for_with_in_prefix); assert_debug_snapshot!( do_reference_completion( r" diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index e8bf07d6e..c4646b727 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs @@ -12,6 +12,7 @@ use ra_syntax::{ use ra_text_edit::Indel; use crate::{call_info::ActiveParameter, completion::CompletionConfig, FilePosition}; +use test_utils::mark; /// `CompletionContext` is created early during completion to figure out, where /// exactly is the cursor, syntax-wise. @@ -174,6 +175,7 @@ impl<'a> CompletionContext<'a> { if self.token.kind().is_keyword() && self.offset == self.original_token.text_range().end() { + mark::hit!(completes_bindings_from_for_with_in_prefix); TextRange::empty(self.original_token.text_range().start()) } else { TextRange::empty(self.offset) -- cgit v1.2.3 From 1c6a2eb14a84c3a66972d1a6da429cca1aa8b40a Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 31 May 2020 11:29:19 +0200 Subject: Move the rest of the features to generated docs --- crates/ra_ide/src/completion/complete_postfix.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/ra_ide/src/completion') diff --git a/crates/ra_ide/src/completion/complete_postfix.rs b/crates/ra_ide/src/completion/complete_postfix.rs index 02e660ca8..59b58bf98 100644 --- a/crates/ra_ide/src/completion/complete_postfix.rs +++ b/crates/ra_ide/src/completion/complete_postfix.rs @@ -1,12 +1,11 @@ //! FIXME: write short doc here - +use ra_assists::utils::TryEnum; use ra_syntax::{ ast::{self, AstNode}, TextRange, TextSize, }; use ra_text_edit::TextEdit; -use super::completion_config::SnippetCap; use crate::{ completion::{ completion_context::CompletionContext, @@ -14,7 +13,8 @@ use crate::{ }, CompletionItem, }; -use ra_assists::utils::TryEnum; + +use super::completion_config::SnippetCap; pub(super) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { if !ctx.config.enable_postfix_completions { -- cgit v1.2.3