1- use ide_db:: FxHashSet ;
1+ use ide_db:: syntax_helpers :: suggest_name :: NameGenerator ;
22use 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
123123fn 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
137140enum NeedsLifetime {
0 commit comments