diff options
Diffstat (limited to 'crates/ra_assists/src/handlers')
-rw-r--r-- | crates/ra_assists/src/handlers/move_guard.rs | 222 |
1 files changed, 106 insertions, 116 deletions
diff --git a/crates/ra_assists/src/handlers/move_guard.rs b/crates/ra_assists/src/handlers/move_guard.rs index c62ebc306..452115fe6 100644 --- a/crates/ra_assists/src/handlers/move_guard.rs +++ b/crates/ra_assists/src/handlers/move_guard.rs | |||
@@ -1,5 +1,5 @@ | |||
1 | use syntax::{ | 1 | use syntax::{ |
2 | ast::{AstNode, IfExpr, MatchArm}, | 2 | ast::{edit::AstNodeEdit, make, AstNode, IfExpr, MatchArm}, |
3 | SyntaxKind::WHITESPACE, | 3 | SyntaxKind::WHITESPACE, |
4 | }; | 4 | }; |
5 | 5 | ||
@@ -25,7 +25,9 @@ use crate::{AssistContext, AssistId, AssistKind, Assists}; | |||
25 | // | 25 | // |
26 | // fn handle(action: Action) { | 26 | // fn handle(action: Action) { |
27 | // match action { | 27 | // match action { |
28 | // Action::Move { distance } => if distance > 10 { foo() }, | 28 | // Action::Move { distance } => if distance > 10 { |
29 | // foo() | ||
30 | // }, | ||
29 | // _ => (), | 31 | // _ => (), |
30 | // } | 32 | // } |
31 | // } | 33 | // } |
@@ -35,9 +37,13 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext) -> | |||
35 | let guard = match_arm.guard()?; | 37 | let guard = match_arm.guard()?; |
36 | let space_before_guard = guard.syntax().prev_sibling_or_token(); | 38 | let space_before_guard = guard.syntax().prev_sibling_or_token(); |
37 | 39 | ||
38 | let guard_conditions = guard.expr()?; | 40 | let guard_condition = guard.expr()?; |
39 | let arm_expr = match_arm.expr()?; | 41 | let arm_expr = match_arm.expr()?; |
40 | let buf = format!("if {} {{ {} }}", guard_conditions.syntax().text(), arm_expr.syntax().text()); | 42 | let if_expr = make::expr_if( |
43 | make::condition(guard_condition, None), | ||
44 | make::block_expr(None, Some(arm_expr.clone())), | ||
45 | ) | ||
46 | .indent(arm_expr.indent_level()); | ||
41 | 47 | ||
42 | let target = guard.syntax().text_range(); | 48 | let target = guard.syntax().text_range(); |
43 | acc.add( | 49 | acc.add( |
@@ -53,7 +59,7 @@ pub(crate) fn move_guard_to_arm_body(acc: &mut Assists, ctx: &AssistContext) -> | |||
53 | }; | 59 | }; |
54 | 60 | ||
55 | edit.delete(guard.syntax().text_range()); | 61 | edit.delete(guard.syntax().text_range()); |
56 | edit.replace_node_and_indent(arm_expr.syntax(), buf); | 62 | edit.replace_ast(arm_expr, if_expr); |
57 | }, | 63 | }, |
58 | ) | 64 | ) |
59 | } | 65 | } |
@@ -134,16 +140,14 @@ mod tests { | |||
134 | check_assist_target( | 140 | check_assist_target( |
135 | move_guard_to_arm_body, | 141 | move_guard_to_arm_body, |
136 | r#" | 142 | r#" |
137 | fn f() { | 143 | fn main() { |
138 | let t = 'a'; | 144 | match 92 { |
139 | let chars = "abcd"; | 145 | x <|>if x > 10 => false, |
140 | match t { | 146 | _ => true |
141 | '\r' <|>if chars.clone().next() == Some('\n') => false, | 147 | } |
142 | _ => true | 148 | } |
143 | } | 149 | "#, |
144 | } | 150 | r#"if x > 10"#, |
145 | "#, | ||
146 | r#"if chars.clone().next() == Some('\n')"#, | ||
147 | ); | 151 | ); |
148 | } | 152 | } |
149 | 153 | ||
@@ -152,25 +156,23 @@ mod tests { | |||
152 | check_assist( | 156 | check_assist( |
153 | move_guard_to_arm_body, | 157 | move_guard_to_arm_body, |
154 | r#" | 158 | r#" |
155 | fn f() { | 159 | fn main() { |
156 | let t = 'a'; | 160 | match 92 { |
157 | let chars = "abcd"; | 161 | x <|>if x > 10 => false, |
158 | match t { | 162 | _ => true |
159 | '\r' <|>if chars.clone().next() == Some('\n') => false, | 163 | } |
160 | _ => true | 164 | } |
161 | } | 165 | "#, |
162 | } | ||
163 | "#, | ||
164 | r#" | 166 | r#" |
165 | fn f() { | 167 | fn main() { |
166 | let t = 'a'; | 168 | match 92 { |
167 | let chars = "abcd"; | 169 | x => if x > 10 { |
168 | match t { | 170 | false |
169 | '\r' => if chars.clone().next() == Some('\n') { false }, | 171 | }, |
170 | _ => true | 172 | _ => true |
171 | } | 173 | } |
172 | } | 174 | } |
173 | "#, | 175 | "#, |
174 | ); | 176 | ); |
175 | } | 177 | } |
176 | 178 | ||
@@ -179,21 +181,23 @@ mod tests { | |||
179 | check_assist( | 181 | check_assist( |
180 | move_guard_to_arm_body, | 182 | move_guard_to_arm_body, |
181 | r#" | 183 | r#" |
182 | fn f() { | 184 | fn main() { |
183 | match x { | 185 | match 92 { |
184 | <|>y @ 4 | y @ 5 if y > 5 => true, | 186 | <|>x @ 4 | x @ 5 if x > 5 => true, |
185 | _ => false | 187 | _ => false |
186 | } | 188 | } |
187 | } | 189 | } |
188 | "#, | 190 | "#, |
189 | r#" | 191 | r#" |
190 | fn f() { | 192 | fn main() { |
191 | match x { | 193 | match 92 { |
192 | y @ 4 | y @ 5 => if y > 5 { true }, | 194 | x @ 4 | x @ 5 => if x > 5 { |
193 | _ => false | 195 | true |
194 | } | 196 | }, |
195 | } | 197 | _ => false |
196 | "#, | 198 | } |
199 | } | ||
200 | "#, | ||
197 | ); | 201 | ); |
198 | } | 202 | } |
199 | 203 | ||
@@ -202,25 +206,21 @@ mod tests { | |||
202 | check_assist( | 206 | check_assist( |
203 | move_arm_cond_to_match_guard, | 207 | move_arm_cond_to_match_guard, |
204 | r#" | 208 | r#" |
205 | fn f() { | 209 | fn main() { |
206 | let t = 'a'; | 210 | match 92 { |
207 | let chars = "abcd"; | 211 | x => if x > 10 { <|>false }, |
208 | match t { | 212 | _ => true |
209 | '\r' => if chars.clone().next() == Some('\n') { <|>false }, | 213 | } |
210 | _ => true | 214 | } |
211 | } | 215 | "#, |
212 | } | ||
213 | "#, | ||
214 | r#" | 216 | r#" |
215 | fn f() { | 217 | fn main() { |
216 | let t = 'a'; | 218 | match 92 { |
217 | let chars = "abcd"; | 219 | x if x > 10 => false, |
218 | match t { | 220 | _ => true |
219 | '\r' if chars.clone().next() == Some('\n') => false, | 221 | } |
220 | _ => true | 222 | } |
221 | } | 223 | "#, |
222 | } | ||
223 | "#, | ||
224 | ); | 224 | ); |
225 | } | 225 | } |
226 | 226 | ||
@@ -229,15 +229,13 @@ mod tests { | |||
229 | check_assist_not_applicable( | 229 | check_assist_not_applicable( |
230 | move_arm_cond_to_match_guard, | 230 | move_arm_cond_to_match_guard, |
231 | r#" | 231 | r#" |
232 | fn f() { | 232 | fn main() { |
233 | let t = 'a'; | 233 | match 92 { |
234 | let chars = "abcd"; | 234 | x => if let 62 = x { <|>false }, |
235 | match t { | 235 | _ => true |
236 | '\r' => if let Some(_) = chars.clone().next() { <|>false }, | 236 | } |
237 | _ => true | 237 | } |
238 | } | 238 | "#, |
239 | } | ||
240 | "#, | ||
241 | ); | 239 | ); |
242 | } | 240 | } |
243 | 241 | ||
@@ -246,25 +244,21 @@ mod tests { | |||
246 | check_assist( | 244 | check_assist( |
247 | move_arm_cond_to_match_guard, | 245 | move_arm_cond_to_match_guard, |
248 | r#" | 246 | r#" |
249 | fn f() { | 247 | fn main() { |
250 | let t = 'a'; | 248 | match 92 { |
251 | let chars = "abcd"; | 249 | x => if x > 10 { <|> }, |
252 | match t { | 250 | _ => true |
253 | '\r' => if chars.clone().next().is_some() { <|> }, | 251 | } |
254 | _ => true | 252 | } |
255 | } | 253 | "#, |
256 | } | ||
257 | "#, | ||
258 | r#" | 254 | r#" |
259 | fn f() { | 255 | fn main() { |
260 | let t = 'a'; | 256 | match 92 { |
261 | let chars = "abcd"; | 257 | x if x > 10 => { }, |
262 | match t { | 258 | _ => true |
263 | '\r' if chars.clone().next().is_some() => { }, | 259 | } |
264 | _ => true | 260 | } |
265 | } | 261 | "#, |
266 | } | ||
267 | "#, | ||
268 | ); | 262 | ); |
269 | } | 263 | } |
270 | 264 | ||
@@ -273,31 +267,27 @@ mod tests { | |||
273 | check_assist( | 267 | check_assist( |
274 | move_arm_cond_to_match_guard, | 268 | move_arm_cond_to_match_guard, |
275 | r#" | 269 | r#" |
276 | fn f() { | 270 | fn main() { |
277 | let mut t = 'a'; | 271 | match 92 { |
278 | let chars = "abcd"; | 272 | x => if x > 10 { |
279 | match t { | 273 | 92;<|> |
280 | '\r' => if chars.clone().next().is_some() { | 274 | false |
281 | t = 'e';<|> | 275 | }, |
282 | false | 276 | _ => true |
283 | }, | 277 | } |
284 | _ => true | 278 | } |
285 | } | 279 | "#, |
286 | } | ||
287 | "#, | ||
288 | r#" | 280 | r#" |
289 | fn f() { | 281 | fn main() { |
290 | let mut t = 'a'; | 282 | match 92 { |
291 | let chars = "abcd"; | 283 | x if x > 10 => { |
292 | match t { | 284 | 92; |
293 | '\r' if chars.clone().next().is_some() => { | 285 | false |
294 | t = 'e'; | 286 | }, |
295 | false | 287 | _ => true |
296 | }, | 288 | } |
297 | _ => true | 289 | } |
298 | } | 290 | "#, |
299 | } | ||
300 | "#, | ||
301 | ); | 291 | ); |
302 | } | 292 | } |
303 | } | 293 | } |