@@ -25,7 +25,7 @@ pub(crate) fn extract_to_default_generic(acc: &mut Assists, ctx: &AssistContext<
25
25
}
26
26
27
27
let ty: Either < ast:: Type , ast:: ConstArg > = ctx. find_node_at_range ( ) ?;
28
- let adt: Either < ast:: Adt , Either < ast:: TypeAlias , ast:: Fn > > =
28
+ let adt: Either < Either < ast:: Adt , ast:: TypeAlias > , ast:: Fn > =
29
29
ty. syntax ( ) . ancestors ( ) . find_map ( AstNode :: cast) ?;
30
30
31
31
extract_to_default_generic_impl ( acc, ctx, adt, ty)
@@ -34,48 +34,60 @@ pub(crate) fn extract_to_default_generic(acc: &mut Assists, ctx: &AssistContext<
34
34
fn extract_to_default_generic_impl (
35
35
acc : & mut Assists ,
36
36
ctx : & AssistContext < ' _ > ,
37
- adt : impl HasName + HasGenericParams ,
37
+ adt : Either < impl HasName + HasGenericParams , ast :: Fn > ,
38
38
ty : Either < ast:: Type , ast:: ConstArg > ,
39
39
) -> Option < ( ) > {
40
40
let name = adt. name ( ) ?;
41
+ let has_default = adt. is_left ( ) ;
41
42
43
+ let label = if has_default {
44
+ "Extract type as default generic parameter"
45
+ } else {
46
+ "Extract type as generic parameter"
47
+ } ;
42
48
let target = ty. syntax ( ) . text_range ( ) ;
43
- acc. add (
44
- AssistId :: refactor_extract ( "extract_to_default_generic" ) ,
45
- "Extract type as default generic parameter" ,
46
- target,
47
- |edit| {
48
- let mut editor = edit. make_editor ( adt. syntax ( ) ) ;
49
- let generic_list = get_or_create_generic_param_list ( & name, & adt, & mut editor, edit) ;
50
-
51
- let generic_name = generic_name ( & generic_list, ty. is_right ( ) ) ;
52
-
53
- editor. replace ( ty. syntax ( ) , generic_name. syntax ( ) ) ;
54
-
55
- match ty {
56
- Left ( ty) => {
57
- let param = make:: type_default_param ( generic_name, None , ty) . clone_for_update ( ) ;
58
- generic_list. add_generic_param ( param. into ( ) ) ;
49
+ acc. add ( AssistId :: refactor_extract ( "extract_to_default_generic" ) , label, target, |edit| {
50
+ let mut editor = edit. make_editor ( adt. syntax ( ) ) ;
51
+ let generic_list = get_or_create_generic_param_list ( & name, & adt, & mut editor, edit) ;
52
+
53
+ let generic_name = generic_name ( & generic_list, ty. is_right ( ) ) ;
54
+
55
+ editor. replace ( ty. syntax ( ) , generic_name. syntax ( ) ) ;
56
+
57
+ match ty {
58
+ Left ( ty) => {
59
+ let param = if has_default {
60
+ make:: type_default_param ( generic_name, None , ty)
61
+ } else {
62
+ make:: type_param ( generic_name, None )
63
+ }
64
+ . clone_for_update ( ) ;
65
+
66
+ generic_list. add_generic_param ( param. into ( ) ) ;
67
+ }
68
+ Right ( n) => {
69
+ let param = if has_default {
70
+ make:: const_default_param ( generic_name, const_ty ( ctx, & n) , n)
71
+ } else {
72
+ make:: const_param ( generic_name, const_ty ( ctx, & n) )
59
73
}
60
- Right ( n) => {
61
- let param = make:: const_default_param ( generic_name, const_ty ( ctx, & n) , n)
62
- . clone_for_update ( ) ;
63
- generic_list. add_generic_param ( param. into ( ) ) ;
64
-
65
- if let Some ( ast:: GenericParam :: ConstParam ( param) ) =
66
- generic_list. generic_params ( ) . last ( )
67
- && let Some ( ast:: Type :: InferType ( ty) ) = param. ty ( )
68
- && let Some ( cap) = ctx. config . snippet_cap
69
- {
70
- let annotation = edit. make_placeholder_snippet ( cap) ;
71
- editor. add_annotation ( ty. syntax ( ) , annotation) ;
72
- }
74
+ . clone_for_update ( ) ;
75
+
76
+ generic_list. add_generic_param ( param. into ( ) ) ;
77
+
78
+ if let Some ( ast:: GenericParam :: ConstParam ( param) ) =
79
+ generic_list. generic_params ( ) . last ( )
80
+ && let Some ( ast:: Type :: InferType ( ty) ) = param. ty ( )
81
+ && let Some ( cap) = ctx. config . snippet_cap
82
+ {
83
+ let annotation = edit. make_placeholder_snippet ( cap) ;
84
+ editor. add_annotation ( ty. syntax ( ) , annotation) ;
73
85
}
74
86
}
87
+ }
75
88
76
- edit. add_file_edits ( ctx. vfs_file_id ( ) , editor) ;
77
- } ,
78
- )
89
+ edit. add_file_edits ( ctx. vfs_file_id ( ) , editor) ;
90
+ } )
79
91
}
80
92
81
93
fn array_index_type ( n : & ast:: ConstArg ) -> Option < ast:: Type > {
@@ -184,7 +196,7 @@ mod tests {
184
196
check_assist (
185
197
extract_to_default_generic,
186
198
r#"fn foo(x: $0i32$0) {}"# ,
187
- r#"fn foo<T = i32 >(x: T) {}"# ,
199
+ r#"fn foo<T>(x: T) {}"# ,
188
200
) ;
189
201
}
190
202
0 commit comments