Skip to content

Commit 1f97156

Browse files
Generate names using the for_lifetime method
1 parent 17557ff commit 1f97156

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
use ide_db::FxHashSet;
1+
use ide_db::syntax_helpers::suggest_name::NameGenerator;
22
use syntax::{
3-
AstNode, TextRange,
3+
AstNode, SmolStr, TextRange,
44
ast::{self, HasGenericParams, edit_in_place::GenericParamsOwnerEdit, make},
55
ted::{self, Position},
66
};
@@ -57,7 +57,7 @@ fn generate_fn_def_assist(
5757
lifetime: ast::Lifetime,
5858
) -> Option<()> {
5959
let param_list: ast::ParamList = fn_def.param_list()?;
60-
let new_lifetime_param = generate_unique_lifetime_param_name(fn_def.generic_param_list())?;
60+
let new_lifetime_param = generate_unique_lifetime_param_name(fn_def.generic_param_list());
6161
let self_param =
6262
// use the self if it's a reference and has no explicit lifetime
6363
param_list.self_param().filter(|p| p.lifetime().is_none() && p.amp_token().is_some());
@@ -106,7 +106,7 @@ fn generate_impl_def_assist(
106106
lifetime_loc: TextRange,
107107
lifetime: ast::Lifetime,
108108
) -> Option<()> {
109-
let new_lifetime_param = generate_unique_lifetime_param_name(impl_def.generic_param_list())?;
109+
let new_lifetime_param = generate_unique_lifetime_param_name(impl_def.generic_param_list());
110110
acc.add(AssistId::refactor(ASSIST_NAME), ASSIST_LABEL, lifetime_loc, |builder| {
111111
let impl_def = builder.make_mut(impl_def);
112112
let lifetime = builder.make_mut(lifetime);
@@ -122,16 +122,19 @@ fn generate_impl_def_assist(
122122
/// which is not in the list
123123
fn generate_unique_lifetime_param_name(
124124
existing_type_param_list: Option<ast::GenericParamList>,
125-
) -> Option<ast::Lifetime> {
126-
match existing_type_param_list {
127-
Some(type_params) => {
128-
let used_lifetime_params: FxHashSet<_> =
129-
type_params.lifetime_params().map(|p| p.syntax().text().to_string()).collect();
130-
('a'..='z').map(|it| format!("'{it}")).find(|it| !used_lifetime_params.contains(it))
131-
}
132-
None => Some("'a".to_owned()),
133-
}
134-
.map(|it| make::lifetime(&it))
125+
) -> ast::Lifetime {
126+
let existing_lifetimes: Vec<SmolStr> = existing_type_param_list
127+
.map(|type_params| {
128+
type_params
129+
.lifetime_params()
130+
.filter_map(|param| param.lifetime())
131+
.map(|lt| lt.text().into())
132+
.collect()
133+
})
134+
.unwrap_or_default();
135+
136+
let mut name_gen = NameGenerator::new_with_names(existing_lifetimes.iter().map(|s| s.as_str()));
137+
make::lifetime(&name_gen.for_lifetime())
135138
}
136139

137140
enum NeedsLifetime {

0 commit comments

Comments
 (0)