]> git.lizzy.rs Git - rust.git/commitdiff
Add `GenericParamList::to_generic_args`
authorDropDemBits <r3usrlnd@gmail.com>
Sun, 9 Oct 2022 21:58:55 +0000 (17:58 -0400)
committerDropDemBits <r3usrlnd@gmail.com>
Sun, 9 Oct 2022 22:44:23 +0000 (18:44 -0400)
crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs
crates/syntax/src/ast/edit_in_place.rs

index 8d5cab283d0616d3297e864a782f61e4965975cd..970e948dfd930f4226be3c9697f0e19dead8d044 100644 (file)
@@ -9,7 +9,7 @@
     search::FileReference,
     FxHashSet, RootDatabase,
 };
-use itertools::{Itertools, Position};
+use itertools::Itertools;
 use syntax::{
     ast::{
         self, edit::IndentLevel, edit_in_place::Indent, make, AstNode, HasAttrs, HasGenericParams,
@@ -298,37 +298,7 @@ fn update_variant(variant: &ast::Variant, generics: Option<ast::GenericParamList
     let name = variant.name()?;
     let ty = generics
         .filter(|generics| generics.generic_params().count() > 0)
-        .map(|generics| {
-            let mut generic_str = String::with_capacity(8);
-
-            for (p, more) in generics.generic_params().with_position().map(|p| match p {
-                Position::First(p) | Position::Middle(p) => (p, true),
-                Position::Last(p) | Position::Only(p) => (p, false),
-            }) {
-                match p {
-                    ast::GenericParam::ConstParam(konst) => {
-                        if let Some(name) = konst.name() {
-                            generic_str.push_str(name.text().as_str());
-                        }
-                    }
-                    ast::GenericParam::LifetimeParam(lt) => {
-                        if let Some(lt) = lt.lifetime() {
-                            generic_str.push_str(lt.text().as_str());
-                        }
-                    }
-                    ast::GenericParam::TypeParam(ty) => {
-                        if let Some(name) = ty.name() {
-                            generic_str.push_str(name.text().as_str());
-                        }
-                    }
-                }
-                if more {
-                    generic_str.push_str(", ");
-                }
-            }
-
-            make::ty(&format!("{}<{}>", &name.text(), &generic_str))
-        })
+        .map(|generics| make::ty(&format!("{}{}", &name.text(), generics.to_generic_args())))
         .unwrap_or_else(|| make::ty(&name.text()));
 
     // change from a record to a tuple field list
index eadebbe8a212bab90ff4a0857012ec762611865b..7d632352828ef8fe43cbc6125c51c6d832ef0e8a 100644 (file)
@@ -235,6 +235,23 @@ pub fn add_generic_param(&self, generic_param: ast::GenericParam) {
             }
         }
     }
+
+    /// Extracts the const, type, and lifetime names into a new [`ast::GenericParamList`]
+    pub fn to_generic_args(&self) -> ast::GenericParamList {
+        let params = self.generic_params().filter_map(|param| match param {
+            ast::GenericParam::ConstParam(it) => {
+                Some(ast::GenericParam::TypeParam(make::type_param(it.name()?, None)))
+            }
+            ast::GenericParam::LifetimeParam(it) => {
+                Some(ast::GenericParam::LifetimeParam(make::lifetime_param(it.lifetime()?)))
+            }
+            ast::GenericParam::TypeParam(it) => {
+                Some(ast::GenericParam::TypeParam(make::type_param(it.name()?, None)))
+            }
+        });
+
+        make::generic_param_list(params)
+    }
 }
 
 impl ast::WhereClause {