diff options
Diffstat (limited to 'crates/ide_completion/src/render.rs')
-rw-r--r-- | crates/ide_completion/src/render.rs | 78 |
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 | |||
27 | pub(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 | |||
36 | pub(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 | |||
45 | pub(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 | |||
53 | pub(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)] |
72 | pub(crate) struct RenderContext<'a> { | 28 | pub(crate) struct RenderContext<'a> { |
@@ -119,7 +75,7 @@ impl<'a> RenderContext<'a> { | |||
119 | } | 75 | } |
120 | } | 76 | } |
121 | 77 | ||
122 | fn render_field_( | 78 | pub(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 | ||
156 | fn render_tuple_field_( | 109 | pub(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 | ||
126 | pub(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 | |||
134 | pub(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 | |||
175 | fn render_resolution_( | 151 | fn render_resolution_( |
176 | ctx: RenderContext<'_>, | 152 | ctx: RenderContext<'_>, |
177 | local_name: hir::Name, | 153 | local_name: hir::Name, |