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.rs69
1 files changed, 39 insertions, 30 deletions
diff --git a/crates/ide-completion/src/completions/item_list.rs b/crates/ide-completion/src/completions/item_list.rs
index 2e03935086..e613f2d25b 100644
--- a/crates/ide-completion/src/completions/item_list.rs
+++ b/crates/ide-completion/src/completions/item_list.rs
@@ -2,54 +2,63 @@
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;
}
match qualified {
- Qualified::With { resolution, is_super_chain, .. } => {
- if let Some(hir::PathResolution::Def(hir::ModuleDef::Module(module))) = resolution {
- for (name, def) in module.scope(ctx.db, Some(ctx.module)) {
- if let Some(def) = module_or_fn_macro(ctx.db, def) {
- acc.add_resolution(ctx, name, def);
- }
+ Qualified::With {
+ resolution: Some(hir::PathResolution::Def(hir::ModuleDef::Module(module))),
+ is_super_chain,
+ ..
+ } => {
+ for (name, def) in module.scope(ctx.db, Some(ctx.module)) {
+ if let Some(def) = module_or_fn_macro(ctx.db, def) {
+ acc.add_resolution(ctx, name, def);
}
}
@@ -66,7 +75,7 @@ pub(crate) fn complete_item_list(acc: &mut Completions, ctx: &CompletionContext)
});
acc.add_nameref_keywords_with_colon(ctx);
}
- Qualified::Infer | Qualified::No => {}
+ Qualified::Infer | Qualified::No | Qualified::With { .. } => {}
}
}