@@ -27,33 +27,45 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
2727 let cap = ctx. config . snippet_cap ?;
2828 let nominal = ctx. find_node_at_offset :: < ast:: Adt > ( ) ?;
2929 let target = nominal. syntax ( ) . text_range ( ) ;
30+ let derive_attr = nominal
31+ . attrs ( )
32+ . filter_map ( |x| x. as_simple_call ( ) )
33+ . filter ( |( name, _arg) | name == "derive" )
34+ . map ( |( _name, arg) | arg)
35+ . next ( ) ;
36+
37+ let ( derive, delimiter) = match & derive_attr {
38+ None => {
39+ let derive = make:: attr_outer ( make:: meta_token_tree (
40+ make:: ext:: ident_path ( "derive" ) ,
41+ make:: token_tree ( T ! [ '(' ] , vec ! [ ] ) . clone_for_update ( ) ,
42+ ) )
43+ . clone_for_update ( ) ;
44+ let delimiter = derive. meta ( ) ?. token_tree ( ) ?. r_paren_token ( ) ?;
45+ ( derive, delimiter)
46+ }
47+ Some ( tt) => {
48+ // Create an outer attribute just so that we avoid using
49+ // unwrap in edit closure.
50+ let _derive = make:: attr_outer ( make:: meta_token_tree (
51+ make:: ext:: ident_path ( "derive" ) ,
52+ make:: token_tree ( T ! [ '(' ] , vec ! [ ] ) ,
53+ ) ) ;
54+ ( _derive, tt. right_delimiter_token ( ) ?)
55+ }
56+ } ;
57+
3058 acc. add ( AssistId ( "generate_derive" , AssistKind :: Generate ) , "Add `#[derive]`" , target, |edit| {
31- let derive_attr = nominal
32- . attrs ( )
33- . filter_map ( |x| x. as_simple_call ( ) )
34- . filter ( |( name, _arg) | name == "derive" )
35- . map ( |( _name, arg) | arg)
36- . next ( ) ;
3759 match derive_attr {
3860 None => {
39- let derive = make:: attr_outer ( make:: meta_token_tree (
40- make:: ext:: ident_path ( "derive" ) ,
41- make:: token_tree ( T ! [ '(' ] , vec ! [ ] ) . clone_for_update ( ) ,
42- ) )
43- . clone_for_update ( ) ;
44-
4561 let nominal = edit. make_mut ( nominal) ;
4662 nominal. add_attr ( derive. clone ( ) ) ;
4763
48- edit. add_tabstop_before_token (
49- cap,
50- derive. meta ( ) . unwrap ( ) . token_tree ( ) . unwrap ( ) . r_paren_token ( ) . unwrap ( ) ,
51- ) ;
64+ edit. add_tabstop_before_token ( cap, delimiter) ;
5265 }
53- Some ( tt ) => {
66+ Some ( _ ) => {
5467 // Just move the cursor.
55- let tt = edit. make_mut ( tt) ;
56- edit. add_tabstop_before_token ( cap, tt. right_delimiter_token ( ) . unwrap ( ) ) ;
68+ edit. add_tabstop_before_token ( cap, delimiter) ;
5769 }
5870 } ;
5971 } )
0 commit comments