aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_completion/src/render.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_completion/src/render.rs')
-rw-r--r--crates/ide_completion/src/render.rs78
1 files changed, 27 insertions, 51 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs
index 70bf26cf4..2bd2c44d0 100644
--- a/crates/ide_completion/src/render.rs
+++ b/crates/ide_completion/src/render.rs
@@ -23,50 +23,6 @@ use crate::{
23 render::{enum_variant::render_variant, function::render_fn, macro_::render_macro}, 23 render::{enum_variant::render_variant, function::render_fn, macro_::render_macro},
24 CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, CompletionRelevance, 24 CompletionContext, CompletionItem, CompletionItemKind, CompletionKind, CompletionRelevance,
25}; 25};
26
27pub(crate) fn render_field(
28 ctx: RenderContext<'_>,
29 receiver: Option<hir::Name>,
30 field: hir::Field,
31 ty: &hir::Type,
32) -> CompletionItem {
33 render_field_(ctx, receiver, field, ty)
34}
35
36pub(crate) fn render_tuple_field(
37 ctx: RenderContext<'_>,
38 receiver: Option<hir::Name>,
39 field: usize,
40 ty: &hir::Type,
41) -> CompletionItem {
42 render_tuple_field_(ctx, receiver, field, ty)
43}
44
45pub(crate) fn render_resolution(
46 ctx: RenderContext<'_>,
47 local_name: hir::Name,
48 resolution: &hir::ScopeDef,
49) -> Option<CompletionItem> {
50 render_resolution_(ctx, local_name, None, resolution)
51}
52
53pub(crate) fn render_resolution_with_import(
54 ctx: RenderContext<'_>,
55 import_edit: ImportEdit,
56) -> Option<CompletionItem> {
57 let resolution = hir::ScopeDef::from(import_edit.import.original_item);
58 let local_name = match resolution {
59 hir::ScopeDef::ModuleDef(hir::ModuleDef::Function(f)) => f.name(ctx.completion.db),
60 hir::ScopeDef::ModuleDef(hir::ModuleDef::Const(c)) => c.name(ctx.completion.db)?,
61 hir::ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(t)) => t.name(ctx.completion.db),
62 _ => item_name(ctx.db(), import_edit.import.original_item)?,
63 };
64 render_resolution_(ctx, local_name, Some(import_edit), &resolution).map(|mut item| {
65 item.completion_kind = CompletionKind::Magic;
66 item
67 })
68}
69
70/// Interface for data and methods required for items rendering. 26/// Interface for data and methods required for items rendering.
71#[derive(Debug)] 27#[derive(Debug)]
72pub(crate) struct RenderContext<'a> { 28pub(crate) struct RenderContext<'a> {
@@ -119,7 +75,7 @@ impl<'a> RenderContext<'a> {
119 } 75 }
120} 76}
121 77
122fn render_field_( 78pub(crate) fn render_field(
123 ctx: RenderContext<'_>, 79 ctx: RenderContext<'_>,
124 receiver: Option<hir::Name>, 80 receiver: Option<hir::Name>,
125 field: hir::Field, 81 field: hir::Field,
@@ -132,7 +88,6 @@ fn render_field_(
132 ctx.source_range(), 88 ctx.source_range(),
133 receiver.map_or_else(|| name.clone(), |receiver| format!("{}.{}", receiver, name)), 89 receiver.map_or_else(|| name.clone(), |receiver| format!("{}.{}", receiver, name)),
134 ); 90 );
135
136 item.set_relevance(CompletionRelevance { 91 item.set_relevance(CompletionRelevance {
137 type_match: compute_type_match(ctx.completion, ty), 92 type_match: compute_type_match(ctx.completion, ty),
138 exact_name_match: compute_exact_name_match(ctx.completion, &name), 93 exact_name_match: compute_exact_name_match(ctx.completion, &name),
@@ -143,17 +98,15 @@ fn render_field_(
143 .set_documentation(field.docs(ctx.db())) 98 .set_documentation(field.docs(ctx.db()))
144 .set_deprecated(is_deprecated) 99 .set_deprecated(is_deprecated)
145 .lookup_by(name); 100 .lookup_by(name);
146
147 if let Some(_ref_match) = compute_ref_match(ctx.completion, ty) { 101 if let Some(_ref_match) = compute_ref_match(ctx.completion, ty) {
148 // FIXME 102 // FIXME
149 // For now we don't properly calculate the edits for ref match 103 // For now we don't properly calculate the edits for ref match
150 // completions on struct fields, so we've disabled them. See #8058. 104 // completions on struct fields, so we've disabled them. See #8058.
151 } 105 }
152
153 item.build() 106 item.build()
154} 107}
155 108
156fn render_tuple_field_( 109pub(crate) fn render_tuple_field(
157 ctx: RenderContext<'_>, 110 ctx: RenderContext<'_>,
158 receiver: Option<hir::Name>, 111 receiver: Option<hir::Name>,
159 field: usize, 112 field: usize,
@@ -164,14 +117,37 @@ fn render_tuple_field_(
164 ctx.source_range(), 117 ctx.source_range(),
165 receiver.map_or_else(|| field.to_string(), |receiver| format!("{}.{}", receiver, field)), 118 receiver.map_or_else(|| field.to_string(), |receiver| format!("{}.{}", receiver, field)),
166 ); 119 );
167
168 item.kind(SymbolKind::Field) 120 item.kind(SymbolKind::Field)
169 .detail(ty.display(ctx.db()).to_string()) 121 .detail(ty.display(ctx.db()).to_string())
170 .lookup_by(field.to_string()); 122 .lookup_by(field.to_string());
171
172 item.build() 123 item.build()
173} 124}
174 125
126pub(crate) fn render_resolution(
127 ctx: RenderContext<'_>,
128 local_name: hir::Name,
129 resolution: &hir::ScopeDef,
130) -> Option<CompletionItem> {
131 render_resolution_(ctx, local_name, None, resolution)
132}
133
134pub(crate) fn render_resolution_with_import(
135 ctx: RenderContext<'_>,
136 import_edit: ImportEdit,
137) -> Option<CompletionItem> {
138 let resolution = hir::ScopeDef::from(import_edit.import.original_item);
139 let local_name = match resolution {
140 hir::ScopeDef::ModuleDef(hir::ModuleDef::Function(f)) => f.name(ctx.completion.db),
141 hir::ScopeDef::ModuleDef(hir::ModuleDef::Const(c)) => c.name(ctx.completion.db)?,
142 hir::ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(t)) => t.name(ctx.completion.db),
143 _ => item_name(ctx.db(), import_edit.import.original_item)?,
144 };
145 render_resolution_(ctx, local_name, Some(import_edit), &resolution).map(|mut item| {
146 item.completion_kind = CompletionKind::Magic;
147 item
148 })
149}
150
175fn render_resolution_( 151fn render_resolution_(
176 ctx: RenderContext<'_>, 152 ctx: RenderContext<'_>,
177 local_name: hir::Name, 153 local_name: hir::Name,