diff options
author | Vladyslav Katasonov <[email protected]> | 2021-02-10 17:05:03 +0000 |
---|---|---|
committer | Vladyslav Katasonov <[email protected]> | 2021-02-13 19:04:52 +0000 |
commit | 4be260d693babea7d32fead0ca10762a64557aaf (patch) | |
tree | 180dced93a90abd43aa213fbe419601368f14dfc /crates/assists | |
parent | 9eb19d92dd8d3200f3530faefa7a4048f58d280d (diff) |
allow try expr? with return None in extracted function
Diffstat (limited to 'crates/assists')
-rw-r--r-- | crates/assists/src/handlers/extract_function.rs | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/crates/assists/src/handlers/extract_function.rs b/crates/assists/src/handlers/extract_function.rs index 225a50d2d..74fa2013c 100644 --- a/crates/assists/src/handlers/extract_function.rs +++ b/crates/assists/src/handlers/extract_function.rs | |||
@@ -229,12 +229,12 @@ fn external_control_flow(ctx: &AssistContext, body: &FunctionBody) -> Option<Con | |||
229 | 229 | ||
230 | /// Checks is expr is `Err(_)` or `None` | 230 | /// Checks is expr is `Err(_)` or `None` |
231 | fn expr_err_kind(expr: &ast::Expr, ctx: &AssistContext) -> Option<TryKind> { | 231 | fn expr_err_kind(expr: &ast::Expr, ctx: &AssistContext) -> Option<TryKind> { |
232 | let call_expr = match expr { | 232 | let func_name = match expr { |
233 | ast::Expr::CallExpr(call_expr) => call_expr, | 233 | ast::Expr::CallExpr(call_expr) => call_expr.expr()?, |
234 | ast::Expr::PathExpr(_) => expr.clone(), | ||
234 | _ => return None, | 235 | _ => return None, |
235 | }; | 236 | }; |
236 | let func = call_expr.expr()?; | 237 | let text = func_name.syntax().text(); |
237 | let text = func.syntax().text(); | ||
238 | 238 | ||
239 | if text == "Err" { | 239 | if text == "Err" { |
240 | Some(TryKind::Result { ty: ctx.sema.type_of_expr(expr)? }) | 240 | Some(TryKind::Result { ty: ctx.sema.type_of_expr(expr)? }) |
@@ -3277,6 +3277,44 @@ fn $0fun_name() -> Result<i32, i64> { | |||
3277 | } | 3277 | } |
3278 | 3278 | ||
3279 | #[test] | 3279 | #[test] |
3280 | fn try_option_with_return() { | ||
3281 | check_assist( | ||
3282 | extract_function, | ||
3283 | r##" | ||
3284 | enum Option<T> { None, Some(T) } | ||
3285 | use Option::*; | ||
3286 | fn foo() -> Option<()> { | ||
3287 | let n = 1; | ||
3288 | $0let k = foo()?; | ||
3289 | if k == 42 { | ||
3290 | return None; | ||
3291 | } | ||
3292 | let m = k + 1;$0 | ||
3293 | let h = 1 + m; | ||
3294 | Some(()) | ||
3295 | }"##, | ||
3296 | r##" | ||
3297 | enum Option<T> { None, Some(T) } | ||
3298 | use Option::*; | ||
3299 | fn foo() -> Option<()> { | ||
3300 | let n = 1; | ||
3301 | let m = fun_name()?; | ||
3302 | let h = 1 + m; | ||
3303 | Some(()) | ||
3304 | } | ||
3305 | |||
3306 | fn $0fun_name() -> Option<i32> { | ||
3307 | let k = foo()?; | ||
3308 | if k == 42 { | ||
3309 | return None; | ||
3310 | } | ||
3311 | let m = k + 1; | ||
3312 | Some(m) | ||
3313 | }"##, | ||
3314 | ); | ||
3315 | } | ||
3316 | |||
3317 | #[test] | ||
3280 | fn try_result_with_return() { | 3318 | fn try_result_with_return() { |
3281 | check_assist( | 3319 | check_assist( |
3282 | extract_function, | 3320 | extract_function, |