Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions.rs')
-rw-r--r--crates/ide-completion/src/completions.rs37
1 files changed, 26 insertions, 11 deletions
diff --git a/crates/ide-completion/src/completions.rs b/crates/ide-completion/src/completions.rs
index 65072d936f..abae3cb368 100644
--- a/crates/ide-completion/src/completions.rs
+++ b/crates/ide-completion/src/completions.rs
@@ -16,6 +16,7 @@ pub(crate) mod lifetime;
pub(crate) mod mod_;
pub(crate) mod pattern;
pub(crate) mod postfix;
+pub(crate) mod ra_fixture;
pub(crate) mod record;
pub(crate) mod snippet;
pub(crate) mod r#type;
@@ -74,6 +75,10 @@ impl Completions {
self.buf.push(item)
}
+ fn add_many(&mut self, items: impl IntoIterator<Item = CompletionItem>) {
+ self.buf.extend(items)
+ }
+
fn add_opt(&mut self, item: Option<CompletionItem>) {
if let Some(item) = item {
self.buf.push(item)
@@ -106,15 +111,23 @@ impl Completions {
}
}
+ pub(crate) fn add_type_keywords(&mut self, ctx: &CompletionContext<'_>) {
+ self.add_keyword_snippet(ctx, "fn", "fn($1)");
+ self.add_keyword_snippet(ctx, "dyn", "dyn $0");
+ self.add_keyword_snippet(ctx, "impl", "impl $0");
+ self.add_keyword_snippet(ctx, "for", "for<$1>");
+ }
+
pub(crate) fn add_super_keyword(
&mut self,
ctx: &CompletionContext<'_>,
super_chain_len: Option<usize>,
) {
- if let Some(len) = super_chain_len {
- if len > 0 && len < ctx.depth_from_crate_root {
- self.add_keyword(ctx, "super::");
- }
+ if let Some(len) = super_chain_len
+ && len > 0
+ && len < ctx.depth_from_crate_root
+ {
+ self.add_keyword(ctx, "super::");
}
}
@@ -629,7 +642,7 @@ fn enum_variants_with_paths(
acc: &mut Completions,
ctx: &CompletionContext<'_>,
enum_: hir::Enum,
- impl_: &Option<ast::Impl>,
+ impl_: Option<&ast::Impl>,
cb: impl Fn(&mut Completions, &CompletionContext<'_>, hir::Variant, hir::ModPath),
) {
let mut process_variant = |variant: Variant| {
@@ -643,17 +656,17 @@ fn enum_variants_with_paths(
let variants = enum_.variants(ctx.db);
- if let Some(impl_) = impl_.as_ref().and_then(|impl_| ctx.sema.to_def(impl_)) {
- if impl_.self_ty(ctx.db).as_adt() == Some(hir::Adt::Enum(enum_)) {
- variants.iter().for_each(|variant| process_variant(*variant));
- }
+ if let Some(impl_) = impl_.and_then(|impl_| ctx.sema.to_def(impl_))
+ && impl_.self_ty(ctx.db).as_adt() == Some(hir::Adt::Enum(enum_))
+ {
+ variants.iter().for_each(|variant| process_variant(*variant));
}
for variant in variants {
if let Some(path) = ctx.module.find_path(
ctx.db,
hir::ModuleDef::from(variant),
- ctx.config.import_path_config(ctx.is_nightly),
+ ctx.config.find_path_config(ctx.is_nightly),
) {
// Variants with trivial paths are already added by the existing completion logic,
// so we should avoid adding these twice
@@ -690,6 +703,9 @@ pub(super) fn complete_name(
NameKind::RecordField => {
field::complete_field_list_record_variant(acc, ctx);
}
+ NameKind::TypeParam => {
+ acc.add_keyword_snippet(ctx, "const", "const $1: $0");
+ }
NameKind::ConstParam
| NameKind::Enum
| NameKind::MacroDef
@@ -699,7 +715,6 @@ pub(super) fn complete_name(
| NameKind::Static
| NameKind::Struct
| NameKind::Trait
- | NameKind::TypeParam
| NameKind::Union
| NameKind::Variant => (),
}