Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 75f6417

Browse files
committed
Add GenericParamList::to_generic_args
1 parent 8437e4b commit 75f6417

File tree

2 files changed

+19
-32
lines changed

2 files changed

+19
-32
lines changed

crates/ide-assists/src/handlers/extract_struct_from_enum_variant.rs

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use ide_db::{
99
search::FileReference,
1010
FxHashSet, RootDatabase,
1111
};
12-
use itertools::{Itertools, Position};
12+
use itertools::Itertools;
1313
use syntax::{
1414
ast::{
1515
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
298298
let name = variant.name()?;
299299
let ty = generics
300300
.filter(|generics| generics.generic_params().count() > 0)
301-
.map(|generics| {
302-
let mut generic_str = String::with_capacity(8);
303-
304-
for (p, more) in generics.generic_params().with_position().map(|p| match p {
305-
Position::First(p) | Position::Middle(p) => (p, true),
306-
Position::Last(p) | Position::Only(p) => (p, false),
307-
}) {
308-
match p {
309-
ast::GenericParam::ConstParam(konst) => {
310-
if let Some(name) = konst.name() {
311-
generic_str.push_str(name.text().as_str());
312-
}
313-
}
314-
ast::GenericParam::LifetimeParam(lt) => {
315-
if let Some(lt) = lt.lifetime() {
316-
generic_str.push_str(lt.text().as_str());
317-
}
318-
}
319-
ast::GenericParam::TypeParam(ty) => {
320-
if let Some(name) = ty.name() {
321-
generic_str.push_str(name.text().as_str());
322-
}
323-
}
324-
}
325-
if more {
326-
generic_str.push_str(", ");
327-
}
328-
}
329-
330-
make::ty(&format!("{}<{}>", &name.text(), &generic_str))
331-
})
301+
.map(|generics| make::ty(&format!("{}{}", &name.text(), generics.to_generic_args())))
332302
.unwrap_or_else(|| make::ty(&name.text()));
333303

334304
// change from a record to a tuple field list

crates/syntax/src/ast/edit_in_place.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,23 @@ impl ast::GenericParamList {
235235
}
236236
}
237237
}
238+
239+
/// Extracts the const, type, and lifetime names into a new [`ast::GenericParamList`]
240+
pub fn to_generic_args(&self) -> ast::GenericParamList {
241+
let params = self.generic_params().filter_map(|param| match param {
242+
ast::GenericParam::ConstParam(it) => {
243+
Some(ast::GenericParam::TypeParam(make::type_param(it.name()?, None)))
244+
}
245+
ast::GenericParam::LifetimeParam(it) => {
246+
Some(ast::GenericParam::LifetimeParam(make::lifetime_param(it.lifetime()?)))
247+
}
248+
ast::GenericParam::TypeParam(it) => {
249+
Some(ast::GenericParam::TypeParam(make::type_param(it.name()?, None)))
250+
}
251+
});
252+
253+
make::generic_param_list(params)
254+
}
238255
}
239256

240257
impl ast::WhereClause {

0 commit comments

Comments
 (0)