diff options
Diffstat (limited to 'crates/ide_completion/src/render.rs')
-rw-r--r-- | crates/ide_completion/src/render.rs | 118 |
1 files changed, 39 insertions, 79 deletions
diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index d3db55c35..2bd2c44d0 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs | |||
@@ -23,53 +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 | if ctx.completion.expects_type() && resolution.is_value_def() { | ||
59 | return None; | ||
60 | } | ||
61 | let local_name = match resolution { | ||
62 | hir::ScopeDef::ModuleDef(hir::ModuleDef::Function(f)) => f.name(ctx.completion.db), | ||
63 | hir::ScopeDef::ModuleDef(hir::ModuleDef::Const(c)) => c.name(ctx.completion.db)?, | ||
64 | hir::ScopeDef::ModuleDef(hir::ModuleDef::TypeAlias(t)) => t.name(ctx.completion.db), | ||
65 | _ => item_name(ctx.db(), import_edit.import.original_item)?, | ||
66 | }; | ||
67 | render_resolution_(ctx, local_name, Some(import_edit), &resolution).map(|mut item| { | ||
68 | item.completion_kind = CompletionKind::Magic; | ||
69 | item | ||
70 | }) | ||
71 | } | ||
72 | |||
73 | /// Interface for data and methods required for items rendering. | 26 | /// Interface for data and methods required for items rendering. |
74 | #[derive(Debug)] | 27 | #[derive(Debug)] |
75 | pub(crate) struct RenderContext<'a> { | 28 | pub(crate) struct RenderContext<'a> { |
@@ -86,7 +39,7 @@ impl<'a> RenderContext<'a> { | |||
86 | } | 39 | } |
87 | 40 | ||
88 | fn db(&self) -> &'a RootDatabase { | 41 | fn db(&self) -> &'a RootDatabase { |
89 | &self.completion.db | 42 | self.completion.db |
90 | } | 43 | } |
91 | 44 | ||
92 | fn source_range(&self) -> TextRange { | 45 | fn source_range(&self) -> TextRange { |
@@ -122,7 +75,7 @@ impl<'a> RenderContext<'a> { | |||
122 | } | 75 | } |
123 | } | 76 | } |
124 | 77 | ||
125 | fn render_field_( | 78 | pub(crate) fn render_field( |
126 | ctx: RenderContext<'_>, | 79 | ctx: RenderContext<'_>, |
127 | receiver: Option<hir::Name>, | 80 | receiver: Option<hir::Name>, |
128 | field: hir::Field, | 81 | field: hir::Field, |
@@ -135,7 +88,6 @@ fn render_field_( | |||
135 | ctx.source_range(), | 88 | ctx.source_range(), |
136 | receiver.map_or_else(|| name.clone(), |receiver| format!("{}.{}", receiver, name)), | 89 | receiver.map_or_else(|| name.clone(), |receiver| format!("{}.{}", receiver, name)), |
137 | ); | 90 | ); |
138 | |||
139 | item.set_relevance(CompletionRelevance { | 91 | item.set_relevance(CompletionRelevance { |
140 | type_match: compute_type_match(ctx.completion, ty), | 92 | type_match: compute_type_match(ctx.completion, ty), |
141 | exact_name_match: compute_exact_name_match(ctx.completion, &name), | 93 | exact_name_match: compute_exact_name_match(ctx.completion, &name), |
@@ -146,17 +98,15 @@ fn render_field_( | |||
146 | .set_documentation(field.docs(ctx.db())) | 98 | .set_documentation(field.docs(ctx.db())) |
147 | .set_deprecated(is_deprecated) | 99 | .set_deprecated(is_deprecated) |
148 | .lookup_by(name); | 100 | .lookup_by(name); |
149 | |||
150 | if let Some(_ref_match) = compute_ref_match(ctx.completion, ty) { | 101 | if let Some(_ref_match) = compute_ref_match(ctx.completion, ty) { |
151 | // FIXME | 102 | // FIXME |
152 | // 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 |
153 | // completions on struct fields, so we've disabled them. See #8058. | 104 | // completions on struct fields, so we've disabled them. See #8058. |
154 | } | 105 | } |
155 | |||
156 | item.build() | 106 | item.build() |
157 | } | 107 | } |
158 | 108 | ||
159 | fn render_tuple_field_( | 109 | pub(crate) fn render_tuple_field( |
160 | ctx: RenderContext<'_>, | 110 | ctx: RenderContext<'_>, |
161 | receiver: Option<hir::Name>, | 111 | receiver: Option<hir::Name>, |
162 | field: usize, | 112 | field: usize, |
@@ -167,14 +117,37 @@ fn render_tuple_field_( | |||
167 | ctx.source_range(), | 117 | ctx.source_range(), |
168 | receiver.map_or_else(|| field.to_string(), |receiver| format!("{}.{}", receiver, field)), | 118 | receiver.map_or_else(|| field.to_string(), |receiver| format!("{}.{}", receiver, field)), |
169 | ); | 119 | ); |
170 | |||
171 | item.kind(SymbolKind::Field) | 120 | item.kind(SymbolKind::Field) |
172 | .detail(ty.display(ctx.db()).to_string()) | 121 | .detail(ty.display(ctx.db()).to_string()) |
173 | .lookup_by(field.to_string()); | 122 | .lookup_by(field.to_string()); |
174 | |||
175 | item.build() | 123 | item.build() |
176 | } | 124 | } |
177 | 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 | |||
178 | fn render_resolution_( | 151 | fn render_resolution_( |
179 | ctx: RenderContext<'_>, | 152 | ctx: RenderContext<'_>, |
180 | local_name: hir::Name, | 153 | local_name: hir::Name, |
@@ -1007,6 +980,7 @@ fn go(world: &WorldSnapshot) { go(w$0) } | |||
1007 | 980 | ||
1008 | #[test] | 981 | #[test] |
1009 | fn too_many_arguments() { | 982 | fn too_many_arguments() { |
983 | cov_mark::check!(too_many_arguments); | ||
1010 | check_relevance( | 984 | check_relevance( |
1011 | r#" | 985 | r#" |
1012 | struct Foo; | 986 | struct Foo; |
@@ -1151,16 +1125,11 @@ fn main() { | |||
1151 | fn suggest_deref() { | 1125 | fn suggest_deref() { |
1152 | check_relevance( | 1126 | check_relevance( |
1153 | r#" | 1127 | r#" |
1154 | #[lang = "deref"] | 1128 | //- minicore: deref |
1155 | trait Deref { | ||
1156 | type Target; | ||
1157 | fn deref(&self) -> &Self::Target; | ||
1158 | } | ||
1159 | |||
1160 | struct S; | 1129 | struct S; |
1161 | struct T(S); | 1130 | struct T(S); |
1162 | 1131 | ||
1163 | impl Deref for T { | 1132 | impl core::ops::Deref for T { |
1164 | type Target = S; | 1133 | type Target = S; |
1165 | 1134 | ||
1166 | fn deref(&self) -> &Self::Target { | 1135 | fn deref(&self) -> &Self::Target { |
@@ -1184,8 +1153,9 @@ fn main() { | |||
1184 | st T [] | 1153 | st T [] |
1185 | st S [] | 1154 | st S [] |
1186 | fn main() [] | 1155 | fn main() [] |
1187 | tt Deref [] | ||
1188 | fn foo(…) [] | 1156 | fn foo(…) [] |
1157 | md core [] | ||
1158 | tt Sized [] | ||
1189 | "#]], | 1159 | "#]], |
1190 | ) | 1160 | ) |
1191 | } | 1161 | } |
@@ -1194,21 +1164,11 @@ fn main() { | |||
1194 | fn suggest_deref_mut() { | 1164 | fn suggest_deref_mut() { |
1195 | check_relevance( | 1165 | check_relevance( |
1196 | r#" | 1166 | r#" |
1197 | #[lang = "deref"] | 1167 | //- minicore: deref_mut |
1198 | trait Deref { | ||
1199 | type Target; | ||
1200 | fn deref(&self) -> &Self::Target; | ||
1201 | } | ||
1202 | |||
1203 | #[lang = "deref_mut"] | ||
1204 | pub trait DerefMut: Deref { | ||
1205 | fn deref_mut(&mut self) -> &mut Self::Target; | ||
1206 | } | ||
1207 | |||
1208 | struct S; | 1168 | struct S; |
1209 | struct T(S); | 1169 | struct T(S); |
1210 | 1170 | ||
1211 | impl Deref for T { | 1171 | impl core::ops::Deref for T { |
1212 | type Target = S; | 1172 | type Target = S; |
1213 | 1173 | ||
1214 | fn deref(&self) -> &Self::Target { | 1174 | fn deref(&self) -> &Self::Target { |
@@ -1216,7 +1176,7 @@ impl Deref for T { | |||
1216 | } | 1176 | } |
1217 | } | 1177 | } |
1218 | 1178 | ||
1219 | impl DerefMut for T { | 1179 | impl core::ops::DerefMut for T { |
1220 | fn deref_mut(&mut self) -> &mut Self::Target { | 1180 | fn deref_mut(&mut self) -> &mut Self::Target { |
1221 | &mut self.0 | 1181 | &mut self.0 |
1222 | } | 1182 | } |
@@ -1235,12 +1195,12 @@ fn main() { | |||
1235 | lc m [local] | 1195 | lc m [local] |
1236 | lc t [local] | 1196 | lc t [local] |
1237 | lc &mut t [type+local] | 1197 | lc &mut t [type+local] |
1238 | tt DerefMut [] | ||
1239 | tt Deref [] | ||
1240 | fn foo(…) [] | ||
1241 | st T [] | 1198 | st T [] |
1242 | st S [] | 1199 | st S [] |
1243 | fn main() [] | 1200 | fn main() [] |
1201 | fn foo(…) [] | ||
1202 | md core [] | ||
1203 | tt Sized [] | ||
1244 | "#]], | 1204 | "#]], |
1245 | ) | 1205 | ) |
1246 | } | 1206 | } |