1
1
use ide_db:: syntax_helpers:: suggest_name;
2
2
use itertools:: Itertools ;
3
3
use syntax:: {
4
- ast:: { self , edit_in_place:: GenericParamsOwnerEdit , make, AstNode , HasGenericParams , HasName } ,
5
- ted,
4
+ ast:: {
5
+ self , edit_in_place:: GenericParamsOwnerEdit , syntax_factory:: SyntaxFactory , AstNode ,
6
+ HasGenericParams , HasName ,
7
+ } ,
8
+ SyntaxElement ,
6
9
} ;
7
10
8
11
use crate :: { AssistContext , AssistId , AssistKind , Assists } ;
@@ -25,12 +28,20 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
25
28
26
29
let type_bound_list = impl_trait_type. type_bound_list ( ) ?;
27
30
31
+ // FIXME: Is this node appropriate to use for SyntaxEditor in this case?
32
+ let parent_node = match ctx. covering_element ( ) {
33
+ SyntaxElement :: Node ( n) => n,
34
+ SyntaxElement :: Token ( t) => t. parent ( ) ?,
35
+ } ;
36
+ let make = SyntaxFactory :: new ( ) ;
37
+
28
38
let target = fn_. syntax ( ) . text_range ( ) ;
29
39
acc. add (
30
40
AssistId ( "introduce_named_generic" , AssistKind :: RefactorRewrite ) ,
31
41
"Replace impl trait with generic" ,
32
42
target,
33
43
|edit| {
44
+ let mut editor = edit. make_editor ( & parent_node) ;
34
45
let impl_trait_type = edit. make_mut ( impl_trait_type) ;
35
46
let fn_ = edit. make_mut ( fn_) ;
36
47
let fn_generic_param_list = fn_. get_or_create_generic_param_list ( ) ;
@@ -47,11 +58,12 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
47
58
)
48
59
. for_impl_trait_as_generic ( & impl_trait_type) ;
49
60
50
- let type_param = make:: type_param ( make:: name ( & type_param_name) , Some ( type_bound_list) )
61
+ let type_param = make
62
+ . type_param ( make. name ( & type_param_name) , Some ( type_bound_list) )
51
63
. clone_for_update ( ) ;
52
- let new_ty = make:: ty ( & type_param_name) . clone_for_update ( ) ;
64
+ let new_ty = make. ty ( & type_param_name) . clone_for_update ( ) ;
53
65
54
- ted :: replace ( impl_trait_type. syntax ( ) , new_ty. syntax ( ) ) ;
66
+ editor . replace ( impl_trait_type. syntax ( ) , new_ty. syntax ( ) ) ;
55
67
fn_generic_param_list. add_generic_param ( type_param. into ( ) ) ;
56
68
57
69
if let Some ( cap) = ctx. config . snippet_cap {
@@ -61,6 +73,9 @@ pub(crate) fn introduce_named_generic(acc: &mut Assists, ctx: &AssistContext<'_>
61
73
edit. add_tabstop_before ( cap, generic_param) ;
62
74
}
63
75
}
76
+
77
+ editor. add_mappings ( make. finish_with_mappings ( ) ) ;
78
+ edit. add_file_edits ( ctx. file_id ( ) , editor) ;
64
79
} ,
65
80
)
66
81
}
0 commit comments