Skip to content

Commit 420a038

Browse files
committed
Auto merge of rust-lang#14513 - hecatia-elegua:alias-based-completion2, r=Veykril
doc(alias)-based completion round 2 Follow-up on rust-lang#14433 We can now complete fields, functions and some use/mods. Flyimports don't behave, I don't really have the time to understand the structure there either. While reading the flyimport code, I removed one method only used there, the closure-tree was a bit confusing, I can revert that if you want.
2 parents b2e6f3a + 398af02 commit 420a038

File tree

8 files changed

+214
-77
lines changed

8 files changed

+214
-77
lines changed

crates/ide-completion/src/completions.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,6 @@ impl Completions {
7878
}
7979
}
8080

81-
pub(crate) fn add_all<I>(&mut self, items: I)
82-
where
83-
I: IntoIterator,
84-
I::Item: Into<CompletionItem>,
85-
{
86-
items.into_iter().for_each(|item| self.add(item.into()))
87-
}
88-
8981
pub(crate) fn add_keyword(&mut self, ctx: &CompletionContext<'_>, keyword: &'static str) {
9082
let item = CompletionItem::new(CompletionItemKind::Keyword, ctx.source_range(), keyword);
9183
item.add_to(self);
@@ -472,8 +464,9 @@ impl Completions {
472464
Visible::Editable => true,
473465
Visible::No => return,
474466
};
467+
let doc_aliases = ctx.doc_aliases(&field);
475468
let item = render_field(
476-
RenderContext::new(ctx).private_editable(is_private_editable),
469+
RenderContext::new(ctx).private_editable(is_private_editable).doc_aliases(doc_aliases),
477470
dot_access,
478471
receiver,
479472
field,

crates/ide-completion/src/completions/expr.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,13 @@ pub(crate) fn complete_expr_path(
8888
let module_scope = module.scope(ctx.db, Some(ctx.module));
8989
for (name, def) in module_scope {
9090
if scope_def_applicable(def) {
91-
acc.add_path_resolution(ctx, path_ctx, name, def, vec![]);
91+
acc.add_path_resolution(
92+
ctx,
93+
path_ctx,
94+
name,
95+
def,
96+
ctx.doc_aliases_in_scope(def),
97+
);
9298
}
9399
}
94100
}

crates/ide-completion/src/completions/flyimport.rs

+36-52
Original file line numberDiff line numberDiff line change
@@ -257,32 +257,24 @@ fn import_on_the_fly(
257257
};
258258
let user_input_lowercased = potential_import_name.to_lowercase();
259259

260-
acc.add_all(
261-
import_assets
262-
.search_for_imports(
263-
&ctx.sema,
264-
ctx.config.insert_use.prefix_kind,
265-
ctx.config.prefer_no_std,
266-
)
267-
.into_iter()
268-
.filter(ns_filter)
269-
.filter(|import| {
270-
let original_item = &import.original_item;
271-
!ctx.is_item_hidden(&import.item_to_import)
272-
&& !ctx.is_item_hidden(original_item)
273-
&& ctx.check_stability(original_item.attrs(ctx.db).as_deref())
274-
})
275-
.sorted_by_key(|located_import| {
276-
compute_fuzzy_completion_order_key(
277-
&located_import.import_path,
278-
&user_input_lowercased,
279-
)
280-
})
281-
.filter_map(|import| {
282-
render_resolution_with_import(RenderContext::new(ctx), path_ctx, import)
283-
})
284-
.map(|builder| builder.build()),
285-
);
260+
import_assets
261+
.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind, ctx.config.prefer_no_std)
262+
.into_iter()
263+
.filter(ns_filter)
264+
.filter(|import| {
265+
let original_item = &import.original_item;
266+
!ctx.is_item_hidden(&import.item_to_import)
267+
&& !ctx.is_item_hidden(original_item)
268+
&& ctx.check_stability(original_item.attrs(ctx.db).as_deref())
269+
})
270+
.sorted_by_key(|located_import| {
271+
compute_fuzzy_completion_order_key(&located_import.import_path, &user_input_lowercased)
272+
})
273+
.filter_map(|import| {
274+
render_resolution_with_import(RenderContext::new(ctx), path_ctx, import)
275+
})
276+
.map(|builder| builder.build())
277+
.for_each(|item| acc.add(item));
286278
Some(())
287279
}
288280

