11use 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 } ;
75
86use crate :: { AssistContext , AssistId , Assists } ;
97
@@ -49,6 +47,7 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
4947 } ;
5048
5149 let associated_items = impl_. assoc_item_list ( ) ?;
50+ let associated_l_curly = associated_items. l_curly_token ( ) ?;
5251 let from_fn = associated_items. assoc_items ( ) . find_map ( |item| {
5352 if let ast:: AssocItem :: Fn ( f) = item
5453 && f. name ( ) ?. text ( ) == "from"
@@ -75,30 +74,25 @@ pub(crate) fn convert_from_to_tryfrom(acc: &mut Assists, ctx: &AssistContext<'_>
7574 "Convert From to TryFrom" ,
7675 impl_. syntax ( ) . text_range ( ) ,
7776 |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 (
8679 trait_ty. syntax ( ) ,
8780 make:: ty ( & format ! ( "TryFrom<{from_type}>" ) ) . syntax ( ) . clone_for_update ( ) ,
8881 ) ;
89- ted :: replace (
82+ editor . replace (
9083 from_fn_return_type. syntax ( ) ,
9184 make:: ty ( "Result<Self, Self::Error>" ) . syntax ( ) . clone_for_update ( ) ,
9285 ) ;
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 (
9589 tail_expr. syntax ( ) ,
9690 wrap_ok ( tail_expr. clone ( ) ) . syntax ( ) . clone_for_update ( ) ,
9791 ) ;
9892
9993 for r in return_exprs {
10094 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 ( ) ) ;
10296 }
10397
10498 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<'_>
114108 && let ast:: AssocItem :: TypeAlias ( type_alias) = & error_type
115109 && let Some ( ty) = type_alias. ty ( )
116110 {
117- builder. add_placeholder_snippet ( cap, ty) ;
111+ let placeholder = builder. make_placeholder_snippet ( cap) ;
112+ editor. add_annotation ( ty. syntax ( ) , placeholder) ;
118113 }
119114
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) ;
121125 } ,
122126 )
123127}
0 commit comments