@@ -27,33 +27,45 @@ pub(crate) fn generate_derive(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opt
27
27
let cap = ctx. config . snippet_cap ?;
28
28
let nominal = ctx. find_node_at_offset :: < ast:: Adt > ( ) ?;
29
29
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
+
30
58
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 ( ) ;
37
59
match derive_attr {
38
60
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
-
45
61
let nominal = edit. make_mut ( nominal) ;
46
62
nominal. add_attr ( derive. clone ( ) ) ;
47
63
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) ;
52
65
}
53
- Some ( tt ) => {
66
+ Some ( _ ) => {
54
67
// 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) ;
57
69
}
58
70
} ;
59
71
} )
0 commit comments