Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_completion/src/render.rs')
| -rw-r--r-- | crates/ide_completion/src/render.rs | 88 |
1 files changed, 58 insertions, 30 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index 0ed346c55e..10211cd971 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs @@ -3,13 +3,12 @@ pub(crate) mod macro_; pub(crate) mod function; -pub(crate) mod enum_variant; pub(crate) mod const_; pub(crate) mod pattern; pub(crate) mod type_alias; -pub(crate) mod struct_literal; -pub(crate) mod compound; +pub(crate) mod variant; pub(crate) mod union_literal; +pub(crate) mod literal; use hir::{AsAssocItem, HasAttrs, HirDisplay, ScopeDef}; use ide_db::{helpers::item_name, RootDatabase, SnippetCap, SymbolKind}; @@ -18,22 +17,30 @@ use syntax::{SmolStr, SyntaxKind, TextRange}; use crate::{ context::{PathCompletionCtx, PathKind}, item::{CompletionRelevanceTypeMatch, ImportEdit}, - render::{enum_variant::render_variant, function::render_fn, macro_::render_macro}, + render::{function::render_fn, literal::render_variant_lit, macro_::render_macro}, CompletionContext, CompletionItem, CompletionItemKind, CompletionRelevance, }; /// Interface for data and methods required for items rendering. -#[derive(Debug)] +#[derive(Debug, Clone)] pub(crate) struct RenderContext<'a> { completion: &'a CompletionContext<'a>, is_private_editable: bool, + import_to_add: Option<ImportEdit>, } impl<'a> RenderContext<'a> { - pub(crate) fn new( - completion: &'a CompletionContext<'a>, - is_private_editable: bool, - ) -> RenderContext<'a> { - RenderContext { completion, is_private_editable } + pub(crate) fn new(completion: &'a CompletionContext<'a>) -> RenderContext<'a> { + RenderContext { completion, is_private_editable: false, import_to_add: None } + } + + pub(crate) fn private_editable(mut self, private_editable: bool) -> Self { + self.is_private_editable = private_editable; + self + } + + pub(crate) fn import_to_add(mut self, import_to_add: Option<ImportEdit>) -> Self { + self.import_to_add = import_to_add; + self } fn snippet_cap(&self) -> Option<SnippetCap> { @@ -139,6 +146,14 @@ pub(crate) fn render_resolution( render_resolution_(ctx, local_name, None, resolution) } +pub(crate) fn render_resolution_simple( + ctx: RenderContext<'_>, + local_name: hir::Name, + resolution: ScopeDef, +) -> CompletionItem { + render_resolution_simple_(ctx, local_name, None, resolution) +} + pub(crate) fn render_resolution_with_import( ctx: RenderContext<'_>, import_edit: ImportEdit, @@ -162,31 +177,42 @@ fn render_resolution_( let _p = profile::span("render_resolution"); use hir::ModuleDef::*; - let db = ctx.db(); - - let kind = match resolution { + match resolution { + ScopeDef::ModuleDef(Macro(mac)) => { + let ctx = ctx.import_to_add(import_to_add); + return render_macro(ctx, local_name, mac); + } ScopeDef::ModuleDef(Function(func)) => { - return render_fn(ctx, import_to_add, Some(local_name), func); + let ctx = ctx.import_to_add(import_to_add); + return render_fn(ctx, Some(local_name), func); } ScopeDef::ModuleDef(Variant(var)) if ctx.completion.pattern_ctx.is_none() => { - return render_variant(ctx, import_to_add, Some(local_name), var, None); - } - ScopeDef::ModuleDef(Macro(mac)) => { - return render_macro(ctx, import_to_add, local_name, mac) - } - ScopeDef::Unknown => { - let mut item = CompletionItem::new( - CompletionItemKind::UnresolvedReference, - ctx.source_range(), - local_name.to_smol_str(), - ); - if let Some(import_to_add) = import_to_add { - item.add_import(import_to_add); + let ctx = ctx.clone().import_to_add(import_to_add.clone()); + if let Some(item) = render_variant_lit(ctx, Some(local_name.clone()), var, None) { + return item; } - return item.build(); } + _ => (), + } + render_resolution_simple_(ctx, local_name, import_to_add, resolution) +} + +fn render_resolution_simple_( + ctx: RenderContext<'_>, + local_name: hir::Name, + import_to_add: Option<ImportEdit>, + resolution: ScopeDef, +) -> CompletionItem { + let _p = profile::span("render_resolution"); + use hir::ModuleDef::*; + let db = ctx.db(); + let ctx = ctx.import_to_add(import_to_add); + let kind = match resolution { + ScopeDef::Unknown => CompletionItemKind::UnresolvedReference, + ScopeDef::ModuleDef(Function(_)) => CompletionItemKind::SymbolKind(SymbolKind::Function), ScopeDef::ModuleDef(Variant(_)) => CompletionItemKind::SymbolKind(SymbolKind::Variant), + ScopeDef::ModuleDef(Macro(_)) => CompletionItemKind::SymbolKind(SymbolKind::Macro), ScopeDef::ModuleDef(Module(..)) => CompletionItemKind::SymbolKind(SymbolKind::Module), ScopeDef::ModuleDef(Adt(adt)) => CompletionItemKind::SymbolKind(match adt { hir::Adt::Struct(_) => SymbolKind::Struct, @@ -253,7 +279,7 @@ fn render_resolution_( item.set_documentation(scope_def_docs(db, resolution)) .set_deprecated(scope_def_is_deprecated(&ctx, resolution)); - if let Some(import_to_add) = import_to_add { + if let Some(import_to_add) = ctx.import_to_add { item.add_import(import_to_add); } item.build() @@ -577,7 +603,7 @@ fn main() { let _: m::Spam = S$0 } kind: SymbolKind( Variant, ), - lookup: "Spam::Bar", + lookup: "Spam::Bar(…)", detail: "m::Spam::Bar(i32)", relevance: CompletionRelevance { exact_name_match: false, @@ -1156,6 +1182,7 @@ fn main() { "#, expect![[r#" lc s [type+name+local] + st S [type] st S [] fn main() [] fn foo(…) [] @@ -1172,6 +1199,7 @@ fn main() { "#, expect![[r#" lc ssss [type+local] + st S [type] st S [] fn main() [] fn foo(…) [] |