diff options
| author | Yoshua Wuyts <yoshuawuyts@gmail.com> | 2021-10-14 14:18:12 +0200 |
|---|---|---|
| committer | Yoshua Wuyts <yoshuawuyts@gmail.com> | 2021-10-14 14:18:12 +0200 |
| commit | 68ffe91526510a4640d0d0d718a41f607f49dab3 (patch) | |
| tree | bf0b3d9cfd668e18d0aa5ae8047649a097f413e8 | |
| parent | 8b6ea8ee868bc6f97b145335d792439449910a09 (diff) | |
| download | rust-68ffe91526510a4640d0d0d718a41f607f49dab3.tar.gz rust-68ffe91526510a4640d0d0d718a41f607f49dab3.zip | |
Add support for tuple structs
| -rw-r--r-- | crates/ide_assists/src/handlers/generate_delegate_methods.rs | 51 |
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, |
