From faa1d35cbc29be23667319628e4034348ea50fe9 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 10 Jan 2019 21:38:04 +0300 Subject: dont complete () if they are already there --- crates/ra_ide_api/src/completion/complete_dot.rs | 2 +- crates/ra_ide_api/src/completion/complete_path.rs | 14 ++++++++++++++ crates/ra_ide_api/src/completion/completion_context.rs | 14 ++++++++++---- crates/ra_ide_api/src/completion/completion_item.rs | 2 +- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/crates/ra_ide_api/src/completion/complete_dot.rs b/crates/ra_ide_api/src/completion/complete_dot.rs index 65bba6dc7..80d0b1663 100644 --- a/crates/ra_ide_api/src/completion/complete_dot.rs +++ b/crates/ra_ide_api/src/completion/complete_dot.rs @@ -16,7 +16,7 @@ pub(super) fn complete_dot(acc: &mut Completions, ctx: &CompletionContext) -> Ca None => return Ok(()), }; let receiver_ty = infer_result[expr].clone(); - if !ctx.is_method_call { + if !ctx.is_call { complete_fields(acc, ctx, receiver_ty)?; } Ok(()) diff --git a/crates/ra_ide_api/src/completion/complete_path.rs b/crates/ra_ide_api/src/completion/complete_path.rs index 4723a65a6..2494d28ed 100644 --- a/crates/ra_ide_api/src/completion/complete_path.rs +++ b/crates/ra_ide_api/src/completion/complete_path.rs @@ -125,4 +125,18 @@ mod tests { "foo", ) } + + #[test] + fn dont_render_function_parens_if_already_call() { + check_reference_completion( + " + //- /lib.rs + fn frobnicate() {} + fn main() { + frob<|>(); + } + ", + "main;frobnicate", + ) + } } diff --git a/crates/ra_ide_api/src/completion/completion_context.rs b/crates/ra_ide_api/src/completion/completion_context.rs index 01786bb69..113f6c070 100644 --- a/crates/ra_ide_api/src/completion/completion_context.rs +++ b/crates/ra_ide_api/src/completion/completion_context.rs @@ -32,8 +32,8 @@ pub(super) struct CompletionContext<'a> { pub(super) is_new_item: bool, /// The receiver if this is a field or method access, i.e. writing something.<|> pub(super) dot_receiver: Option<&'a ast::Expr>, - /// If this is a method call in particular, i.e. the () are already there. - pub(super) is_method_call: bool, + /// If this is a call (method or function) in particular, i.e. the () are already there. + pub(super) is_call: bool, } impl<'a> CompletionContext<'a> { @@ -60,7 +60,7 @@ impl<'a> CompletionContext<'a> { can_be_stmt: false, is_new_item: false, dot_receiver: None, - is_method_call: false, + is_call: false, }; ctx.fill(original_file, position.offset); Ok(Some(ctx)) @@ -172,6 +172,12 @@ impl<'a> CompletionContext<'a> { } } } + self.is_call = path + .syntax() + .parent() + .and_then(ast::PathExpr::cast) + .and_then(|it| it.syntax().parent().and_then(ast::CallExpr::cast)) + .is_some() } if let Some(field_expr) = ast::FieldExpr::cast(parent) { // The receiver comes before the point of insertion of the fake @@ -187,7 +193,7 @@ impl<'a> CompletionContext<'a> { .expr() .map(|e| e.syntax().range()) .and_then(|r| find_node_with_range(original_file.syntax(), r)); - self.is_method_call = true; + self.is_call = true; } } } diff --git a/crates/ra_ide_api/src/completion/completion_item.rs b/crates/ra_ide_api/src/completion/completion_item.rs index 334449fae..6a9770429 100644 --- a/crates/ra_ide_api/src/completion/completion_item.rs +++ b/crates/ra_ide_api/src/completion/completion_item.rs @@ -165,7 +165,7 @@ impl Builder { fn from_function(mut self, ctx: &CompletionContext, function: hir::Function) -> Builder { // If not an import, add parenthesis automatically. - if ctx.use_item_syntax.is_none() { + if ctx.use_item_syntax.is_none() && !ctx.is_call { if function.signature(ctx.db).args().is_empty() { self.snippet = Some(format!("{}()$0", self.label)); } else { -- cgit v1.2.3