aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/assists/move_bounds.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/assists/move_bounds.rs')
-rw-r--r--crates/ra_assists/src/assists/move_bounds.rs58
1 files changed, 25 insertions, 33 deletions
diff --git a/crates/ra_assists/src/assists/move_bounds.rs b/crates/ra_assists/src/assists/move_bounds.rs
index edf2897c6..3145d7625 100644
--- a/crates/ra_assists/src/assists/move_bounds.rs
+++ b/crates/ra_assists/src/assists/move_bounds.rs
@@ -22,7 +22,7 @@ use crate::{Assist, AssistCtx, AssistId};
22// f(x) 22// f(x)
23// } 23// }
24// ``` 24// ```
25pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 25pub(crate) fn move_bounds_to_where_clause(ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
26 let type_param_list = ctx.find_node_at_offset::<ast::TypeParamList>()?; 26 let type_param_list = ctx.find_node_at_offset::<ast::TypeParamList>()?;
27 27
28 let mut type_params = type_param_list.type_params(); 28 let mut type_params = type_param_list.type_params();
@@ -46,38 +46,30 @@ pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>)
46 _ => return None, 46 _ => return None,
47 }; 47 };
48 48
49 ctx.add_action( 49 ctx.add_assist(AssistId("move_bounds_to_where_clause"), "move_bounds_to_where_clause", |edit| {
50 AssistId("move_bounds_to_where_clause"), 50 let new_params = type_param_list
51 "move_bounds_to_where_clause", 51 .type_params()
52 |edit| { 52 .filter(|it| it.type_bound_list().is_some())
53 let new_params = type_param_list 53 .map(|type_param| {
54 .type_params() 54 let without_bounds = type_param.remove_bounds();
55 .filter(|it| it.type_bound_list().is_some()) 55 (type_param, without_bounds)
56 .map(|type_param| { 56 });
57 let without_bounds = type_param.remove_bounds(); 57
58 (type_param, without_bounds) 58 let new_type_param_list = edit::replace_descendants(&type_param_list, new_params);
59 }); 59 edit.replace_ast(type_param_list.clone(), new_type_param_list);
60 60
61 let new_type_param_list = edit::replace_descendants(&type_param_list, new_params); 61 let where_clause = {
62 edit.replace_ast(type_param_list.clone(), new_type_param_list); 62 let predicates = type_param_list.type_params().filter_map(build_predicate);
63 63 make::where_clause(predicates)
64 let where_clause = { 64 };
65 let predicates = type_param_list.type_params().filter_map(build_predicate); 65
66 make::where_clause(predicates) 66 let to_insert = match anchor.prev_sibling_or_token() {
67 }; 67 Some(ref elem) if elem.kind() == WHITESPACE => format!("{} ", where_clause.syntax()),
68 68 _ => format!(" {}", where_clause.syntax()),
69 let to_insert = match anchor.prev_sibling_or_token() { 69 };
70 Some(ref elem) if elem.kind() == WHITESPACE => { 70 edit.insert(anchor.text_range().start(), to_insert);
71 format!("{} ", where_clause.syntax()) 71 edit.target(type_param_list.syntax().text_range());
72 } 72 })
73 _ => format!(" {}", where_clause.syntax()),
74 };
75 edit.insert(anchor.text_range().start(), to_insert);
76 edit.target(type_param_list.syntax().text_range());
77 },
78 );
79
80 ctx.build()
81} 73}
82 74
83fn build_predicate(param: ast::TypeParam) -> Option<ast::WherePred> { 75fn build_predicate(param: ast::TypeParam) -> Option<ast::WherePred> {