Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-assists/src/handlers/generate_trait_from_impl.rs30
-rw-r--r--crates/ide-assists/src/tests/generated.rs4
2 files changed, 21 insertions, 13 deletions
diff --git a/crates/ide-assists/src/handlers/generate_trait_from_impl.rs b/crates/ide-assists/src/handlers/generate_trait_from_impl.rs
index 7e858cdc87..9a8f3c6d88 100644
--- a/crates/ide-assists/src/handlers/generate_trait_from_impl.rs
+++ b/crates/ide-assists/src/handlers/generate_trait_from_impl.rs
@@ -47,7 +47,7 @@ use syntax::{
// };
// }
//
-// trait ${0:NewTrait}<const N: usize> {
+// trait ${0:Create}<const N: usize> {
// // Used as an associated constant.
// const CONST_ASSOC: usize = N * 4;
//
@@ -56,7 +56,7 @@ use syntax::{
// const_maker! {i32, 7}
// }
//
-// impl<const N: usize> ${0:NewTrait}<N> for Foo<N> {
+// impl<const N: usize> ${0:Create}<N> for Foo<N> {
// // Used as an associated constant.
// const CONST_ASSOC: usize = N * 4;
//
@@ -109,7 +109,7 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
};
let trait_ast = make::trait_(
false,
- "NewTrait",
+ &trait_name(&impl_assoc_items).text(),
impl_ast.generic_param_list(),
impl_ast.where_clause(),
trait_items,
@@ -163,6 +163,14 @@ pub(crate) fn generate_trait_from_impl(acc: &mut Assists, ctx: &AssistContext<'_
Some(())
}
+fn trait_name(items: &ast::AssocItemList) -> ast::Name {
+ items
+ .assoc_items()
+ .find_map(|x| if let ast::AssocItem::Fn(f) = x { f.name() } else { None })
+ .map(|name| make::name(&stdx::to_camel_case(&name.text())))
+ .unwrap_or_else(|| make::name("NewTrait"))
+}
+
/// `E0449` Trait items always share the visibility of their trait
fn remove_items_visibility(editor: &mut SyntaxEditor, item: &ast::AssocItem) {
if let Some(has_vis) = ast::AnyHasVisibility::cast(item.syntax().clone()) {
@@ -240,11 +248,11 @@ impl F$0oo {
r#"
struct Foo(f64);
-trait NewTrait {
+trait Add {
fn add(&mut self, x: f64);
}
-impl NewTrait for Foo {
+impl Add for Foo {
fn add(&mut self, x: f64) {
self.0 += x;
}
@@ -271,7 +279,7 @@ impl F$0oo {
r#"
struct Foo(f64);
-trait NewTrait {
+trait Add {
/// Add `x`
///
/// # Examples
@@ -279,7 +287,7 @@ trait NewTrait {
fn add(&mut self, x: f64);
}
-impl NewTrait for Foo {
+impl Add for Foo {
#[cfg(true)]
fn add(&mut self, x: f64) {
self.0 += x;
@@ -389,11 +397,11 @@ impl F$0oo {
r#"
struct Foo;
-trait NewTrait {
+trait AFunc {
fn a_func() -> Option<()>;
}
-impl NewTrait for Foo {
+impl AFunc for Foo {
fn a_func() -> Option<()> {
Some(())
}
@@ -423,11 +431,11 @@ mod a {
}"#,
r#"
mod a {
- trait NewTrait {
+ trait Foo {
fn foo();
}
- impl NewTrait for S {
+ impl Foo for S {
fn foo() {}
}
}"#,
diff --git a/crates/ide-assists/src/tests/generated.rs b/crates/ide-assists/src/tests/generated.rs
index 3040509000..8ba46799d5 100644
--- a/crates/ide-assists/src/tests/generated.rs
+++ b/crates/ide-assists/src/tests/generated.rs
@@ -2282,7 +2282,7 @@ macro_rules! const_maker {
};
}
-trait ${0:NewTrait}<const N: usize> {
+trait ${0:Create}<const N: usize> {
// Used as an associated constant.
const CONST_ASSOC: usize = N * 4;
@@ -2291,7 +2291,7 @@ trait ${0:NewTrait}<const N: usize> {
const_maker! {i32, 7}
}
-impl<const N: usize> ${0:NewTrait}<N> for Foo<N> {
+impl<const N: usize> ${0:Create}<N> for Foo<N> {
// Used as an associated constant.
const CONST_ASSOC: usize = N * 4;