@@ -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+
146151pub ( 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 }
18731878struct r#struct {}
18741879trait r#trait { type r#type; }
18751880impl 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