@@ -307,32 +299,24 @@ fn import_on_the_fly_pat_(
307299
};
308300
let user_input_lowercased = potential_import_name.to_lowercase();
309301

310-
acc.add_all(
311-
import_assets
312-
.search_for_imports(
313-
&ctx.sema,
314-
ctx.config.insert_use.prefix_kind,
315-
ctx.config.prefer_no_std,
316-
)
317-
.into_iter()
318-
.filter(ns_filter)
319-
.filter(|import| {
320-
let original_item = &import.original_item;
321-
!ctx.is_item_hidden(&import.item_to_import)
322-
&& !ctx.is_item_hidden(original_item)
323-
&& ctx.check_stability(original_item.attrs(ctx.db).as_deref())
324-
})
325-
.sorted_by_key(|located_import| {
326-
compute_fuzzy_completion_order_key(
327-
&located_import.import_path,
328-
&user_input_lowercased,
329-
)
330-
})
331-
.filter_map(|import| {
332-
render_resolution_with_import_pat(RenderContext::new(ctx), pattern_ctx, import)
333-
})
334-
.map(|builder| builder.build()),
335-
);
302+
import_assets
303+
.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind, ctx.config.prefer_no_std)
304+
.into_iter()
305+
.filter(ns_filter)
306+
.filter(|import| {
307+
let original_item = &import.original_item;
308+
!ctx.is_item_hidden(&import.item_to_import)
309+
&& !ctx.is_item_hidden(original_item)
310+
&& ctx.check_stability(original_item.attrs(ctx.db).as_deref())
311+
})
312+
.sorted_by_key(|located_import| {
313+
compute_fuzzy_completion_order_key(&located_import.import_path, &user_input_lowercased)
314+
})
315+
.filter_map(|import| {
316+
render_resolution_with_import_pat(RenderContext::new(ctx), pattern_ctx, import)
317+
})
318+
.map(|builder| builder.build())
319+
.for_each(|item| acc.add(item));
336320
Some(())
337321
}
338322

crates/ide-completion/src/context.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,14 @@ impl CompletionContext<'_> {
443443
self.is_visible_impl(&vis, &attrs, item.krate(self.db))
444444
}
445445

446+
pub(crate) fn doc_aliases<I>(&self, item: &I) -> Vec<SmolStr>
447+
where
448+
I: hir::HasAttrs + Copy,
449+
{
450+
let attrs = item.attrs(self.db);
451+
attrs.doc_aliases().collect()
452+
}
453+
446454
/// Check if an item is `#[doc(hidden)]`.
447455
pub(crate) fn is_item_hidden(&self, item: &hir::ItemInNs) -> bool {
448456
let attrs = item.attrs(self.db);
@@ -507,7 +515,7 @@ impl CompletionContext<'_> {
507515
if self.is_scope_def_hidden(def) {
508516
return;
509517
}
510-
let doc_aliases = self.doc_aliases(def);
518+
let doc_aliases = self.doc_aliases_in_scope(def);
511519
f(name, def, doc_aliases);
512520
});
513521
}
@@ -555,7 +563,7 @@ impl CompletionContext<'_> {
555563
self.krate != defining_crate && attrs.has_doc_hidden()
556564
}
557565

