mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 05:45:12 +00:00
dont complete () if they are already there
This commit is contained in:
parent
f96312b836
commit
faa1d35cbc
4 changed files with 26 additions and 6 deletions
|
@ -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(())
|
||||
|
|
|
@ -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",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue