@@ -48,9 +48,21 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext)
48
48
let strukt = ctx. find_node_at_offset :: < ast:: Struct > ( ) ?;
49
49
let strukt_name = strukt. name ( ) ?;
50
50
51
- let field = ctx. find_node_at_offset :: < ast:: RecordField > ( ) ?;
52
- let field_name = field. name ( ) ?;
53
- let field_ty = field. ty ( ) ?;
51
+ let ( field_name, field_ty) = match ctx. find_node_at_offset :: < ast:: RecordField > ( ) {
52
+ Some ( field) => {
53
+ let field_name = field. name ( ) ?;
54
+ let field_ty = field. ty ( ) ?;
55
+ ( format ! ( "{}" , field_name) , field_ty)
56
+ }
57
+ None => {
58
+ let field = ctx. find_node_at_offset :: < ast:: TupleField > ( ) ?;
59
+ let field_list = ctx. find_node_at_offset :: < ast:: TupleFieldList > ( ) ?;
60
+ let field_list_index =
61
+ field_list. syntax ( ) . children ( ) . into_iter ( ) . position ( |s| & s == field. syntax ( ) ) ?;
62
+ let field_ty = field. ty ( ) ?;
63
+ ( format ! ( "{}" , field_list_index) , field_ty)
64
+ }
65
+ } ;
54
66
55
67
let sema_field_ty = ctx. sema . resolve_type ( & field_ty) ?;
56
68
let krate = sema_field_ty. krate ( ctx. db ( ) ) ;
@@ -88,7 +100,7 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext)
88
100
let params =
89
101
method_source. param_list ( ) . unwrap_or_else ( || make:: param_list ( None , [ ] ) ) ;
90
102
let tail_expr = make:: expr_method_call (
91
- make:: ext:: field_from_idents ( [ "self" , & field_name. to_string ( ) ] ) . unwrap ( ) , // This unwrap is ok because we have at least 1 arg in the list
103
+ make:: ext:: field_from_idents ( [ "self" , & field_name] ) . unwrap ( ) , // This unwrap is ok because we have at least 1 arg in the list
92
104
make:: name_ref ( & method_name. to_string ( ) ) ,
93
105
make:: arg_list ( [ ] ) ,
94
106
) ;
@@ -225,6 +237,37 @@ impl Person {
225
237
) ;
226
238
}
227
239
240
+ #[ test]
241
+ fn test_generate_delegate_tuple_struct ( ) {
242
+ check_assist (
243
+ generate_delegate_methods,
244
+ r#"
245
+ struct Age(u8);
246
+ impl Age {
247
+ fn age(&self) -> u8 {
248
+ self.0
249
+ }
250
+ }
251
+
252
+ struct Person(A$0ge);"# ,
253
+ r#"
254
+ struct Age(u8);
255
+ impl Age {
256
+ fn age(&self) -> u8 {
257
+ self.0
258
+ }
259
+ }
260
+
261
+ struct Person(Age);
262
+
263
+ impl Person {
264
+ $0fn age(&self) -> u8 {
265
+ self.0.age()
266
+ }
267
+ }"# ,
268
+ ) ;
269
+ }
270
+
228
271
#[ test]
229
272
fn test_generate_delegate_enable_all_attributes ( ) {
230
273
check_assist (
0 commit comments