Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/item_list.rs')
-rw-r--r--crates/ide-completion/src/completions/item_list.rs53
1 files changed, 30 insertions, 23 deletions
diff --git a/crates/ide-completion/src/completions/item_list.rs b/crates/ide-completion/src/completions/item_list.rs
index 0b95d7a3e4..e613f2d25b 100644
--- a/crates/ide-completion/src/completions/item_list.rs
+++ b/crates/ide-completion/src/completions/item_list.rs
@@ -2,43 +2,50 @@
use crate::{
completions::module_or_fn_macro,
- context::{ItemListKind, PathCompletionCtx, PathKind, Qualified},
+ context::{ItemListKind, NameRefContext, NameRefKind, PathCompletionCtx, PathKind, Qualified},
CompletionContext, Completions,
};
-mod trait_impl;
+pub(crate) mod trait_impl;
-pub(crate) fn complete_item_list(acc: &mut Completions, ctx: &CompletionContext) {
+pub(crate) fn complete_item_list(
+ acc: &mut Completions,
+ ctx: &CompletionContext,
+ name_ref_ctx: &NameRefContext,
+) {
let _p = profile::span("complete_item_list");
- if let Some(_) = ctx.name_ctx() {
- trait_impl::complete_trait_impl(acc, ctx);
- return;
- }
-
- let (qualified, kind, is_trivial_path) = match ctx.path_context() {
- Some(ctx @ PathCompletionCtx { kind: PathKind::Item { kind }, qualified, .. }) => {
- (qualified, Some(kind), ctx.is_trivial_path())
- }
- Some(
- ctx @ PathCompletionCtx {
- kind: PathKind::Expr { in_block_expr: true, .. },
- qualified,
- ..
- },
- ) => (qualified, None, ctx.is_trivial_path()),
+ let (qualified, item_list_kind, is_trivial_path) = match name_ref_ctx {
+ NameRefContext {
+ kind:
+ Some(NameRefKind::Path(
+ ctx @ PathCompletionCtx { kind: PathKind::Item { kind }, qualified, .. },
+ )),
+ ..
+ } => (qualified, Some(kind), ctx.is_trivial_path()),
+ NameRefContext {
+ kind:
+ Some(NameRefKind::Path(
+ ctx @ PathCompletionCtx {
+ kind: PathKind::Expr { in_block_expr: true, .. },
+ qualified,
+ ..
+ },
+ )),
+ ..
+ } => (qualified, None, ctx.is_trivial_path()),
_ => return,
};
- if matches!(kind, Some(ItemListKind::TraitImpl)) {
- trait_impl::complete_trait_impl(acc, ctx);
+ if matches!(item_list_kind, Some(ItemListKind::TraitImpl)) {
+ trait_impl::complete_trait_impl_name_ref(acc, ctx, name_ref_ctx);
}
if is_trivial_path {
- add_keywords(acc, ctx, kind);
+ add_keywords(acc, ctx, item_list_kind);
}
- if kind.is_none() {
+ if item_list_kind.is_none() {
// this is already handled by expression
return;
}