Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/fn_param.rs')
-rw-r--r--crates/ide-completion/src/completions/fn_param.rs26
1 files changed, 17 insertions, 9 deletions
diff --git a/crates/ide-completion/src/completions/fn_param.rs b/crates/ide-completion/src/completions/fn_param.rs
index 94e2f489f5..cc6c17450b 100644
--- a/crates/ide-completion/src/completions/fn_param.rs
+++ b/crates/ide-completion/src/completions/fn_param.rs
@@ -5,11 +5,11 @@ use ide_db::FxHashMap;
use syntax::{
algo,
ast::{self, HasModuleItem},
- match_ast, AstNode, Direction, SyntaxKind, TextRange,
+ match_ast, AstNode, Direction, SyntaxKind, TextRange, TextSize,
};
use crate::{
- context::{ParamKind, PatternContext},
+ context::{ParamContext, ParamKind, PatternContext},
CompletionContext, CompletionItem, CompletionItemKind, Completions,
};
@@ -24,7 +24,7 @@ pub(crate) fn complete_fn_param(
ctx: &CompletionContext,
pattern_ctx: &PatternContext,
) -> Option<()> {
- let ((param_list, _, param_kind), impl_) = match pattern_ctx {
+ let (ParamContext { param_list, kind, .. }, impl_) = match pattern_ctx {
PatternContext { param_ctx: Some(kind), impl_, .. } => (kind, impl_),
_ => return None,
};
@@ -43,7 +43,7 @@ pub(crate) fn complete_fn_param(
item.add_to(acc)
};
- match param_kind {
+ match kind {
ParamKind::Function(function) => {
fill_fn_params(ctx, function, param_list, impl_, add_new_item_to_acc);
}
@@ -105,7 +105,7 @@ fn fill_fn_params(
}
remove_duplicated(&mut file_params, param_list.params());
let self_completion_items = ["self", "&self", "mut self", "&mut self"];
- if should_add_self_completions(param_list, impl_) {
+ if should_add_self_completions(ctx.token.text_range().start(), param_list, impl_) {
self_completion_items.into_iter().for_each(|self_item| add_new_item_to_acc(self_item));
}
@@ -156,10 +156,18 @@ fn remove_duplicated(
})
}
-fn should_add_self_completions(param_list: &ast::ParamList, impl_: &Option<ast::Impl>) -> bool {
- let no_params = param_list.params().next().is_none() && param_list.self_param().is_none();
-
- impl_.is_some() && no_params
+fn should_add_self_completions(
+ cursor: TextSize,
+ param_list: &ast::ParamList,
+ impl_: &Option<ast::Impl>,
+) -> bool {
+ if impl_.is_none() || param_list.self_param().is_some() {
+ return false;
+ }
+ match param_list.params().next() {
+ Some(first) => first.pat().map_or(false, |pat| pat.syntax().text_range().contains(cursor)),
+ None => true,
+ }
}
fn comma_wrapper(ctx: &CompletionContext) -> Option<(impl Fn(&str) -> String, TextRange)> {