diff options
| author | bors <bors@rust-lang.org> | 2022-07-24 14:11:35 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-07-24 14:11:35 +0000 |
| commit | 7e2b983fd459977e11026683ee4afb9598960a4c (patch) | |
| tree | 86d85488ae9dd9589144d7066f66a589d36336e6 | |
| parent | 537cc1eec5bc0f26df112c0cdb4a16c793189ab0 (diff) | |
| parent | 77acb5c162957d9748d1f35261982591d9a85e22 (diff) | |
| download | rust-7e2b983fd459977e11026683ee4afb9598960a4c.tar.gz rust-7e2b983fd459977e11026683ee4afb9598960a4c.zip | |
Auto merge of #12861 - DorianListens:dscheidt/complete-field, r=DorianListens
fix: Autocomplete for struct fields includes receiver fixes #12857
| -rw-r--r-- | crates/ide-completion/src/render.rs | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs index 3f25b294e01..9b25964a608 100644 --- a/crates/ide-completion/src/render.rs +++ b/crates/ide-completion/src/render.rs @@ -121,7 +121,7 @@ pub(crate) fn render_field( let mut item = CompletionItem::new( SymbolKind::Field, 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 { type_match: compute_type_match(ctx.completion, ty), @@ -132,7 +132,7 @@ pub(crate) fn render_field( .set_documentation(field.docs(ctx.db())) .set_deprecated(is_deprecated) .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(original) = ctx.completion.sema.original_ast_node(receiver.clone()) { if let Some(ref_match) = compute_ref_match(ctx.completion, ty) { @@ -143,6 +143,11 @@ pub(crate) fn render_field( 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( ctx: RenderContext<'_>, receiver: Option<hir::Name>, @@ -152,7 +157,7 @@ pub(crate) fn render_tuple_field( let mut item = CompletionItem::new( SymbolKind::Field, 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.build() @@ -1876,4 +1881,33 @@ 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 + } +} +"#, + ) + } } |
