Auto merge of #12861 - DorianListens:dscheidt/complete-field, r=DorianListens
fix: Autocomplete for struct fields includes receiver fixes #12857
This commit is contained in:
commit
7e2b983fd4
@ -121,7 +121,7 @@ pub(crate) fn render_field(
|
|||||||
let mut item = CompletionItem::new(
|
let mut item = CompletionItem::new(
|
||||||
SymbolKind::Field,
|
SymbolKind::Field,
|
||||||
ctx.source_range(),
|
ctx.source_range(),
|
||||||
receiver.map_or_else(|| name.clone(), |receiver| format!("{}.{}", receiver, name).into()),
|
field_with_receiver(receiver.as_ref(), &name),
|
||||||
);
|
);
|
||||||
item.set_relevance(CompletionRelevance {
|
item.set_relevance(CompletionRelevance {
|
||||||
type_match: compute_type_match(ctx.completion, ty),
|
type_match: compute_type_match(ctx.completion, ty),
|
||||||
@ -132,7 +132,7 @@ pub(crate) fn render_field(
|
|||||||
.set_documentation(field.docs(ctx.db()))
|
.set_documentation(field.docs(ctx.db()))
|
||||||
.set_deprecated(is_deprecated)
|
.set_deprecated(is_deprecated)
|
||||||
.lookup_by(name.clone());
|
.lookup_by(name.clone());
|
||||||
item.insert_text(escaped_name);
|
item.insert_text(field_with_receiver(receiver.as_ref(), &escaped_name));
|
||||||
if let Some(receiver) = &dot_access.receiver {
|
if let Some(receiver) = &dot_access.receiver {
|
||||||
if let Some(original) = ctx.completion.sema.original_ast_node(receiver.clone()) {
|
if let Some(original) = ctx.completion.sema.original_ast_node(receiver.clone()) {
|
||||||
if let Some(ref_match) = compute_ref_match(ctx.completion, ty) {
|
if let Some(ref_match) = compute_ref_match(ctx.completion, ty) {
|
||||||
@ -143,6 +143,11 @@ pub(crate) fn render_field(
|
|||||||
item.build()
|
item.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn field_with_receiver(receiver: Option<&hir::Name>, field_name: &str) -> SmolStr {
|
||||||
|
receiver
|
||||||
|
.map_or_else(|| field_name.into(), |receiver| format!("{}.{}", receiver, field_name).into())
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn render_tuple_field(
|
pub(crate) fn render_tuple_field(
|
||||||
ctx: RenderContext<'_>,
|
ctx: RenderContext<'_>,
|
||||||
receiver: Option<hir::Name>,
|
receiver: Option<hir::Name>,
|
||||||
@ -152,7 +157,7 @@ pub(crate) fn render_tuple_field(
|
|||||||
let mut item = CompletionItem::new(
|
let mut item = CompletionItem::new(
|
||||||
SymbolKind::Field,
|
SymbolKind::Field,
|
||||||
ctx.source_range(),
|
ctx.source_range(),
|
||||||
receiver.map_or_else(|| field.to_string(), |receiver| format!("{}.{}", receiver, field)),
|
field_with_receiver(receiver.as_ref(), &field.to_string()),
|
||||||
);
|
);
|
||||||
item.detail(ty.display(ctx.db()).to_string()).lookup_by(field.to_string());
|
item.detail(ty.display(ctx.db()).to_string()).lookup_by(field.to_string());
|
||||||
item.build()
|
item.build()
|
||||||
@ -1873,6 +1878,35 @@ impl r#trait for r#struct { type t$0 }
|
|||||||
struct r#struct {}
|
struct r#struct {}
|
||||||
trait r#trait { type r#type; }
|
trait r#trait { type r#type; }
|
||||||
impl r#trait for r#struct { type r#type = $0; }
|
impl r#trait for r#struct { type r#type = $0; }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn field_access_includes_self() {
|
||||||
|
check_edit(
|
||||||
|
"length",
|
||||||
|
r#"
|
||||||
|
struct S {
|
||||||
|
length: i32
|
||||||
|
}
|
||||||
|
|
||||||
|
impl S {
|
||||||
|
fn some_fn(&self) {
|
||||||
|
let l = len$0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
struct S {
|
||||||
|
length: i32
|
||||||
|
}
|
||||||
|
|
||||||
|
impl S {
|
||||||
|
fn some_fn(&self) {
|
||||||
|
let l = self.length
|
||||||
|
}
|
||||||
|
}
|
||||||
"#,
|
"#,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user