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.rs118
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
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 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)]
75pub(crate) struct RenderContext<'a> { 28pub(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
125fn render_field_( 78pub(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
159fn render_tuple_field_( 109pub(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
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
178fn render_resolution_( 151fn 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#"
1012struct Foo; 986struct 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
1155trait Deref {
1156 type Target;
1157 fn deref(&self) -> &Self::Target;
1158}
1159
1160struct S; 1129struct S;
1161struct T(S); 1130struct T(S);
1162 1131
1163impl Deref for T { 1132impl 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
1198trait Deref {
1199 type Target;
1200 fn deref(&self) -> &Self::Target;
1201}
1202
1203#[lang = "deref_mut"]
1204pub trait DerefMut: Deref {
1205 fn deref_mut(&mut self) -> &mut Self::Target;
1206}
1207
1208struct S; 1168struct S;
1209struct T(S); 1169struct T(S);
1210 1170
1211impl Deref for T { 1171impl 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
1219impl DerefMut for T { 1179impl 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 }