558-
fn doc_aliases(&self, scope_def: ScopeDef) -> Vec<SmolStr> {
566+
pub(crate) fn doc_aliases_in_scope(&self, scope_def: ScopeDef) -> Vec<SmolStr> {
559567
if let Some(attrs) = scope_def.attrs(self.db) {
560568
attrs.doc_aliases().collect()
561569
} else {

crates/ide-completion/src/item.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::fmt;
44

55
use hir::{Documentation, Mutability};
66
use ide_db::{imports::import_assets::LocatedImport, SnippetCap, SymbolKind};
7+
use itertools::Itertools;
78
use smallvec::SmallVec;
89
use stdx::{impl_from, never};
910
use syntax::{SmolStr, TextRange, TextSize};
@@ -353,7 +354,7 @@ impl CompletionItem {
353354
relevance: CompletionRelevance::default(),
354355
ref_match: None,
355356
imports_to_add: Default::default(),
356-
doc_aliases: None,
357+
doc_aliases: vec![],
357358
}
358359
}
359360

@@ -386,7 +387,7 @@ pub(crate) struct Builder {
386387
source_range: TextRange,
387388
imports_to_add: SmallVec<[LocatedImport; 1]>,
388389
trait_name: Option<SmolStr>,
389-
doc_aliases: Option<SmolStr>,
390+
doc_aliases: Vec<SmolStr>,
390391
label: SmolStr,
391392
insert_text: Option<String>,
392393
is_snippet: bool,
@@ -408,7 +409,13 @@ impl Builder {
408409
local_name: hir::Name,
409410
resolution: hir::ScopeDef,
410411
) -> Self {
411-
render_path_resolution(RenderContext::new(ctx), path_ctx, local_name, resolution)
412+
let doc_aliases = ctx.doc_aliases_in_scope(resolution);
413+
render_path_resolution(
414+
RenderContext::new(ctx).doc_aliases(doc_aliases),
415+
path_ctx,
416+
local_name,
417+
resolution,
418+
)
412419
}
413420

414421
pub(crate) fn build(self) -> CompletionItem {
@@ -418,7 +425,8 @@ impl Builder {
418425
let mut lookup = self.lookup.unwrap_or_else(|| label.clone());
419426
let insert_text = self.insert_text.unwrap_or_else(|| label.to_string());
420427

421-
if let Some(doc_aliases) = self.doc_aliases {
428+
if !self.doc_aliases.is_empty() {
429+
let doc_aliases = self.doc_aliases.into_iter().join(", ");
422430
label = SmolStr::from(format!("{label} (alias {doc_aliases})"));
423431
lookup = SmolStr::from(format!("{lookup} {doc_aliases}"));
424432
}
@@ -464,8 +472,8 @@ impl Builder {
464472
self.trait_name = Some(trait_name);
465473
self
466474
}
467-
pub(crate) fn doc_aliases(&mut self, doc_aliases: SmolStr) -> &mut Builder {
468-
self.doc_aliases = Some(doc_aliases);
475+
pub(crate) fn doc_aliases(&mut self, doc_aliases: Vec<SmolStr>) -> &mut Builder {
476+
self.doc_aliases = doc_aliases;
469477
self
470478
}
471479
pub(crate) fn insert_text(&mut self, insert_text: impl Into<String>) -> &mut Builder {

crates/ide-completion/src/render.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use hir::{AsAssocItem, HasAttrs, HirDisplay, ScopeDef};
1414
use ide_db::{
1515
helpers::item_name, imports::import_assets::LocatedImport, RootDatabase, SnippetCap, SymbolKind,
1616
};
17-
use itertools::Itertools;
1817
use syntax::{AstNode, SmolStr, SyntaxKind, TextRange};
1918

2019
use crate::{
@@ -152,6 +151,7 @@ pub(crate) fn render_field(
152151
}
153152
}
154153
}
154+
item.doc_aliases(ctx.doc_aliases);
155155
item.build()
156156
}
157157

@@ -209,7 +209,9 @@ pub(crate) fn render_resolution_with_import(
209209
) -> Option<Builder> {
210210
let resolution = ScopeDef::from(import_edit.original_item);
211211
let local_name = scope_def_to_name(resolution, &ctx, &import_edit)?;
212-
212+
//this now just renders the alias text, but we need to find the aliases earlier and call this with the alias instead
213+
let doc_aliases = ctx.completion.doc_aliases_in_scope(resolution);
214+
let ctx = ctx.doc_aliases(doc_aliases);
213215
Some(render_resolution_path(ctx, path_ctx, local_name, Some(import_edit), resolution))
214216
}
215217

@@ -361,11 +363,7 @@ fn render_resolution_simple_(
361363
item.add_import(import_to_add);
362364
}
363365

364-
let doc_aliases = ctx.doc_aliases;
365-
if !doc_aliases.is_empty() {
366-
let doc_aliases = doc_aliases.into_iter().join(", ").into();
367-
item.doc_aliases(doc_aliases);
368-
}
366+
item.doc_aliases(ctx.doc_aliases);
369367
item
370368
}
371369

crates/ide-completion/src/render/function.rs

+2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ fn render(
147147
}
148148
}
149149
}
150+
151+
item.doc_aliases(ctx.doc_aliases);
150152
item
151153
}
152154

0 commit comments

Comments
 (0)