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.rs | 117 |
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)); } } |