Skip to content

Commit b140827

Browse files
bors[bot]matklad
andauthored
Merge #4203
4203: Better filtering of qualified enum variants in completion r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 6046804 + 041aea2 commit b140827

File tree

2 files changed

+49
-9
lines changed

2 files changed

+49
-9
lines changed

crates/ra_ide/src/completion/complete_unqualified_path.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ fn complete_enum_variants(acc: &mut Completions, ctx: &CompletionContext, ty: &T
5353
// Variants with trivial paths are already added by the existing completion logic,
5454
// so we should avoid adding these twice
5555
if path.segments.len() > 1 {
56-
acc.add_enum_variant(ctx, variant, Some(path.to_string()));
56+
acc.add_qualified_enum_variant(ctx, variant, path);
5757
}
5858
}
5959
}
@@ -1173,6 +1173,7 @@ mod tests {
11731173
delete: 248..250,
11741174
insert: "Foo::Bar",
11751175
kind: EnumVariant,
1176+
lookup: "Bar",
11761177
detail: "()",
11771178
},
11781179
CompletionItem {
@@ -1181,6 +1182,7 @@ mod tests {
11811182
delete: 248..250,
11821183
insert: "Foo::Baz",
11831184
kind: EnumVariant,
1185+
lookup: "Baz",
11841186
detail: "()",
11851187
},
11861188
CompletionItem {
@@ -1189,6 +1191,7 @@ mod tests {
11891191
delete: 248..250,
11901192
insert: "Foo::Quux",
11911193
kind: EnumVariant,
1194+
lookup: "Quux",
11921195
detail: "()",
11931196
},
11941197
]
@@ -1231,6 +1234,7 @@ mod tests {
12311234
delete: 219..221,
12321235
insert: "Foo::Bar",
12331236
kind: EnumVariant,
1237+
lookup: "Bar",
12341238
detail: "()",
12351239
},
12361240
CompletionItem {
@@ -1239,6 +1243,7 @@ mod tests {
12391243
delete: 219..221,
12401244
insert: "Foo::Baz",
12411245
kind: EnumVariant,
1246+
lookup: "Baz",
12421247
detail: "()",
12431248
},
12441249
CompletionItem {
@@ -1247,6 +1252,7 @@ mod tests {
12471252
delete: 219..221,
12481253
insert: "Foo::Quux",
12491254
kind: EnumVariant,
1255+
lookup: "Quux",
12501256
detail: "()",
12511257
},
12521258
]
@@ -1285,6 +1291,7 @@ mod tests {
12851291
delete: 185..186,
12861292
insert: "Foo::Bar",
12871293
kind: EnumVariant,
1294+
lookup: "Bar",
12881295
detail: "()",
12891296
},
12901297
CompletionItem {
@@ -1293,6 +1300,7 @@ mod tests {
12931300
delete: 185..186,
12941301
insert: "Foo::Baz",
12951302
kind: EnumVariant,
1303+
lookup: "Baz",
12961304
detail: "()",
12971305
},
12981306
CompletionItem {
@@ -1301,6 +1309,7 @@ mod tests {
13011309
delete: 185..186,
13021310
insert: "Foo::Quux",
13031311
kind: EnumVariant,
1312+
lookup: "Quux",
13041313
detail: "()",
13051314
},
13061315
CompletionItem {
@@ -1353,6 +1362,7 @@ mod tests {
13531362
delete: 98..99,
13541363
insert: "m::E::V",
13551364
kind: EnumVariant,
1365+
lookup: "V",
13561366
detail: "()",
13571367
},
13581368
]

crates/ra_ide/src/completion/presentation.rs

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! This modules takes care of rendering various definitions as completion items.
22
3-
use hir::{Docs, HasAttrs, HasSource, HirDisplay, ScopeDef, StructKind, Type};
3+
use hir::{Docs, HasAttrs, HasSource, HirDisplay, ModPath, ScopeDef, StructKind, Type};
44
use ra_syntax::ast::NameOwner;
55
use stdx::SepBy;
66
use test_utils::tested_by;
@@ -246,14 +246,37 @@ impl Completions {
246246
.add_to(self);
247247
}
248248

249+
pub(crate) fn add_qualified_enum_variant(
250+
&mut self,
251+
ctx: &CompletionContext,
252+
variant: hir::EnumVariant,
253+
path: ModPath,
254+
) {
255+
self.add_enum_variant_impl(ctx, variant, None, Some(path))
256+
}
257+
249258
pub(crate) fn add_enum_variant(
250259
&mut self,
251260
ctx: &CompletionContext,
252261
variant: hir::EnumVariant,
253262
local_name: Option<String>,
263+
) {
264+
self.add_enum_variant_impl(ctx, variant, local_name, None)
265+
}
266+
267+
fn add_enum_variant_impl(
268+
&mut self,
269+
ctx: &CompletionContext,
270+
variant: hir::EnumVariant,
271+
local_name: Option<String>,
272+
path: Option<ModPath>,
254273
) {
255274
let is_deprecated = is_deprecated(variant, ctx.db);
256275
let name = local_name.unwrap_or_else(|| variant.name(ctx.db).to_string());
276+
let qualified_name = match &path {
277+
Some(it) => it.to_string(),
278+
None => name.to_string(),
279+
};
257280
let detail_types = variant
258281
.fields(ctx.db)
259282
.into_iter()
@@ -271,16 +294,23 @@ impl Completions {
271294
.surround_with("{ ", " }")
272295
.to_string(),
273296
};
274-
let mut res =
275-
CompletionItem::new(CompletionKind::Reference, ctx.source_range(), name.clone())
276-
.kind(CompletionItemKind::EnumVariant)
277-
.set_documentation(variant.docs(ctx.db))
278-
.set_deprecated(is_deprecated)
279-
.detail(detail);
297+
let mut res = CompletionItem::new(
298+
CompletionKind::Reference,
299+
ctx.source_range(),
300+
qualified_name.clone(),
301+
)
302+
.kind(CompletionItemKind::EnumVariant)
303+
.set_documentation(variant.docs(ctx.db))
304+
.set_deprecated(is_deprecated)
305+
.detail(detail);
306+
307+
if path.is_some() {
308+
res = res.lookup_by(name);
309+
}
280310

281311
if variant_kind == StructKind::Tuple {
282312
let params = Params::Anonymous(variant.fields(ctx.db).len());
283-
res = res.add_call_parens(ctx, name, params)
313+
res = res.add_call_parens(ctx, qualified_name, params)
284314
}
285315

286316
res.add_to(self);

0 commit comments

Comments
 (0)