@@ -12,9 +12,10 @@ use ide_db::{
1212} ;
1313use itertools:: Itertools ;
1414use syntax:: ast:: edit:: AstNodeEdit ;
15+ use syntax:: ast:: syntax_factory:: SyntaxFactory ;
1516use syntax:: {
1617 AstNode , NodeOrToken , SyntaxKind , SyntaxNode , T ,
17- ast:: { self , HasName , edit:: IndentLevel , make } ,
18+ ast:: { self , HasName , edit:: IndentLevel } ,
1819} ;
1920
2021use crate :: {
@@ -62,19 +63,28 @@ pub(crate) fn convert_bool_to_enum(acc: &mut Assists, ctx: &AssistContext<'_>) -
6263 "Convert boolean to enum" ,
6364 target,
6465 |edit| {
66+ let make = SyntaxFactory :: without_mappings ( ) ;
6567 if let Some ( ty) = & ty_annotation {
6668 cov_mark:: hit!( replaces_ty_annotation) ;
6769 edit. replace ( ty. syntax ( ) . text_range ( ) , "Bool" ) ;
6870 }
6971
7072 if let Some ( initializer) = initializer {
71- replace_bool_expr ( edit, initializer) ;
73+ replace_bool_expr ( edit, initializer, & make ) ;
7274 }
7375
7476 let usages = definition. usages ( & ctx. sema ) . all ( ) ;
75- add_enum_def ( edit, ctx, & usages, target_node, & target_module) ;
77+ add_enum_def ( edit, ctx, & usages, target_node, & target_module, & make ) ;
7678 let mut delayed_mutations = Vec :: new ( ) ;
77- replace_usages ( edit, ctx, usages, definition, & target_module, & mut delayed_mutations) ;
79+ replace_usages (
80+ edit,
81+ ctx,
82+ usages,
83+ definition,
84+ & target_module,
85+ & mut delayed_mutations,
86+ & make,
87+ ) ;
7888 for ( scope, path) in delayed_mutations {
7989 insert_use ( & scope, path, & ctx. config . insert_use ) ;
8090 }
@@ -168,16 +178,16 @@ fn find_bool_node(ctx: &AssistContext<'_>) -> Option<BoolNodeData> {
168178 }
169179}
170180
171- fn replace_bool_expr ( edit : & mut SourceChangeBuilder , expr : ast:: Expr ) {
181+ fn replace_bool_expr ( edit : & mut SourceChangeBuilder , expr : ast:: Expr , make : & SyntaxFactory ) {
172182 let expr_range = expr. syntax ( ) . text_range ( ) ;
173- let enum_expr = bool_expr_to_enum_expr ( expr) ;
183+ let enum_expr = bool_expr_to_enum_expr ( expr, make ) ;
174184 edit. replace ( expr_range, enum_expr. syntax ( ) . text ( ) )
175185}
176186
177187/// Converts an expression of type `bool` to one of the new enum type.
178- fn bool_expr_to_enum_expr ( expr : ast:: Expr ) -> ast:: Expr {
179- let true_expr = make:: expr_path ( make:: path_from_text ( "Bool::True" ) ) ;
180- let false_expr = make:: expr_path ( make:: path_from_text ( "Bool::False" ) ) ;
188+ fn bool_expr_to_enum_expr ( expr : ast:: Expr , make : & SyntaxFactory ) -> ast:: Expr {
189+ let true_expr = make. expr_path ( make. path_from_text ( "Bool::True" ) ) ;
190+ let false_expr = make. expr_path ( make. path_from_text ( "Bool::False" ) ) ;
181191
182192 if let ast:: Expr :: Literal ( literal) = & expr {
183193 match literal. kind ( ) {
@@ -186,10 +196,10 @@ fn bool_expr_to_enum_expr(expr: ast::Expr) -> ast::Expr {
186196 _ => expr,
187197 }
188198 } else {
189- make:: expr_if (
199+ make. expr_if (
190200 expr,
191- make:: tail_only_block_expr ( true_expr) ,
192- Some ( ast:: ElseBranch :: Block ( make:: tail_only_block_expr ( false_expr) ) ) ,
201+ make. tail_only_block_expr ( true_expr) ,
202+ Some ( ast:: ElseBranch :: Block ( make. tail_only_block_expr ( false_expr) ) ) ,
193203 )
194204 . into ( )
195205 }
@@ -203,11 +213,13 @@ fn replace_usages(
203213 target_definition : Definition ,
204214 target_module : & hir:: Module ,
205215 delayed_mutations : & mut Vec < ( ImportScope , ast:: Path ) > ,
216+ make : & SyntaxFactory ,
206217) {
207218 for ( file_id, references) in usages {
208219 edit. edit_file ( file_id. file_id ( ctx. db ( ) ) ) ;
209220
210- let refs_with_imports = augment_references_with_imports ( ctx, references, target_module) ;
221+ let refs_with_imports =
222+ augment_references_with_imports ( ctx, references, target_module, make) ;
211223
212224 refs_with_imports. into_iter ( ) . rev ( ) . for_each (
213225 |FileReferenceWithImport { range, name, import_data } | {
@@ -224,12 +236,13 @@ fn replace_usages(
224236 target_definition,
225237 target_module,
226238 delayed_mutations,
239+ make,
227240 )
228241 }
229242 } else if let Some ( initializer) = find_assignment_usage ( & name) {
230243 cov_mark:: hit!( replaces_assignment) ;
231244
232- replace_bool_expr ( edit, initializer) ;
245+ replace_bool_expr ( edit, initializer, make ) ;
233246 } else if let Some ( ( prefix_expr, inner_expr) ) = find_negated_usage ( & name) {
234247 cov_mark:: hit!( replaces_negation) ;
235248
@@ -247,7 +260,7 @@ fn replace_usages(
247260 {
248261 cov_mark:: hit!( replaces_record_expr) ;
249262
250- let enum_expr = bool_expr_to_enum_expr ( initializer) ;
263+ let enum_expr = bool_expr_to_enum_expr ( initializer, make ) ;
251264 utils:: replace_record_field_expr ( ctx, edit, record_field, enum_expr) ;
252265 } else if let Some ( pat) = find_record_pat_field_usage ( & name) {
253266 match pat {
@@ -263,6 +276,7 @@ fn replace_usages(
263276 target_definition,
264277 target_module,
265278 delayed_mutations,
279+ make,
266280 )
267281 }
268282 }
@@ -272,14 +286,14 @@ fn replace_usages(
272286 if let Some ( expr) = literal_pat. literal ( ) . and_then ( |literal| {
273287 literal. syntax ( ) . ancestors ( ) . find_map ( ast:: Expr :: cast)
274288 } ) {
275- replace_bool_expr ( edit, expr) ;
289+ replace_bool_expr ( edit, expr, make ) ;
276290 }
277291 }
278292 _ => ( ) ,
279293 }
280294 } else if let Some ( ( ty_annotation, initializer) ) = find_assoc_const_usage ( & name) {
281295 edit. replace ( ty_annotation. syntax ( ) . text_range ( ) , "Bool" ) ;
282- replace_bool_expr ( edit, initializer) ;
296+ replace_bool_expr ( edit, initializer, make ) ;
283297 } else if let Some ( receiver) = find_method_call_expr_usage ( & name) {
284298 edit. replace (
285299 receiver. syntax ( ) . text_range ( ) ,
@@ -296,10 +310,10 @@ fn replace_usages(
296310 ctx,
297311 edit,
298312 record_field,
299- make:: expr_bin_op (
313+ make. expr_bin_op (
300314 expr,
301315 ast:: BinaryOp :: CmpOp ( ast:: CmpOp :: Eq { negated : false } ) ,
302- make:: expr_path ( make:: path_from_text ( "Bool::True" ) ) ,
316+ make. expr_path ( make. path_from_text ( "Bool::True" ) ) ,
303317 ) ,
304318 ) ;
305319 } else {
@@ -327,6 +341,7 @@ fn augment_references_with_imports(
327341 ctx : & AssistContext < ' _ > ,
328342 references : Vec < FileReference > ,
329343 target_module : & hir:: Module ,
344+ make : & SyntaxFactory ,
330345) -> Vec < FileReferenceWithImport > {
331346 let mut visited_modules = FxHashSet :: default ( ) ;
332347
@@ -357,9 +372,9 @@ fn augment_references_with_imports(
357372 cfg,
358373 )
359374 . map ( |mod_path| {
360- make:: path_concat (
375+ make. path_concat (
361376 mod_path_to_ast ( & mod_path, edition) ,
362- make:: path_from_text ( "Bool" ) ,
377+ make. path_from_text ( "Bool" ) ,
363378 )
364379 } ) ?;
365380
@@ -458,6 +473,7 @@ fn add_enum_def(
458473 usages : & UsageSearchResult ,
459474 target_node : SyntaxNode ,
460475 target_module : & hir:: Module ,
476+ make : & SyntaxFactory ,
461477) -> Option < ( ) > {
462478 let insert_before = node_to_insert_before ( target_node) ;
463479
@@ -482,7 +498,7 @@ fn add_enum_def(
482498 . any ( |module| module. nearest_non_block_module ( ctx. db ( ) ) != * target_module) ;
483499
484500 let indent = IndentLevel :: from_node ( & insert_before) ;
485- let enum_def = make_bool_enum ( make_enum_pub) . reset_indent ( ) . indent ( indent) ;
501+ let enum_def = make_bool_enum ( make_enum_pub, make ) . reset_indent ( ) . indent ( indent) ;
486502
487503 edit. insert (
488504 insert_before. text_range ( ) . start ( ) ,
@@ -504,31 +520,30 @@ fn node_to_insert_before(target_node: SyntaxNode) -> SyntaxNode {
504520 . unwrap_or ( target_node)
505521}
506522
507- fn make_bool_enum ( make_pub : bool ) -> ast:: Enum {
508- let derive_eq = make:: attr_outer ( make:: meta_token_tree (
509- make:: ext :: ident_path ( "derive" ) ,
510- make:: token_tree (
523+ fn make_bool_enum ( make_pub : bool , make : & SyntaxFactory ) -> ast:: Enum {
524+ let derive_eq = make. attr_outer ( make. meta_token_tree (
525+ make. ident_path ( "derive" ) ,
526+ make. token_tree (
511527 T ! [ '(' ] ,
512528 vec ! [
513- NodeOrToken :: Token ( make:: tokens :: ident( "PartialEq" ) ) ,
514- NodeOrToken :: Token ( make:: token( T ![ , ] ) ) ,
515- NodeOrToken :: Token ( make:: tokens :: single_space ( ) ) ,
516- NodeOrToken :: Token ( make:: tokens :: ident( "Eq" ) ) ,
529+ NodeOrToken :: Token ( make. ident( "PartialEq" ) ) ,
530+ NodeOrToken :: Token ( make. token( T ![ , ] ) ) ,
531+ NodeOrToken :: Token ( make. whitespace ( " " ) ) ,
532+ NodeOrToken :: Token ( make. ident( "Eq" ) ) ,
517533 ] ,
518534 ) ,
519535 ) ) ;
520- make:: enum_ (
536+ make. enum_ (
521537 [ derive_eq] ,
522- if make_pub { Some ( make:: visibility_pub ( ) ) } else { None } ,
523- make:: name ( "Bool" ) ,
538+ if make_pub { Some ( make. visibility_pub ( ) ) } else { None } ,
539+ make. name ( "Bool" ) ,
524540 None ,
525541 None ,
526- make:: variant_list ( vec ! [
527- make:: variant( None , make:: name( "True" ) , None , None ) ,
528- make:: variant( None , make:: name( "False" ) , None , None ) ,
542+ make. variant_list ( vec ! [
543+ make. variant( None , make. name( "True" ) , None , None ) ,
544+ make. variant( None , make. name( "False" ) , None , None ) ,
529545 ] ) ,
530546 )
531- . clone_for_update ( )
532547}
533548
534549#[ cfg( test) ]
0 commit comments