about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYoshua Wuyts <yoshuawuyts@gmail.com>2021-10-14 14:18:12 +0200
committerYoshua Wuyts <yoshuawuyts@gmail.com>2021-10-14 14:18:12 +0200
commit68ffe91526510a4640d0d0d718a41f607f49dab3 (patch)
treebf0b3d9cfd668e18d0aa5ae8047649a097f413e8
parent8b6ea8ee868bc6f97b145335d792439449910a09 (diff)
downloadrust-68ffe91526510a4640d0d0d718a41f607f49dab3.tar.gz
rust-68ffe91526510a4640d0d0d718a41f607f49dab3.zip
Add support for tuple structs
-rw-r--r--crates/ide_assists/src/handlers/generate_delegate_methods.rs51
1 files changed, 47 insertions, 4 deletions
diff --git a/crates/ide_assists/src/handlers/generate_delegate_methods.rs b/crates/ide_assists/src/handlers/generate_delegate_methods.rs
index b6cf353682b..ecebc792511 100644
--- a/crates/ide_assists/src/handlers/generate_delegate_methods.rs
+++ b/crates/ide_assists/src/handlers/generate_delegate_methods.rs
@@ -48,9 +48,21 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext)
     let strukt = ctx.find_node_at_offset::<ast::Struct>()?;
     let strukt_name = strukt.name()?;
 
-    let field = ctx.find_node_at_offset::<ast::RecordField>()?;
-    let field_name = field.name()?;
-    let field_ty = field.ty()?;
+    let (field_name, field_ty) = match ctx.find_node_at_offset::<ast::RecordField>() {
+        Some(field) => {
+            let field_name = field.name()?;
+            let field_ty = field.ty()?;
+            (format!("{}", field_name), field_ty)
+        }
+        None => {
+            let field = ctx.find_node_at_offset::<ast::TupleField>()?;
+            let field_list = ctx.find_node_at_offset::<ast::TupleFieldList>()?;
+            let field_list_index =
+                field_list.syntax().children().into_iter().position(|s| &s == field.syntax())?;
+            let field_ty = field.ty()?;
+            (format!("{}", field_list_index), field_ty)
+        }
+    };
 
     let sema_field_ty = ctx.sema.resolve_type(&field_ty)?;
     let krate = sema_field_ty.krate(ctx.db());
@@ -88,7 +100,7 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext)
                 let params =
                     method_source.param_list().unwrap_or_else(|| make::param_list(None, []));
                 let tail_expr = make::expr_method_call(
-                    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
+                    make::ext::field_from_idents(["self", &field_name]).unwrap(), // This unwrap is ok because we have at least 1 arg in the list
                     make::name_ref(&method_name.to_string()),
                     make::arg_list([]),
                 );
@@ -226,6 +238,37 @@ impl Person {
     }
 
     #[test]
+    fn test_generate_delegate_tuple_struct() {
+        check_assist(
+            generate_delegate_methods,
+            r#"
+struct Age(u8);
+impl Age {
+    fn age(&self) -> u8 {
+        self.0
+    }
+}
+
+struct Person(A$0ge);"#,
+            r#"
+struct Age(u8);
+impl Age {
+    fn age(&self) -> u8 {
+        self.0
+    }
+}
+
+struct Person(Age);
+
+impl Person {
+    $0fn age(&self) -> u8 {
+        self.0.age()
+    }
+}"#,
+        );
+    }
+
+    #[test]
     fn test_generate_delegate_enable_all_attributes() {
         check_assist(
             generate_delegate_methods,