Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/generate_delegate_trait.rs')
-rw-r--r--crates/ide-assists/src/handlers/generate_delegate_trait.rs35
1 files changed, 23 insertions, 12 deletions
diff --git a/crates/ide-assists/src/handlers/generate_delegate_trait.rs b/crates/ide-assists/src/handlers/generate_delegate_trait.rs
index c22d19574f..a55323eb59 100644
--- a/crates/ide-assists/src/handlers/generate_delegate_trait.rs
+++ b/crates/ide-assists/src/handlers/generate_delegate_trait.rs
@@ -584,7 +584,7 @@ fn resolve_name_conflicts(
for old_strukt_param in old_strukt_params.generic_params() {
// Get old name from `strukt`
- let mut name = SmolStr::from(match &old_strukt_param {
+ let name = SmolStr::from(match &old_strukt_param {
ast::GenericParam::ConstParam(c) => c.name()?.to_string(),
ast::GenericParam::LifetimeParam(l) => {
l.lifetime()?.lifetime_ident_token()?.to_string()
@@ -593,8 +593,19 @@ fn resolve_name_conflicts(
});
// The new name cannot be conflicted with generics in trait, and the renamed names.
- name = suggest_name::for_unique_generic_name(&name, old_impl_params);
- name = suggest_name::for_unique_generic_name(&name, &params);
+ let param_list_to_names = |param_list: &GenericParamList| {
+ param_list.generic_params().flat_map(|param| match param {
+ ast::GenericParam::TypeParam(t) => t.name().map(|name| name.to_string()),
+ p => Some(p.to_string()),
+ })
+ };
+ let existing_names = param_list_to_names(old_impl_params)
+ .chain(param_list_to_names(&params))
+ .collect_vec();
+ let mut name_generator = suggest_name::NameGenerator::new_with_names(
+ existing_names.iter().map(|s| s.as_str()),
+ );
+ let name = name_generator.suggest_name(&name);
match old_strukt_param {
ast::GenericParam::ConstParam(c) => {
if let Some(const_ty) = c.ty() {
@@ -1213,9 +1224,9 @@ struct S<T> {
b : B<T>,
}
-impl<T0> Trait<T0> for S<T0> {
- fn f(&self, a: T0) -> T0 {
- <B<T0> as Trait<T0>>::f(&self.b, a)
+impl<T1> Trait<T1> for S<T1> {
+ fn f(&self, a: T1) -> T1 {
+ <B<T1> as Trait<T1>>::f(&self.b, a)
}
}
"#,
@@ -1527,12 +1538,12 @@ where
b : B<T, T1>,
}
-impl<T, T2, T10> Trait<T> for S<T2, T10>
+impl<T, T2, T3> Trait<T> for S<T2, T3>
where
- T10: AnotherTrait
+ T3: AnotherTrait
{
fn f(&self, a: T) -> T {
- <B<T2, T10> as Trait<T>>::f(&self.b, a)
+ <B<T2, T3> as Trait<T>>::f(&self.b, a)
}
}"#,
);
@@ -1589,12 +1600,12 @@ where
b : B<T>,
}
-impl<T, T0> Trait<T> for S<T0>
+impl<T, T2> Trait<T> for S<T2>
where
- T0: AnotherTrait
+ T2: AnotherTrait
{
fn f(&self, a: T) -> T {
- <B<T0> as Trait<T>>::f(&self.b, a)
+ <B<T2> as Trait<T>>::f(&self.b, a)
}
}"#,
);