mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-03 07:04:49 +00:00
Add support for tuple structs
This commit is contained in:
parent
8b6ea8ee86
commit
68ffe91526
1 changed files with 47 additions and 4 deletions
|
@ -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 = ctx.find_node_at_offset::<ast::Struct>()?;
|
||||||
let strukt_name = strukt.name()?;
|
let strukt_name = strukt.name()?;
|
||||||
|
|
||||||
let field = ctx.find_node_at_offset::<ast::RecordField>()?;
|
let (field_name, field_ty) = match ctx.find_node_at_offset::<ast::RecordField>() {
|
||||||
let field_name = field.name()?;
|
Some(field) => {
|
||||||
let field_ty = field.ty()?;
|
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 sema_field_ty = ctx.sema.resolve_type(&field_ty)?;
|
||||||
let krate = sema_field_ty.krate(ctx.db());
|
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 =
|
let params =
|
||||||
method_source.param_list().unwrap_or_else(|| make::param_list(None, []));
|
method_source.param_list().unwrap_or_else(|| make::param_list(None, []));
|
||||||
let tail_expr = make::expr_method_call(
|
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::name_ref(&method_name.to_string()),
|
||||||
make::arg_list([]),
|
make::arg_list([]),
|
||||||
);
|
);
|
||||||
|
@ -225,6 +237,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]
|
#[test]
|
||||||
fn test_generate_delegate_enable_all_attributes() {
|
fn test_generate_delegate_enable_all_attributes() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue