about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTarek <tareknaser360@gmail.com>2024-10-30 17:56:02 +0300
committerTarek <tareknaser360@gmail.com>2024-12-04 14:50:03 +0200
commit797eb3ebe8b2fcd41f4b03ae7f8aa72f7a47e1a8 (patch)
tree09e8ae9809aa7728ccc7db34bc7a790d92f6850d
parent7fa84a3f4b74b7ab68553b5e441dc951ce9050a5 (diff)
downloadrust-797eb3ebe8b2fcd41f4b03ae7f8aa72f7a47e1a8.tar.gz
rust-797eb3ebe8b2fcd41f4b03ae7f8aa72f7a47e1a8.zip
define syntax_editor_add_generic_param
Signed-off-by: Tarek <tareknaser360@gmail.com>
-rw-r--r--src/tools/rust-analyzer/crates/ide-assists/src/handlers/introduce_named_generic.rs8
-rw-r--r--src/tools/rust-analyzer/crates/syntax/src/ast/edit_in_place.rs24
-rw-r--r--src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs9
3 files changed, 34 insertions, 7 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/introduce_named_generic.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/introduce_named_generic.rs
index cf9d58ca0d2..ae30dacfd01 100644
--- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/introduce_named_generic.rs
+++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/introduce_named_generic.rs
@@ -56,13 +56,11 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
             )
             .for_impl_trait_as_generic(&impl_trait_type);
 
-            let type_param = make
-                .type_param(make.name(&type_param_name), Some(type_bound_list))
-                .clone_for_update();
-            let new_ty = make.ty(&type_param_name).clone_for_update();
+            let type_param = make.type_param(make.name(&type_param_name), Some(type_bound_list));
+            let new_ty = make.ty(&type_param_name);
 
             editor.replace(impl_trait_type.syntax(), new_ty.syntax());
-            fn_generic_param_list.add_generic_param(type_param.into());
+            fn_generic_param_list.syntax_editor_add_generic_param(&mut editor, type_param.into());
 
             if let Some(cap) = ctx.config.snippet_cap {
                 if let Some(generic_param) =
diff --git a/src/tools/rust-analyzer/crates/syntax/src/ast/edit_in_place.rs b/src/tools/rust-analyzer/crates/syntax/src/ast/edit_in_place.rs
index f1286e7aa21..2b152a45c9a 100644
--- a/src/tools/rust-analyzer/crates/syntax/src/ast/edit_in_place.rs
+++ b/src/tools/rust-analyzer/crates/syntax/src/ast/edit_in_place.rs
@@ -7,6 +7,7 @@ use parser::{SyntaxKind, T};
 use crate::{
     algo::{self, neighbor},
     ast::{self, edit::IndentLevel, make, HasGenericArgs, HasGenericParams},
+    syntax_editor::SyntaxEditor,
     ted::{self, Position},
     AstNode, AstToken, Direction, SyntaxElement,
     SyntaxKind::{ATTR, COMMENT, WHITESPACE},
@@ -257,6 +258,29 @@ impl ast::GenericParamList {
         }
     }
 
+    pub fn syntax_editor_add_generic_param(
+        &self,
+        editor: &mut SyntaxEditor,
+        generic_param: ast::GenericParam,
+    ) {
+        match self.generic_params().last() {
+            Some(last_param) => {
+                let position = crate::syntax_editor::Position::after(last_param.syntax());
+                let elements = vec![
+                    make::token(T![,]).into(),
+                    make::tokens::single_space().into(),
+                    generic_param.syntax().clone().into(),
+                ];
+                editor.insert_all(position, elements);
+            }
+            None => {
+                let after_l_angle =
+                    crate::syntax_editor::Position::after(self.l_angle_token().unwrap());
+                editor.insert(after_l_angle, generic_param.syntax());
+            }
+        }
+    }
+
     /// Removes the existing generic param
     pub fn remove_generic_param(&self, generic_param: ast::GenericParam) {
         if let Some(previous) = generic_param.syntax().prev_sibling() {
diff --git a/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs b/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs
index 680ba9381dd..35c467a1e8c 100644
--- a/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs
+++ b/src/tools/rust-analyzer/crates/syntax/src/ast/syntax_factory/constructors.rs
@@ -2,7 +2,7 @@
 use itertools::Itertools;
 
 use crate::{
-    ast::{self, make, HasName},
+    ast::{self, make, HasName, HasTypeBounds},
     syntax_editor::SyntaxMappingBuilder,
     AstNode,
 };
@@ -15,7 +15,6 @@ impl SyntaxFactory {
     }
 
     pub fn ty(&self, text: &str) -> ast::Type {
-        // FIXME: Is there anything to map here?
         make::ty(text).clone_for_update()
     }
 
@@ -29,6 +28,12 @@ impl SyntaxFactory {
         if let Some(mut mapping) = self.mappings() {
             let mut builder = SyntaxMappingBuilder::new(ast.syntax().clone());
             builder.map_node(name.syntax().clone(), ast.name().unwrap().syntax().clone());
+            if let Some(input) = bounds {
+                builder.map_node(
+                    input.syntax().clone(),
+                    ast.type_bound_list().unwrap().syntax().clone(),
+                );
+            }
             builder.finish(&mut mapping);
         }