@@ -121,7 +121,7 @@ pub(crate) fn render_field(
121
121
let mut item = CompletionItem :: new (
122
122
SymbolKind :: Field ,
123
123
ctx. source_range ( ) ,
124
- receiver. map_or_else ( || name . clone ( ) , |receiver| format ! ( "{}.{}" , receiver , name) . into ( ) ) ,
124
+ field_with_receiver ( receiver. as_ref ( ) , & name) ,
125
125
) ;
126
126
item. set_relevance ( CompletionRelevance {
127
127
type_match : compute_type_match ( ctx. completion , ty) ,
@@ -132,7 +132,7 @@ pub(crate) fn render_field(
132
132
. set_documentation ( field. docs ( ctx. db ( ) ) )
133
133
. set_deprecated ( is_deprecated)
134
134
. lookup_by ( name. clone ( ) ) ;
135
- item. insert_text ( escaped_name) ;
135
+ item. insert_text ( field_with_receiver ( receiver . as_ref ( ) , & escaped_name) ) ;
136
136
if let Some ( receiver) = & dot_access. receiver {
137
137
if let Some ( original) = ctx. completion . sema . original_ast_node ( receiver. clone ( ) ) {
138
138
if let Some ( ref_match) = compute_ref_match ( ctx. completion , ty) {
@@ -143,6 +143,11 @@ pub(crate) fn render_field(
143
143
item. build ( )
144
144
}
145
145
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
+
146
151
pub ( crate ) fn render_tuple_field (
147
152
ctx : RenderContext < ' _ > ,
148
153
receiver : Option < hir:: Name > ,
@@ -152,7 +157,7 @@ pub(crate) fn render_tuple_field(
152
157
let mut item = CompletionItem :: new (
153
158
SymbolKind :: Field ,
154
159
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 ( ) ) ,
156
161
) ;
157
162
item. detail ( ty. display ( ctx. db ( ) ) . to_string ( ) ) . lookup_by ( field. to_string ( ) ) ;
158
163
item. build ( )
@@ -1873,6 +1878,35 @@ impl r#trait for r#struct { type t$0 }
1873
1878
struct r#struct {}
1874
1879
trait r#trait { type r#type; }
1875
1880
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
+ }
1876
1910
"# ,
1877
1911
)
1878
1912
}
0 commit comments