Skip to content

Commit 68ffe91

Browse files
committed
Add support for tuple structs
1 parent 8b6ea8e commit 68ffe91

File tree

1 file changed

+47
-4
lines changed

1 file changed

+47
-4
lines changed

crates/ide_assists/src/handlers/generate_delegate_methods.rs

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,21 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext)
4848
let strukt = ctx.find_node_at_offset::<ast::Struct>()?;
4949
let strukt_name = strukt.name()?;
5050

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+
};
5466

5567
let sema_field_ty = ctx.sema.resolve_type(&field_ty)?;
5668
let krate = sema_field_ty.krate(ctx.db());
@@ -88,7 +100,7 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext)
88100
let params =
89101
method_source.param_list().unwrap_or_else(|| make::param_list(None, []));
90102
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
92104
make::name_ref(&method_name.to_string()),
93105
make::arg_list([]),
94106
);
@@ -225,6 +237,37 @@ impl Person {
225237
);
226238
}
227239

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+
228271
#[test]
229272
fn test_generate_delegate_enable_all_attributes() {
230273
check_assist(

0 commit comments

Comments
 (0)