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.rs88
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(…) []