Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/expr.rs')
-rw-r--r--crates/ide-completion/src/completions/expr.rs59
1 files changed, 39 insertions, 20 deletions
diff --git a/crates/ide-completion/src/completions/expr.rs b/crates/ide-completion/src/completions/expr.rs
index 84ae596a8d..9c003be6af 100644
--- a/crates/ide-completion/src/completions/expr.rs
+++ b/crates/ide-completion/src/completions/expr.rs
@@ -11,7 +11,7 @@ use crate::{
pub(crate) fn complete_expr_path(
acc: &mut Completions,
ctx: &CompletionContext,
- PathCompletionCtx { qualified, .. }: &PathCompletionCtx,
+ path_ctx @ PathCompletionCtx { qualified, .. }: &PathCompletionCtx,
&ExprCtx {
in_block_expr,
in_loop_body,
@@ -34,11 +34,12 @@ pub(crate) fn complete_expr_path(
ref_expr_parent.as_ref().map(|it| it.mut_token().is_none()).unwrap_or(false);
let scope_def_applicable = |def| {
- use hir::{GenericParam::*, ModuleDef::*};
match def {
- ScopeDef::GenericParam(LifetimeParam(_)) | ScopeDef::Label(_) => false,
+ ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) | ScopeDef::Label(_) => {
+ false
+ }
// Don't suggest attribute macros and derives.
- ScopeDef::ModuleDef(Macro(mac)) => mac.is_fn_like(ctx.db),
+ ScopeDef::ModuleDef(hir::ModuleDef::Macro(mac)) => mac.is_fn_like(ctx.db),
_ => true,
}
};
@@ -49,7 +50,7 @@ pub(crate) fn complete_expr_path(
.0
.into_iter()
.flat_map(|it| hir::Trait::from(it).items(ctx.sema.db))
- .for_each(|item| add_assoc_item(acc, ctx, item)),
+ .for_each(|item| add_assoc_item(acc, ctx, path_ctx, item)),
Qualified::With { resolution: None, .. } => {}
Qualified::With { resolution: Some(resolution), .. } => {
// Add associated types on type parameters and `Self`.
@@ -62,7 +63,7 @@ pub(crate) fn complete_expr_path(
let module_scope = module.scope(ctx.db, Some(ctx.module));
for (name, def) in module_scope {
if scope_def_applicable(def) {
- acc.add_resolution(ctx, name, def);
+ acc.add_path_resolution(ctx, path_ctx, name, def);
}
}
}
@@ -73,7 +74,7 @@ pub(crate) fn complete_expr_path(
| hir::ModuleDef::BuiltinType(_)),
) => {
if let &hir::ModuleDef::Adt(hir::Adt::Enum(e)) = def {
- add_enum_variants(acc, ctx, e);
+ add_enum_variants(acc, ctx, path_ctx, e);
}
let ty = match def {
hir::ModuleDef::Adt(adt) => adt.ty(ctx.db),
@@ -81,7 +82,7 @@ pub(crate) fn complete_expr_path(
let ty = a.ty(ctx.db);
if let Some(hir::Adt::Enum(e)) = ty.as_adt() {
cov_mark::hit!(completes_variant_through_alias);
- add_enum_variants(acc, ctx, e);
+ add_enum_variants(acc, ctx, path_ctx, e);
}
ty
}
@@ -102,7 +103,7 @@ pub(crate) fn complete_expr_path(
Some(ctx.module),
None,
|item| {
- add_assoc_item(acc, ctx, item);
+ add_assoc_item(acc, ctx, path_ctx, item);
None::<()>
},
);
@@ -118,7 +119,7 @@ pub(crate) fn complete_expr_path(
hir::PathResolution::Def(hir::ModuleDef::Trait(t)) => {
// Handles `Trait::assoc` as well as `<Ty as Trait>::assoc`.
for item in t.items(ctx.db) {
- add_assoc_item(acc, ctx, item);
+ add_assoc_item(acc, ctx, path_ctx, item);
}
}
hir::PathResolution::TypeParam(_) | hir::PathResolution::SelfType(_) => {
@@ -129,7 +130,7 @@ pub(crate) fn complete_expr_path(
};
if let Some(hir::Adt::Enum(e)) = ty.as_adt() {
- add_enum_variants(acc, ctx, e);
+ add_enum_variants(acc, ctx, path_ctx, e);
}
let mut seen = FxHashSet::default();
ty.iterate_path_candidates(
@@ -142,7 +143,7 @@ pub(crate) fn complete_expr_path(
// We might iterate candidates of a trait multiple times here, so deduplicate
// them.
if seen.insert(item) {
- add_assoc_item(acc, ctx, item);
+ add_assoc_item(acc, ctx, path_ctx, item);
}
None::<()>
},
@@ -167,10 +168,16 @@ pub(crate) fn complete_expr_path(
.find_use_path(ctx.db, hir::ModuleDef::from(strukt))
.filter(|it| it.len() > 1);
- acc.add_struct_literal(ctx, strukt, path, None);
+ acc.add_struct_literal(ctx, path_ctx, strukt, path, None);
if complete_self {
- acc.add_struct_literal(ctx, strukt, None, Some(hir::known::SELF_TYPE));
+ acc.add_struct_literal(
+ ctx,
+ path_ctx,
+ strukt,
+ None,
+ Some(hir::known::SELF_TYPE),
+ );
}
}
hir::Adt::Union(un) => {
@@ -191,7 +198,7 @@ pub(crate) fn complete_expr_path(
e,
impl_,
|acc, ctx, variant, path| {
- acc.add_qualified_enum_variant(ctx, variant, path)
+ acc.add_qualified_enum_variant(ctx, path_ctx, variant, path)
},
);
}
@@ -199,7 +206,7 @@ pub(crate) fn complete_expr_path(
}
ctx.process_all_names(&mut |name, def| {
if scope_def_applicable(def) {
- acc.add_resolution(ctx, name, def);
+ acc.add_path_resolution(ctx, path_ctx, name, def);
}
});
@@ -259,14 +266,26 @@ pub(crate) fn complete_expr_path(
}
}
-fn add_assoc_item(acc: &mut Completions, ctx: &CompletionContext, item: hir::AssocItem) {
+fn add_assoc_item(
+ acc: &mut Completions,
+ ctx: &CompletionContext,
+ path_ctx: &PathCompletionCtx,
+ item: hir::AssocItem,
+) {
match item {
- hir::AssocItem::Function(func) => acc.add_function(ctx, func, None),
+ hir::AssocItem::Function(func) => acc.add_function(ctx, path_ctx, func, None),
hir::AssocItem::Const(ct) => acc.add_const(ctx, ct),
hir::AssocItem::TypeAlias(ty) => acc.add_type_alias(ctx, ty),
}
}
-fn add_enum_variants(acc: &mut Completions, ctx: &CompletionContext, e: hir::Enum) {
- e.variants(ctx.db).into_iter().for_each(|variant| acc.add_enum_variant(ctx, variant, None));
+fn add_enum_variants(
+ acc: &mut Completions,
+ ctx: &CompletionContext,
+ path_ctx: &PathCompletionCtx,
+ e: hir::Enum,
+) {
+ e.variants(ctx.db)
+ .into_iter()
+ .for_each(|variant| acc.add_enum_variant(ctx, path_ctx, variant, None));
}