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.rs | 69 |
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 { .. } => {} } } |