mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-16 17:58:16 +00:00
allow try expr? with return None in extracted function
This commit is contained in:
parent
9eb19d92dd
commit
4be260d693
1 changed files with 42 additions and 4 deletions
|
@ -229,12 +229,12 @@ fn external_control_flow(ctx: &AssistContext, body: &FunctionBody) -> Option<Con
|
||||||
|
|
||||||
/// Checks is expr is `Err(_)` or `None`
|
/// Checks is expr is `Err(_)` or `None`
|
||||||
fn expr_err_kind(expr: &ast::Expr, ctx: &AssistContext) -> Option<TryKind> {
|
fn expr_err_kind(expr: &ast::Expr, ctx: &AssistContext) -> Option<TryKind> {
|
||||||
let call_expr = match expr {
|
let func_name = match expr {
|
||||||
ast::Expr::CallExpr(call_expr) => call_expr,
|
ast::Expr::CallExpr(call_expr) => call_expr.expr()?,
|
||||||
|
ast::Expr::PathExpr(_) => expr.clone(),
|
||||||
_ => return None,
|
_ => return None,
|
||||||
};
|
};
|
||||||
let func = call_expr.expr()?;
|
let text = func_name.syntax().text();
|
||||||
let text = func.syntax().text();
|
|
||||||
|
|
||||||
if text == "Err" {
|
if text == "Err" {
|
||||||
Some(TryKind::Result { ty: ctx.sema.type_of_expr(expr)? })
|
Some(TryKind::Result { ty: ctx.sema.type_of_expr(expr)? })
|
||||||
|
@ -3276,6 +3276,44 @@ fn $0fun_name() -> Result<i32, i64> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn try_option_with_return() {
|
||||||
|
check_assist(
|
||||||
|
extract_function,
|
||||||
|
r##"
|
||||||
|
enum Option<T> { None, Some(T) }
|
||||||
|
use Option::*;
|
||||||
|
fn foo() -> Option<()> {
|
||||||
|
let n = 1;
|
||||||
|
$0let k = foo()?;
|
||||||
|
if k == 42 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let m = k + 1;$0
|
||||||
|
let h = 1 + m;
|
||||||
|
Some(())
|
||||||
|
}"##,
|
||||||
|
r##"
|
||||||
|
enum Option<T> { None, Some(T) }
|
||||||
|
use Option::*;
|
||||||
|
fn foo() -> Option<()> {
|
||||||
|
let n = 1;
|
||||||
|
let m = fun_name()?;
|
||||||
|
let h = 1 + m;
|
||||||
|
Some(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn $0fun_name() -> Option<i32> {
|
||||||
|
let k = foo()?;
|
||||||
|
if k == 42 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let m = k + 1;
|
||||||
|
Some(m)
|
||||||
|
}"##,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn try_result_with_return() {
|
fn try_result_with_return() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
|
Loading…
Reference in a new issue