11use syntax:: ast:: { self , edit:: AstNodeEdit , make, AstNode , GenericParamsOwner } ;
22
3- use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
3+ use crate :: { utils :: suggest_name , AssistContext , AssistId , AssistKind , Assists } ;
44
55// Assist: replace_impl_trait_with_generic
66//
@@ -17,30 +17,30 @@ pub(crate) fn replace_impl_trait_with_generic(
1717 acc : & mut Assists ,
1818 ctx : & AssistContext ,
1919) -> Option < ( ) > {
20- let type_impl_trait = ctx. find_node_at_offset :: < ast:: ImplTraitType > ( ) ?;
21- let type_param = type_impl_trait . syntax ( ) . parent ( ) . and_then ( ast:: Param :: cast) ?;
22- let type_fn = type_param . syntax ( ) . ancestors ( ) . find_map ( ast:: Fn :: cast) ?;
20+ let impl_trait_type = ctx. find_node_at_offset :: < ast:: ImplTraitType > ( ) ?;
21+ let param = impl_trait_type . syntax ( ) . parent ( ) . and_then ( ast:: Param :: cast) ?;
22+ let fn_ = param . syntax ( ) . ancestors ( ) . find_map ( ast:: Fn :: cast) ?;
2323
24- let impl_trait_ty = type_impl_trait . type_bound_list ( ) ?;
24+ let type_bound_list = impl_trait_type . type_bound_list ( ) ?;
2525
26- let target = type_fn . syntax ( ) . text_range ( ) ;
26+ let target = fn_ . syntax ( ) . text_range ( ) ;
2727 acc. add (
2828 AssistId ( "replace_impl_trait_with_generic" , AssistKind :: RefactorRewrite ) ,
2929 "Replace impl trait with generic" ,
3030 target,
3131 |edit| {
32- let generic_letter = impl_trait_ty . to_string ( ) . chars ( ) . next ( ) . unwrap ( ) . to_string ( ) ;
32+ let type_param_name = suggest_name :: generic_parameter ( & impl_trait_type ) ;
3333
34- let generic_param_list = type_fn
34+ let generic_param_list = fn_
3535 . generic_param_list ( )
3636 . unwrap_or_else ( || make:: generic_param_list ( None ) )
37- . append_param ( make:: generic_param ( generic_letter . clone ( ) , Some ( impl_trait_ty ) ) ) ;
37+ . append_param ( make:: generic_param ( & type_param_name , Some ( type_bound_list ) ) ) ;
3838
39- let new_type_fn = type_fn
40- . replace_descendant :: < ast:: Type > ( type_impl_trait . into ( ) , make:: ty ( & generic_letter ) )
39+ let new_type_fn = fn_
40+ . replace_descendant :: < ast:: Type > ( impl_trait_type . into ( ) , make:: ty ( & type_param_name ) )
4141 . with_generic_param_list ( generic_param_list) ;
4242
43- edit. replace_ast ( type_fn . clone ( ) , new_type_fn) ;
43+ edit. replace_ast ( fn_ . clone ( ) , new_type_fn) ;
4444 } ,
4545 )
4646}
0 commit comments