mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Auto merge of #13527 - unexge:use-let-else-stmt-in-convert-to-guarded-return-assist, r=jonas-schievink
Use let-else statements in `Convert to guarded return` assist Follow up for https://github.com/rust-lang/rust-analyzer/pull/13516, addresses remaining part of https://github.com/rust-lang/rust-analyzer/issues/13254#issuecomment-1250408527
This commit is contained in:
commit
6c3ab563de
@ -129,32 +129,15 @@ pub(crate) fn convert_to_guarded_return(acc: &mut Assists, ctx: &AssistContext<'
|
|||||||
}
|
}
|
||||||
Some((path, bound_ident)) => {
|
Some((path, bound_ident)) => {
|
||||||
// If-let.
|
// If-let.
|
||||||
let match_expr = {
|
let pat = make::tuple_struct_pat(path, once(bound_ident));
|
||||||
let happy_arm = {
|
let let_else_stmt = make::let_else_stmt(
|
||||||
let pat = make::tuple_struct_pat(
|
pat.into(),
|
||||||
path,
|
|
||||||
once(make::ext::simple_ident_pat(make::name("it")).into()),
|
|
||||||
);
|
|
||||||
let expr = {
|
|
||||||
let path = make::ext::ident_path("it");
|
|
||||||
make::expr_path(path)
|
|
||||||
};
|
|
||||||
make::match_arm(once(pat.into()), None, expr)
|
|
||||||
};
|
|
||||||
|
|
||||||
let sad_arm = make::match_arm(
|
|
||||||
// FIXME: would be cool to use `None` or `Err(_)` if appropriate
|
|
||||||
once(make::wildcard_pat().into()),
|
|
||||||
None,
|
None,
|
||||||
early_expression,
|
cond_expr,
|
||||||
|
ast::make::tail_only_block_expr(early_expression),
|
||||||
);
|
);
|
||||||
|
let let_else_stmt = let_else_stmt.indent(if_indent_level);
|
||||||
make::expr_match(cond_expr, make::match_arm_list(vec![happy_arm, sad_arm]))
|
let_else_stmt.syntax().clone_for_update()
|
||||||
};
|
|
||||||
|
|
||||||
let let_stmt = make::let_stmt(bound_ident, None, Some(match_expr));
|
|
||||||
let let_stmt = let_stmt.indent(if_indent_level);
|
|
||||||
let_stmt.syntax().clone_for_update()
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -238,10 +221,7 @@ fn main(n: Option<String>) {
|
|||||||
r#"
|
r#"
|
||||||
fn main(n: Option<String>) {
|
fn main(n: Option<String>) {
|
||||||
bar();
|
bar();
|
||||||
let n = match n {
|
let Some(n) = n else { return };
|
||||||
Some(it) => it,
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
foo(n);
|
foo(n);
|
||||||
|
|
||||||
// comment
|
// comment
|
||||||
@ -264,10 +244,7 @@ fn main() {
|
|||||||
"#,
|
"#,
|
||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = match Err(92) {
|
let Ok(x) = Err(92) else { return };
|
||||||
Ok(it) => it,
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
foo(x);
|
foo(x);
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
@ -292,10 +269,7 @@ fn main(n: Option<String>) {
|
|||||||
r#"
|
r#"
|
||||||
fn main(n: Option<String>) {
|
fn main(n: Option<String>) {
|
||||||
bar();
|
bar();
|
||||||
let n = match n {
|
let Some(n) = n else { return };
|
||||||
Some(it) => it,
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
foo(n);
|
foo(n);
|
||||||
|
|
||||||
// comment
|
// comment
|
||||||
@ -323,10 +297,7 @@ fn main(n: Option<String>) {
|
|||||||
r#"
|
r#"
|
||||||
fn main(n: Option<String>) {
|
fn main(n: Option<String>) {
|
||||||
bar();
|
bar();
|
||||||
let mut n = match n {
|
let Some(mut n) = n else { return };
|
||||||
Some(it) => it,
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
foo(n);
|
foo(n);
|
||||||
|
|
||||||
// comment
|
// comment
|
||||||
@ -354,10 +325,7 @@ fn main(n: Option<&str>) {
|
|||||||
r#"
|
r#"
|
||||||
fn main(n: Option<&str>) {
|
fn main(n: Option<&str>) {
|
||||||
bar();
|
bar();
|
||||||
let ref n = match n {
|
let Some(ref n) = n else { return };
|
||||||
Some(it) => it,
|
|
||||||
_ => return,
|
|
||||||
};
|
|
||||||
foo(n);
|
foo(n);
|
||||||
|
|
||||||
// comment
|
// comment
|
||||||
@ -412,10 +380,7 @@ fn main() {
|
|||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
while true {
|
while true {
|
||||||
let n = match n {
|
let Some(n) = n else { continue };
|
||||||
Some(it) => it,
|
|
||||||
_ => continue,
|
|
||||||
};
|
|
||||||
foo(n);
|
foo(n);
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
@ -469,10 +434,7 @@ fn main() {
|
|||||||
r#"
|
r#"
|
||||||
fn main() {
|
fn main() {
|
||||||
loop {
|
loop {
|
||||||
let n = match n {
|
let Some(n) = n else { continue };
|
||||||
Some(it) => it,
|
|
||||||
_ => continue,
|
|
||||||
};
|
|
||||||
foo(n);
|
foo(n);
|
||||||
bar();
|
bar();
|
||||||
}
|
}
|
||||||
|
@ -334,6 +334,10 @@ pub fn block_expr(
|
|||||||
ast_from_text(&format!("fn f() {buf}"))
|
ast_from_text(&format!("fn f() {buf}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn tail_only_block_expr(tail_expr: ast::Expr) -> ast::BlockExpr {
|
||||||
|
ast_from_text(&format!("fn f() {{ {tail_expr} }}"))
|
||||||
|
}
|
||||||
|
|
||||||
/// Ideally this function wouldn't exist since it involves manual indenting.
|
/// Ideally this function wouldn't exist since it involves manual indenting.
|
||||||
/// It differs from `make::block_expr` by also supporting comments.
|
/// It differs from `make::block_expr` by also supporting comments.
|
||||||
///
|
///
|
||||||
@ -656,6 +660,22 @@ pub fn let_stmt(
|
|||||||
};
|
};
|
||||||
ast_from_text(&format!("fn f() {{ {text} }}"))
|
ast_from_text(&format!("fn f() {{ {text} }}"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn let_else_stmt(
|
||||||
|
pattern: ast::Pat,
|
||||||
|
ty: Option<ast::Type>,
|
||||||
|
expr: ast::Expr,
|
||||||
|
diverging: ast::BlockExpr,
|
||||||
|
) -> ast::LetStmt {
|
||||||
|
let mut text = String::new();
|
||||||
|
format_to!(text, "let {pattern}");
|
||||||
|
if let Some(ty) = ty {
|
||||||
|
format_to!(text, ": {ty}");
|
||||||
|
}
|
||||||
|
format_to!(text, " = {expr} else {diverging};");
|
||||||
|
ast_from_text(&format!("fn f() {{ {text} }}"))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn expr_stmt(expr: ast::Expr) -> ast::ExprStmt {
|
pub fn expr_stmt(expr: ast::Expr) -> ast::ExprStmt {
|
||||||
let semi = if expr.is_block_like() { "" } else { ";" };
|
let semi = if expr.is_block_like() { "" } else { ";" };
|
||||||
ast_from_text(&format!("fn f() {{ {expr}{semi} (); }}"))
|
ast_from_text(&format!("fn f() {{ {expr}{semi} (); }}"))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user