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.rs | 35 |
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, ¶ms); + 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(¶ms)) + .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) } }"#, ); |