Skip to content

Commit

Permalink
Auto merge of #14707 - jhgg:fix/generate-delegate-method-filtering, r…
Browse files Browse the repository at this point in the history
…=lnicola

fix: generate delegate methods filters out functions that already exist on the struct's impls

fixes #14703
  • Loading branch information
bors committed May 2, 2023
2 parents 2fdd1ac + a86c431 commit 9c0c13e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
25 changes: 24 additions & 1 deletion crates/ide-assists/src/handlers/generate_delegate_methods.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
for method in methods {
let adt = ast::Adt::Struct(strukt.clone());
let name = method.name(ctx.db()).to_string();
let impl_def = find_struct_impl(ctx, &adt, &[name]).flatten();
// if `find_struct_impl` returns None, that means that a function named `name` already exists.
let Some(impl_def) = find_struct_impl(ctx, &adt, &[name]) else { continue; };
acc.add_group(
&GroupLabel("Generate delegate methods…".to_owned()),
AssistId("generate_delegate_methods", AssistKind::Generate),
Expand Down Expand Up @@ -380,4 +381,26 @@ struct Person {
}"#,
)
}

#[test]
fn test_generate_not_eligible_if_fn_exists() {
check_assist_not_applicable(
generate_delegate_methods,
r#"
struct Age(u8);
impl Age {
fn age(&self) -> u8 {
self.0
}
}
struct Person {
ag$0e: Age,
}
impl Person {
fn age(&self) -> u8 { 0 }
}
"#,
);
}
}
7 changes: 6 additions & 1 deletion crates/ide-assists/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,12 @@ fn calc_depth(pat: &ast::Pat, depth: usize) -> usize {

/// `find_struct_impl` looks for impl of a struct, but this also has additional feature
/// where it takes a list of function names and check if they exist inside impl_, if
/// even one match is found, it returns None
/// even one match is found, it returns None.
///
/// That means this function can have 3 potential return values:
/// - `None`: an impl exists, but one of the function names within the impl matches one of the provided names.
/// - `Some(None)`: no impl exists.
/// - `Some(Some(_))`: an impl exists, with no matching function names.
pub(crate) fn find_struct_impl(
ctx: &AssistContext<'_>,
adt: &ast::Adt,
Expand Down

0 comments on commit 9c0c13e

Please sign in to comment.