Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 410acd7

Browse files
Add doc(alias)-based field completion
1 parent da9c0bd commit 410acd7

File tree

5 files changed

+40
-13
lines changed

5 files changed

+40
-13
lines changed

crates/ide-completion/src/completions.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,9 @@ impl Completions {
430430
Visible::Editable => true,
431431
Visible::No => return,
432432
};
433+
let doc_aliases = ctx.doc_aliases(&field);
433434
let item = render_field(
434-
RenderContext::new(ctx).private_editable(is_private_editable),
435+
RenderContext::new(ctx).private_editable(is_private_editable).doc_aliases(doc_aliases),
435436
dot_access,
436437
receiver,
437438
field,

crates/ide-completion/src/context.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,14 @@ impl<'a> CompletionContext<'a> {
441441
self.is_visible_impl(&vis, &attrs, item.krate(self.db))
442442
}
443443

444+
pub(crate) fn doc_aliases<I>(&self, item: &I) -> Vec<SmolStr>
445+
where
446+
I: hir::HasAttrs + Copy,
447+
{
448+
let attrs = item.attrs(self.db);
449+
attrs.doc_aliases().collect()
450+
}
451+
444452
/// Check if an item is `#[doc(hidden)]`.
445453
pub(crate) fn is_item_hidden(&self, item: &hir::ItemInNs) -> bool {
446454
let attrs = item.attrs(self.db);
@@ -499,7 +507,7 @@ impl<'a> CompletionContext<'a> {
499507
if self.is_scope_def_hidden(def) {
500508
return;
501509
}
502-
let doc_aliases = self.doc_aliases(def);
510+
let doc_aliases = self.doc_aliases_in_scope(def);
503511
f(name, def, doc_aliases);
504512
});
505513
}
@@ -547,7 +555,7 @@ impl<'a> CompletionContext<'a> {
547555
self.krate != defining_crate && attrs.has_doc_hidden()
548556
}
549557

550-
fn doc_aliases(&self, scope_def: ScopeDef) -> Vec<SmolStr> {
558+
fn doc_aliases_in_scope(&self, scope_def: ScopeDef) -> Vec<SmolStr> {
551559
if let Some(attrs) = scope_def.attrs(self.db) {
552560
attrs.doc_aliases().collect()
553561
} else {

crates/ide-completion/src/item.rs

Lines changed: 7 additions & 5 deletions
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,
@@ -418,7 +419,8 @@ impl Builder {
418419
let mut lookup = self.lookup.unwrap_or_else(|| label.clone());
419420
let insert_text = self.insert_text.unwrap_or_else(|| label.to_string());
420421

421-
if let Some(doc_aliases) = self.doc_aliases {
422+
if !self.doc_aliases.is_empty() {
423+
let doc_aliases = self.doc_aliases.into_iter().join(", ");
422424
label = SmolStr::from(format!("{label} (alias {doc_aliases})"));
423425
lookup = SmolStr::from(format!("{lookup} {doc_aliases}"));
424426
}
@@ -464,8 +466,8 @@ impl Builder {
464466
self.trait_name = Some(trait_name);
465467
self
466468
}
467-
pub(crate) fn doc_aliases(&mut self, doc_aliases: SmolStr) -> &mut Builder {
468-
self.doc_aliases = Some(doc_aliases);
469+
pub(crate) fn doc_aliases(&mut self, doc_aliases: Vec<SmolStr>) -> &mut Builder {
470+
self.doc_aliases = doc_aliases;
469471
self
470472
}
471473
pub(crate) fn insert_text(&mut self, insert_text: impl Into<String>) -> &mut Builder {

crates/ide-completion/src/render.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ pub(crate) fn render_field(
152152
}
153153
}
154154
}
155+
item.doc_aliases(ctx.doc_aliases);
155156
item.build()
156157
}
157158

@@ -361,11 +362,7 @@ fn render_resolution_simple_(
361362
item.add_import(import_to_add);
362363
}
363364

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-
}
365+
item.doc_aliases(ctx.doc_aliases);
369366
item
370367
}
371368

crates/ide-completion/src/tests/special.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,3 +1086,22 @@ fn here_we_go() {
10861086
"#]],
10871087
);
10881088
}
1089+
1090+
#[test]
1091+
fn completes_field_name_via_doc_alias_in_fn_body() {
1092+
check(
1093+
r#"
1094+
struct Foo {
1095+
#[doc(alias = "qux")]
1096+
bar: u8
1097+
};
1098+
1099+
fn here_we_go() {
1100+
let foo = Foo { q$0 }
1101+
}
1102+
"#,
1103+
expect![[r#"
1104+
fd bar (alias qux) u8
1105+
"#]],
1106+
);
1107+
}

0 commit comments

Comments
 (0)