Skip to content

Commit f3cce5f

Browse files
committedOct 20, 2022
Auto merge of rust-lang#13365 - feniljain:master, r=Veykril
feat: add multiple getters mode in `generate_getter` This commit adds two modes to generate_getter action. First, the plain old working on single fields. Second, working on a selected range of fields. Should partially solve rust-lang#13246 If this gets approved will create a separate PR for setters version of the same ### Points to help in review: - `generate_getter_from_record_info` contains code which is mostly taken from assist before refactor - Same goes for `parse_record_fields` - There are changes in other assists, as one of the methods in utils named `find_struct_impl` is changed, before it used to accept a single `fn_name`, now it takes a list of function names to check against. All old impls are updated to create a small list to pass their single element. ### Assumptions: - If any of the fields have an implementation, the action will quit.
2 parents 32614e2 + 5bff6c5 commit f3cce5f

8 files changed

+292
-69
lines changed
 

‎crates/ide-assists/src/handlers/generate_delegate_methods.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,14 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
5151
Some(field) => {
5252
let field_name = field.name()?;
5353
let field_ty = field.ty()?;
54-
(format!("{field_name}"), field_ty, field.syntax().text_range())
54+
(field_name.to_string(), field_ty, field.syntax().text_range())
5555
}
5656
None => {
5757
let field = ctx.find_node_at_offset::<ast::TupleField>()?;
5858
let field_list = ctx.find_node_at_offset::<ast::TupleFieldList>()?;
5959
let field_list_index = field_list.fields().position(|it| it == field)?;
6060
let field_ty = field.ty()?;
61-
(format!("{field_list_index}"), field_ty, field.syntax().text_range())
61+
(field_list_index.to_string(), field_ty, field.syntax().text_range())
6262
}
6363
};
6464

@@ -77,13 +77,11 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
7777
for method in methods {
7878
let adt = ast::Adt::Struct(strukt.clone());
7979
let name = method.name(ctx.db()).to_string();
80-
let impl_def = find_struct_impl(ctx, &adt, &name).flatten();
81-
let method_name = method.name(ctx.db());
82-
80+
let impl_def = find_struct_impl(ctx, &adt, &[name]).flatten();
8381
acc.add_group(
8482
&GroupLabel("Generate delegate methods…".to_owned()),
8583
AssistId("generate_delegate_methods", AssistKind::Generate),
86-
format!("Generate delegate for `{field_name}.{method_name}()`"),
84+
format!("Generate delegate for `{}.{}()`", field_name, method.name(ctx.db())),
8785
target,
8886
|builder| {
8987
// Create the function
@@ -158,7 +156,7 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
158156
}
159157
None => {
160158
let offset = strukt.syntax().text_range().end();
161-
let snippet = format!("\n\n{impl_def}");
159+
let snippet = format!("\n\n{}", impl_def.syntax());
162160
builder.insert(offset, snippet);
163161
}
164162
}

‎crates/ide-assists/src/handlers/generate_enum_is_method.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub(crate) fn generate_enum_is_method(acc: &mut Assists, ctx: &AssistContext<'_>
5252
let fn_name = format!("is_{}", &to_lower_snake_case(&variant_name.text()));
5353

5454
// Return early if we've found an existing new fn
55-
let impl_def = find_struct_impl(ctx, &parent_enum, &fn_name)?;
55+
let impl_def = find_struct_impl(ctx, &parent_enum, &[fn_name.clone()])?;
5656

5757
let target = variant.syntax().text_range();
5858
acc.add_group(

‎crates/ide-assists/src/handlers/generate_enum_projection_method.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ fn generate_enum_projection_method(
147147
let fn_name = format!("{}_{}", fn_name_prefix, &to_lower_snake_case(&variant_name.text()));
148148

149149
// Return early if we've found an existing new fn
150-
let impl_def = find_struct_impl(ctx, &parent_enum, &fn_name)?;
150+
let impl_def = find_struct_impl(ctx, &parent_enum, &[fn_name.clone()])?;
151151

152152
let target = variant.syntax().text_range();
153153
acc.add_group(

‎crates/ide-assists/src/handlers/generate_function.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ fn get_adt_source(
198198
let file = ctx.sema.parse(range.file_id);
199199
let adt_source =
200200
ctx.sema.find_node_at_offset_with_macros(file.syntax(), range.range.start())?;
201-
find_struct_impl(ctx, &adt_source, fn_name).map(|impl_| (impl_, range.file_id))
201+
find_struct_impl(ctx, &adt_source, &[fn_name.to_string()]).map(|impl_| (impl_, range.file_id))
202202
}
203203

204204
struct FunctionTemplate {

0 commit comments

Comments
 (0)