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.rs117
1 files changed, 70 insertions, 47 deletions
diff --git a/crates/ide_completion/src/completions.rs b/crates/ide_completion/src/completions.rs
index a072d223e0..92074b3e10 100644
--- a/crates/ide_completion/src/completions.rs
+++ b/crates/ide_completion/src/completions.rs
@@ -18,16 +18,16 @@ pub(crate) mod format_string;
use std::iter;
-use hir::known;
+use hir::{known, ScopeDef};
use ide_db::SymbolKind;
use crate::{
+ context::Visible,
item::Builder,
render::{
const_::render_const,
enum_variant::render_variant,
function::{render_fn, render_method},
- macro_::render_macro,
pattern::{render_struct_pat, render_variant_pat},
render_field, render_resolution, render_tuple_field,
struct_literal::render_struct_literal,
@@ -37,6 +37,22 @@ use crate::{
CompletionContext, CompletionItem, CompletionItemKind,
};
+fn module_or_attr(def: ScopeDef) -> Option<ScopeDef> {
+ match def {
+ ScopeDef::MacroDef(mac) if mac.is_attr() => Some(def),
+ ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) => Some(def),
+ _ => None,
+ }
+}
+
+fn module_or_fn_macro(def: ScopeDef) -> Option<ScopeDef> {
+ match def {
+ ScopeDef::MacroDef(mac) if mac.is_fn_like() => Some(def),
+ ScopeDef::ModuleDef(hir::ModuleDef::Module(_)) => Some(def),
+ _ => None,
+ }
+}
+
/// Represents an in-progress set of completions being built.
#[derive(Debug, Default)]
pub struct Completions {
@@ -91,20 +107,7 @@ impl Completions {
cov_mark::hit!(qualified_path_doc_hidden);
return;
}
- self.add(render_resolution(RenderContext::new(ctx), local_name, resolution));
- }
-
- pub(crate) fn add_macro(
- &mut self,
- ctx: &CompletionContext,
- name: Option<hir::Name>,
- macro_: hir::MacroDef,
- ) {
- let name = match name {
- Some(it) => it,
- None => return,
- };
- self.add(render_macro(RenderContext::new(ctx), None, name, macro_));
+ self.add(render_resolution(RenderContext::new(ctx, false), local_name, resolution));
}
pub(crate) fn add_function(
@@ -113,10 +116,12 @@ impl Completions {
func: hir::Function,
local_name: Option<hir::Name>,
) {
- if !ctx.is_visible(&func) {
- return;
- }
- self.add(render_fn(RenderContext::new(ctx), None, local_name, func));
+ let is_private_editable = match ctx.is_visible(&func) {
+ Visible::Yes => false,
+ Visible::Editable => true,
+ Visible::No => return,
+ };
+ self.add(render_fn(RenderContext::new(ctx, is_private_editable), None, local_name, func));
}
pub(crate) fn add_method(
@@ -126,24 +131,36 @@ impl Completions {
receiver: Option<hir::Name>,
local_name: Option<hir::Name>,
) {
- if !ctx.is_visible(&func) {
- return;
- }
- self.add(render_method(RenderContext::new(ctx), None, receiver, local_name, func));
+ let is_private_editable = match ctx.is_visible(&func) {
+ Visible::Yes => false,
+ Visible::Editable => true,
+ Visible::No => return,
+ };
+ self.add(render_method(
+ RenderContext::new(ctx, is_private_editable),
+ None,
+ receiver,
+ local_name,
+ func,
+ ));
}
pub(crate) fn add_const(&mut self, ctx: &CompletionContext, konst: hir::Const) {
- if !ctx.is_visible(&konst) {
- return;
- }
- self.add_opt(render_const(RenderContext::new(ctx), konst));
+ let is_private_editable = match ctx.is_visible(&konst) {
+ Visible::Yes => false,
+ Visible::Editable => true,
+ Visible::No => return,
+ };
+ self.add_opt(render_const(RenderContext::new(ctx, is_private_editable), konst));
}
pub(crate) fn add_type_alias(&mut self, ctx: &CompletionContext, type_alias: hir::TypeAlias) {
- if !ctx.is_visible(&type_alias) {
- return;
- }
- self.add_opt(render_type_alias(RenderContext::new(ctx), type_alias));
+ let is_private_editable = match ctx.is_visible(&type_alias) {
+ Visible::Yes => false,
+ Visible::Editable => true,
+ Visible::No => return,
+ };
+ self.add_opt(render_type_alias(RenderContext::new(ctx, is_private_editable), type_alias));
}
pub(crate) fn add_type_alias_with_eq(
@@ -151,7 +168,7 @@ impl Completions {
ctx: &CompletionContext,
type_alias: hir::TypeAlias,
) {
- self.add_opt(render_type_alias_with_eq(RenderContext::new(ctx), type_alias));
+ self.add_opt(render_type_alias_with_eq(RenderContext::new(ctx, false), type_alias));
}
pub(crate) fn add_qualified_enum_variant(
@@ -160,7 +177,7 @@ impl Completions {
variant: hir::Variant,
path: hir::ModPath,
) {
- let item = render_variant(RenderContext::new(ctx), None, None, variant, Some(path));
+ let item = render_variant(RenderContext::new(ctx, false), None, None, variant, Some(path));
self.add(item);
}
@@ -170,7 +187,7 @@ impl Completions {
variant: hir::Variant,
local_name: Option<hir::Name>,
) {
- let item = render_variant(RenderContext::new(ctx), None, local_name, variant, None);
+ let item = render_variant(RenderContext::new(ctx, false), None, local_name, variant, None);
self.add(item);
}
@@ -181,10 +198,12 @@ impl Completions {
field: hir::Field,
ty: &hir::Type,
) {
- if !ctx.is_visible(&field) {
- return;
- }
- let item = render_field(RenderContext::new(ctx), receiver, field, ty);
+ let is_private_editable = match ctx.is_visible(&field) {
+ Visible::Yes => false,
+ Visible::Editable => true,
+ Visible::No => return,
+ };
+ let item = render_field(RenderContext::new(ctx, is_private_editable), receiver, field, ty);
self.add(item);
}
@@ -195,7 +214,7 @@ impl Completions {
path: Option<hir::ModPath>,
local_name: Option<hir::Name>,
) {
- let item = render_struct_literal(RenderContext::new(ctx), strukt, path, local_name);
+ let item = render_struct_literal(RenderContext::new(ctx, false), strukt, path, local_name);
self.add_opt(item);
}
@@ -206,13 +225,17 @@ impl Completions {
field: usize,
ty: &hir::Type,
) {
- let item = render_tuple_field(RenderContext::new(ctx), receiver, field, ty);
+ let item = render_tuple_field(RenderContext::new(ctx, false), receiver, field, ty);
self.add(item);
}
- pub(crate) fn add_static_lifetime(&mut self, ctx: &CompletionContext) {
- let item = CompletionItem::new(SymbolKind::LifetimeParam, ctx.source_range(), "'static");
- self.add(item.build());
+ pub(crate) fn add_lifetime(&mut self, ctx: &CompletionContext, name: hir::Name) {
+ CompletionItem::new(SymbolKind::LifetimeParam, ctx.source_range(), name.to_smol_str())
+ .add_to(self)
+ }
+
+ pub(crate) fn add_label(&mut self, ctx: &CompletionContext, name: hir::Name) {
+ CompletionItem::new(SymbolKind::Label, ctx.source_range(), name.to_smol_str()).add_to(self)
}
pub(crate) fn add_variant_pat(
@@ -221,7 +244,7 @@ impl Completions {
variant: hir::Variant,
local_name: Option<hir::Name>,
) {
- self.add_opt(render_variant_pat(RenderContext::new(ctx), variant, local_name, None));
+ self.add_opt(render_variant_pat(RenderContext::new(ctx, false), variant, local_name, None));
}
pub(crate) fn add_qualified_variant_pat(
@@ -230,7 +253,7 @@ impl Completions {
variant: hir::Variant,
path: hir::ModPath,
) {
- self.add_opt(render_variant_pat(RenderContext::new(ctx), variant, None, Some(path)));
+ self.add_opt(render_variant_pat(RenderContext::new(ctx, false), variant, None, Some(path)));
}
pub(crate) fn add_struct_pat(
@@ -239,7 +262,7 @@ impl Completions {
strukt: hir::Struct,
local_name: Option<hir::Name>,
) {
- self.add_opt(render_struct_pat(RenderContext::new(ctx), strukt, local_name));
+ self.add_opt(render_struct_pat(RenderContext::new(ctx, false), strukt, local_name));
}
}