Skip to content

Commit 75bbbd5

Browse files
DorianListensfasterthanlime
authored andcommitted
fix: Autocomplete for struct fields includes receiver
fixes rust-lang#12857
1 parent e860c00 commit 75bbbd5

File tree

1 file changed

+37
-3
lines changed
  • src/tools/rust-analyzer/crates/ide-completion/src

1 file changed

+37
-3
lines changed

src/tools/rust-analyzer/crates/ide-completion/src/render.rs

+37-3
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ pub(crate) fn render_field(
121121
let mut item = CompletionItem::new(
122122
SymbolKind::Field,
123123
ctx.source_range(),
124-
receiver.map_or_else(|| name.clone(), |receiver| format!("{}.{}", receiver, name).into()),
124+
field_with_receiver(receiver.as_ref(), &name),
125125
);
126126
item.set_relevance(CompletionRelevance {
127127
type_match: compute_type_match(ctx.completion, ty),
@@ -132,7 +132,7 @@ pub(crate) fn render_field(
132132
.set_documentation(field.docs(ctx.db()))
133133
.set_deprecated(is_deprecated)
134134
.lookup_by(name.clone());
135-
item.insert_text(escaped_name);
135+
item.insert_text(field_with_receiver(receiver.as_ref(), &escaped_name));
136136
if let Some(receiver) = &dot_access.receiver {
137137
if let Some(original) = ctx.completion.sema.original_ast_node(receiver.clone()) {
138138
if let Some(ref_match) = compute_ref_match(ctx.completion, ty) {
@@ -143,6 +143,11 @@ pub(crate) fn render_field(
143143
item.build()
144144
}
145145

146+
fn field_with_receiver(receiver: Option<&hir::Name>, field_name: &str) -> SmolStr {
147+
receiver
148+
.map_or_else(|| field_name.into(), |receiver| format!("{}.{}", receiver, field_name).into())
149+
}
150+
146151
pub(crate) fn render_tuple_field(
147152
ctx: RenderContext<'_>,
148153
receiver: Option<hir::Name>,
@@ -152,7 +157,7 @@ pub(crate) fn render_tuple_field(
152157
let mut item = CompletionItem::new(
153158
SymbolKind::Field,
154159
ctx.source_range(),
155-
receiver.map_or_else(|| field.to_string(), |receiver| format!("{}.{}", receiver, field)),
160+
field_with_receiver(receiver.as_ref(), &field.to_string()),
156161
);
157162
item.detail(ty.display(ctx.db()).to_string()).lookup_by(field.to_string());
158163
item.build()
@@ -1873,6 +1878,35 @@ impl r#trait for r#struct { type t$0 }
18731878
struct r#struct {}
18741879
trait r#trait { type r#type; }
18751880
impl r#trait for r#struct { type r#type = $0; }
1881+
"#,
1882+
)
1883+
}
1884+
1885+
#[test]
1886+
fn field_access_includes_self() {
1887+
check_edit(
1888+
"length",
1889+
r#"
1890+
struct S {
1891+
length: i32
1892+
}
1893+
1894+
impl S {
1895+
fn some_fn(&self) {
1896+
let l = len$0
1897+
}
1898+
}
1899+
"#,
1900+
r#"
1901+
struct S {
1902+
length: i32
1903+
}
1904+
1905+
impl S {
1906+
fn some_fn(&self) {
1907+
let l = self.length
1908+
}
1909+
}
18761910
"#,
18771911
)
18781912
}

0 commit comments

Comments
 (0)