Unnamed repository; edit this file 'description' to name the repository.
Add generic parameters for manual impl assist
The `impl_trait` function takes an optional `GenericParamList` to create the trait impl.
TheDoctor314 2021-11-10
parent 4f93fa1 · commit 05b368f
-rw-r--r--crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs9
-rw-r--r--crates/syntax/src/ast/make.rs9
2 files changed, 13 insertions, 5 deletions
diff --git a/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs b/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs
index a86fe3fa16..7aeaedf5f0 100644
--- a/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs
+++ b/crates/ide_assists/src/handlers/replace_derive_with_manual_impl.rs
@@ -3,7 +3,7 @@ use ide_db::helpers::{import_assets::NameToImport, mod_path_to_ast};
use ide_db::items_locator;
use itertools::Itertools;
use syntax::{
- ast::{self, make, AstNode, HasName},
+ ast::{self, make, AstNode, HasGenericParams, HasName},
SyntaxKind::{IDENT, WHITESPACE},
};
@@ -160,8 +160,11 @@ fn impl_def_from_trait(
if trait_items.is_empty() {
return None;
}
- let impl_def =
- make::impl_trait(trait_path.clone(), make::ext::ident_path(&annotated_name.text()));
+ let impl_def = make::impl_trait(
+ trait_path.clone(),
+ make::ext::ident_path(&annotated_name.text()),
+ adt.generic_param_list(),
+ );
let (impl_def, first_assoc_item) =
add_trait_assoc_items_to_impl(sema, trait_items, trait_, impl_def, target_scope);
diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs
index ed69973af9..e1938307cf 100644
--- a/crates/syntax/src/ast/make.rs
+++ b/crates/syntax/src/ast/make.rs
@@ -149,8 +149,13 @@ pub fn impl_(
ast_from_text(&format!("impl{} {}{} {{}}", params, ty, ty_params))
}
-pub fn impl_trait(trait_: ast::Path, ty: ast::Path) -> ast::Impl {
- ast_from_text(&format!("impl {} for {} {{}}", trait_, ty))
+pub fn impl_trait(
+ trait_: ast::Path,
+ ty: ast::Path,
+ ty_params: Option<ast::GenericParamList>,
+) -> ast::Impl {
+ let ty_params = ty_params.map_or_else(String::new, |params| params.to_string());
+ ast_from_text(&format!("impl{2} {} for {}{2} {{}}", trait_, ty, ty_params))
}
pub(crate) fn generic_arg_list() -> ast::GenericArgList {