1
1
use ide_db:: { famous_defs:: FamousDefs , traits:: resolve_target_trait} ;
2
- use itertools:: Itertools ;
3
- use syntax:: {
4
- ast:: { self , AstNode , HasGenericArgs , HasName , make} ,
5
- ted,
6
- } ;
2
+ use syntax:: ast:: edit:: IndentLevel ;
3
+ use syntax:: ast:: { self , AstNode , HasGenericArgs , HasName , make} ;
4
+ use syntax:: syntax_editor:: { Element , Position } ;
7
5
8
6
use crate :: { AssistContext , AssistId , Assists } ;
9
7
@@ -49,6 +47,7 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
49
47
} ;
50
48
51
49
let associated_items = impl_. assoc_item_list ( ) ?;
50
+ let associated_l_curly = associated_items. l_curly_token ( ) ?;
52
51
let from_fn = associated_items. assoc_items ( ) . find_map ( |item| {
53
52
if let ast:: AssocItem :: Fn ( f) = item
54
53
&& f. name ( ) ?. text ( ) == "from"
@@ -75,30 +74,25 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
75
74
"Convert From to TryFrom" ,
76
75
impl_. syntax ( ) . text_range ( ) ,
77
76
|builder| {
78
- let trait_ty = builder. make_mut ( trait_ty) ;
79
- let from_fn_return_type = builder. make_mut ( from_fn_return_type) ;
80
- let from_fn_name = builder. make_mut ( from_fn_name) ;
81
- let tail_expr = builder. make_mut ( tail_expr) ;
82
- let return_exprs = return_exprs. map ( |r| builder. make_mut ( r) ) . collect_vec ( ) ;
83
- let associated_items = builder. make_mut ( associated_items) ;
84
-
85
- ted:: replace (
77
+ let mut editor = builder. make_editor ( impl_. syntax ( ) ) ;
78
+ editor. replace (
86
79
trait_ty. syntax ( ) ,
87
80
make:: ty ( & format ! ( "TryFrom<{from_type}>" ) ) . syntax ( ) . clone_for_update ( ) ,
88
81
) ;
89
- ted :: replace (
82
+ editor . replace (
90
83
from_fn_return_type. syntax ( ) ,
91
84
make:: ty ( "Result<Self, Self::Error>" ) . syntax ( ) . clone_for_update ( ) ,
92
85
) ;
93
- ted:: replace ( from_fn_name. syntax ( ) , make:: name ( "try_from" ) . syntax ( ) . clone_for_update ( ) ) ;
94
- ted:: replace (
86
+ editor
87
+ . replace ( from_fn_name. syntax ( ) , make:: name ( "try_from" ) . syntax ( ) . clone_for_update ( ) ) ;
88
+ editor. replace (
95
89
tail_expr. syntax ( ) ,
96
90
wrap_ok ( tail_expr. clone ( ) ) . syntax ( ) . clone_for_update ( ) ,
97
91
) ;
98
92
99
93
for r in return_exprs {
100
94
let t = r. expr ( ) . unwrap_or_else ( make:: ext:: expr_unit) ;
101
- ted :: replace ( t. syntax ( ) , wrap_ok ( t. clone ( ) ) . syntax ( ) . clone_for_update ( ) ) ;
95
+ editor . replace ( t. syntax ( ) , wrap_ok ( t. clone ( ) ) . syntax ( ) . clone_for_update ( ) ) ;
102
96
}
103
97
104
98
let error_type = ast:: AssocItem :: TypeAlias ( make:: ty_alias (
@@ -114,10 +108,20 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
114
108
&& let ast:: AssocItem :: TypeAlias ( type_alias) = & error_type
115
109
&& let Some ( ty) = type_alias. ty ( )
116
110
{
117
- builder. add_placeholder_snippet ( cap, ty) ;
111
+ let placeholder = builder. make_placeholder_snippet ( cap) ;
112
+ editor. add_annotation ( ty. syntax ( ) , placeholder) ;
118
113
}
119
114
120
- associated_items. add_item_at_start ( error_type) ;
115
+ let indent = IndentLevel :: from_token ( & associated_l_curly) + 1 ;
116
+ editor. insert_all (
117
+ Position :: after ( associated_l_curly) ,
118
+ vec ! [
119
+ make:: tokens:: whitespace( & format!( "\n {indent}" ) ) . syntax_element( ) ,
120
+ error_type. syntax( ) . syntax_element( ) ,
121
+ make:: tokens:: whitespace( "\n " ) . syntax_element( ) ,
122
+ ] ,
123
+ ) ;
124
+ builder. add_file_edits ( ctx. vfs_file_id ( ) , editor) ;
121
125
} ,
122
126
)
123
127
}
0 commit comments