aboutsummaryrefslogtreecommitdiff
path: root/crates/completion/src/render.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/completion/src/render.rs')
-rw-r--r--crates/completion/src/render.rs57
1 files changed, 51 insertions, 6 deletions
diff --git a/crates/completion/src/render.rs b/crates/completion/src/render.rs
index 1fa02c375..e892d4de8 100644
--- a/crates/completion/src/render.rs
+++ b/crates/completion/src/render.rs
@@ -9,7 +9,8 @@ pub(crate) mod type_alias;
9 9
10mod builder_ext; 10mod builder_ext;
11 11
12use hir::{Documentation, HasAttrs, HirDisplay, Mutability, ScopeDef, Type}; 12use assists::utils::{ImportScope, MergeBehaviour};
13use hir::{Documentation, HasAttrs, HirDisplay, ModPath, Mutability, ScopeDef, Type};
13use ide_db::RootDatabase; 14use ide_db::RootDatabase;
14use syntax::TextRange; 15use syntax::TextRange;
15use test_utils::mark; 16use test_utils::mark;
@@ -42,7 +43,22 @@ pub(crate) fn render_resolution<'a>(
42 local_name: String, 43 local_name: String,
43 resolution: &ScopeDef, 44 resolution: &ScopeDef,
44) -> Option<CompletionItem> { 45) -> Option<CompletionItem> {
45 Render::new(ctx).render_resolution(local_name, resolution) 46 Render::new(ctx).render_resolution(local_name, None, resolution)
47}
48
49pub(crate) fn render_resolution_with_import<'a>(
50 ctx: RenderContext<'a>,
51 import: ModPath,
52 import_scope: ImportScope,
53 merge_behaviour: Option<MergeBehaviour>,
54 resolution: &ScopeDef,
55) -> Option<CompletionItem> {
56 let local_name = import.segments.last()?.to_string();
57 Render::new(ctx).render_resolution(
58 local_name,
59 Some((import, import_scope, merge_behaviour)),
60 resolution,
61 )
46} 62}
47 63
48/// Interface for data and methods required for items rendering. 64/// Interface for data and methods required for items rendering.
@@ -131,6 +147,7 @@ impl<'a> Render<'a> {
131 fn render_resolution( 147 fn render_resolution(
132 self, 148 self,
133 local_name: String, 149 local_name: String,
150 import_data: Option<(ModPath, ImportScope, Option<MergeBehaviour>)>,
134 resolution: &ScopeDef, 151 resolution: &ScopeDef,
135 ) -> Option<CompletionItem> { 152 ) -> Option<CompletionItem> {
136 use hir::ModuleDef::*; 153 use hir::ModuleDef::*;
@@ -142,15 +159,15 @@ impl<'a> Render<'a> {
142 159
143 let kind = match resolution { 160 let kind = match resolution {
144 ScopeDef::ModuleDef(Function(func)) => { 161 ScopeDef::ModuleDef(Function(func)) => {
145 let item = render_fn(self.ctx, Some(local_name), *func); 162 let item = render_fn(self.ctx, import_data, Some(local_name), *func);
146 return Some(item); 163 return Some(item);
147 } 164 }
148 ScopeDef::ModuleDef(EnumVariant(var)) => { 165 ScopeDef::ModuleDef(EnumVariant(var)) => {
149 let item = render_enum_variant(self.ctx, Some(local_name), *var, None); 166 let item = render_enum_variant(self.ctx, import_data, Some(local_name), *var, None);
150 return Some(item); 167 return Some(item);
151 } 168 }
152 ScopeDef::MacroDef(mac) => { 169 ScopeDef::MacroDef(mac) => {
153 let item = render_macro(self.ctx, local_name, *mac); 170 let item = render_macro(self.ctx, import_data, local_name, *mac);
154 return item; 171 return item;
155 } 172 }
156 173
@@ -175,6 +192,7 @@ impl<'a> Render<'a> {
175 local_name, 192 local_name,
176 ) 193 )
177 .kind(CompletionItemKind::UnresolvedReference) 194 .kind(CompletionItemKind::UnresolvedReference)
195 .import_data(import_data)
178 .build(); 196 .build();
179 return Some(item); 197 return Some(item);
180 } 198 }
@@ -227,7 +245,12 @@ impl<'a> Render<'a> {
227 } 245 }
228 } 246 }
229 247
230 let item = item.kind(kind).set_documentation(docs).set_ref_match(ref_match).build(); 248 let item = item
249 .kind(kind)
250 .import_data(import_data)
251 .set_documentation(docs)
252 .set_ref_match(ref_match)
253 .build();
231 Some(item) 254 Some(item)
232 } 255 }
233 256
@@ -426,6 +449,28 @@ fn main() { let _: m::Spam = S<|> }
426 kind: Module, 449 kind: Module,
427 }, 450 },
428 CompletionItem { 451 CompletionItem {
452 label: "m::Spam",
453 source_range: 75..76,
454 text_edit: TextEdit {
455 indels: [
456 Indel {
457 insert: "use m::Spam;",
458 delete: 0..0,
459 },
460 Indel {
461 insert: "\n\n",
462 delete: 0..0,
463 },
464 Indel {
465 insert: "Spam",
466 delete: 75..76,
467 },
468 ],
469 },
470 kind: Enum,
471 lookup: "Spam",
472 },
473 CompletionItem {
429 label: "m::Spam::Foo", 474 label: "m::Spam::Foo",
430 source_range: 75..76, 475 source_range: 75..76,
431 delete: 75..76, 476 delete: 75..76,