11use ra_syntax:: ast:: { self , AstNode , NameOwner , TypeParamsOwner } ;
22use stdx:: { format_to, SepBy } ;
33
4- use crate :: { AssistContext , AssistId , Assists } ;
4+ use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
55
66// Assist: add_impl
77//
@@ -26,38 +26,46 @@ pub(crate) fn add_impl(acc: &mut Assists, ctx: &AssistContext) -> Option<()> {
2626 let nominal = ctx. find_node_at_offset :: < ast:: NominalDef > ( ) ?;
2727 let name = nominal. name ( ) ?;
2828 let target = nominal. syntax ( ) . text_range ( ) ;
29- acc. add ( AssistId ( "add_impl" ) , format ! ( "Implement {}" , name. text( ) . as_str( ) ) , target, |edit| {
30- let type_params = nominal. type_param_list ( ) ;
31- let start_offset = nominal. syntax ( ) . text_range ( ) . end ( ) ;
32- let mut buf = String :: new ( ) ;
33- buf. push_str ( "\n \n impl" ) ;
34- if let Some ( type_params) = & type_params {
35- format_to ! ( buf, "{}" , type_params. syntax( ) ) ;
36- }
37- buf. push_str ( " " ) ;
38- buf. push_str ( name. text ( ) . as_str ( ) ) ;
39- if let Some ( type_params) = type_params {
40- let lifetime_params = type_params
41- . lifetime_params ( )
42- . filter_map ( |it| it. lifetime_token ( ) )
43- . map ( |it| it. text ( ) . clone ( ) ) ;
44- let type_params =
45- type_params. type_params ( ) . filter_map ( |it| it. name ( ) ) . map ( |it| it. text ( ) . clone ( ) ) ;
29+ acc. add (
30+ AssistId ( "add_impl" ) ,
31+ AssistKind :: Refactor ,
32+ format ! ( "Implement {}" , name. text( ) . as_str( ) ) ,
33+ target,
34+ |edit| {
35+ let type_params = nominal. type_param_list ( ) ;
36+ let start_offset = nominal. syntax ( ) . text_range ( ) . end ( ) ;
37+ let mut buf = String :: new ( ) ;
38+ buf. push_str ( "\n \n impl" ) ;
39+ if let Some ( type_params) = & type_params {
40+ format_to ! ( buf, "{}" , type_params. syntax( ) ) ;
41+ }
42+ buf. push_str ( " " ) ;
43+ buf. push_str ( name. text ( ) . as_str ( ) ) ;
44+ if let Some ( type_params) = type_params {
45+ let lifetime_params = type_params
46+ . lifetime_params ( )
47+ . filter_map ( |it| it. lifetime_token ( ) )
48+ . map ( |it| it. text ( ) . clone ( ) ) ;
49+ let type_params = type_params
50+ . type_params ( )
51+ . filter_map ( |it| it. name ( ) )
52+ . map ( |it| it. text ( ) . clone ( ) ) ;
4653
47- let generic_params = lifetime_params. chain ( type_params) . sep_by ( ", " ) ;
48- format_to ! ( buf, "<{}>" , generic_params)
49- }
50- match ctx. config . snippet_cap {
51- Some ( cap) => {
52- buf. push_str ( " {\n $0\n }" ) ;
53- edit. insert_snippet ( cap, start_offset, buf) ;
54+ let generic_params = lifetime_params. chain ( type_params) . sep_by ( ", " ) ;
55+ format_to ! ( buf, "<{}>" , generic_params)
5456 }
55- None => {
56- buf. push_str ( " {\n }" ) ;
57- edit. insert ( start_offset, buf) ;
57+ match ctx. config . snippet_cap {
58+ Some ( cap) => {
59+ buf. push_str ( " {\n $0\n }" ) ;
60+ edit. insert_snippet ( cap, start_offset, buf) ;
61+ }
62+ None => {
63+ buf. push_str ( " {\n }" ) ;
64+ edit. insert ( start_offset, buf) ;
65+ }
5866 }
59- }
60- } )
67+ } ,
68+ )
6169}
6270
6371#[ cfg( test) ]
0 commit comments