Skip to content

Commit 971a271

Browse files
committed
use ControlFlow in "extract function" assist
1 parent 137ac67 commit 971a271

File tree

1 file changed

+30
-13
lines changed

1 file changed

+30
-13
lines changed

crates/ide_assists/src/handlers/extract_function.rs

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,18 @@ impl FlowHandler {
11841184
let action = action.make_result_handler(None);
11851185
let stmt = make::expr_stmt(action);
11861186
let block = make::block_expr(iter::once(stmt.into()), None);
1187-
let condition = make::condition(call_expr, None);
1187+
let controlflow_break_path = make::path_from_text("ControlFlow::Break");
1188+
let tuple_pat = make::tuple_pat(iter::empty());
1189+
let condition = make::condition(
1190+
call_expr,
1191+
Some(
1192+
make::tuple_struct_pat(
1193+
controlflow_break_path,
1194+
iter::once(tuple_pat.into()),
1195+
)
1196+
.into(),
1197+
),
1198+
);
11881199
make::expr_if(condition, block, None)
11891200
}
11901201
FlowHandler::IfOption { action } => {
@@ -1326,7 +1337,7 @@ impl Function {
13261337
.unwrap_or_else(make::ty_placeholder);
13271338
make::ext::ty_result(fun_ty.make_ty(ctx, module), handler_ty)
13281339
}
1329-
FlowHandler::If { .. } => make::ext::ty_bool(),
1340+
FlowHandler::If { .. } => make::ty("ControlFlow<()>"),
13301341
FlowHandler::IfOption { action } => {
13311342
let handler_ty = action
13321343
.expr_ty(ctx)
@@ -1461,8 +1472,11 @@ fn make_body(
14611472
})
14621473
}
14631474
FlowHandler::If { .. } => {
1464-
let lit_false = make::expr_literal("false");
1465-
with_tail_expr(block, lit_false.into())
1475+
let controlflow_continue = make::expr_call(
1476+
make::expr_path(make::path_from_text("ControlFlow::Continue")),
1477+
make::arg_list(iter::once(make::expr_unit())),
1478+
);
1479+
with_tail_expr(block, controlflow_continue.into())
14661480
}
14671481
FlowHandler::IfOption { .. } => {
14681482
let none = make::expr_path(make::ext::ident_path("None"));
@@ -1638,7 +1652,10 @@ fn update_external_control_flow(handler: &FlowHandler, syntax: &SyntaxNode) {
16381652
fn make_rewritten_flow(handler: &FlowHandler, arg_expr: Option<ast::Expr>) -> Option<ast::Expr> {
16391653
let value = match handler {
16401654
FlowHandler::None | FlowHandler::Try { .. } => return None,
1641-
FlowHandler::If { .. } => make::expr_literal("true").into(),
1655+
FlowHandler::If { .. } => make::expr_call(
1656+
make::expr_path(make::path_from_text("ControlFlow::Break")),
1657+
make::arg_list(iter::once(make::expr_unit())),
1658+
),
16421659
FlowHandler::IfOption { .. } => {
16431660
let expr = arg_expr.unwrap_or_else(|| make::expr_tuple(Vec::new()));
16441661
let args = make::arg_list(iter::once(expr));
@@ -3284,18 +3301,18 @@ fn foo() {
32843301
fn foo() {
32853302
loop {
32863303
let mut n = 1;
3287-
if fun_name(&mut n) {
3304+
if let ControlFlow::Break(()) = fun_name(&mut n) {
32883305
break;
32893306
}
32903307
let h = 1 + n;
32913308
}
32923309
}
32933310
3294-
fn $0fun_name(n: &mut i32) -> bool {
3311+
fn $0fun_name(n: &mut i32) -> ControlFlow<()> {
32953312
let m = *n + 1;
3296-
return true;
3313+
return ControlFlow::Break(());
32973314
*n += m;
3298-
false
3315+
ControlFlow::Continue(())
32993316
}
33003317
"#,
33013318
);
@@ -3321,19 +3338,19 @@ fn foo() {
33213338
fn foo() {
33223339
loop {
33233340
let mut n = 1;
3324-
if fun_name(n) {
3341+
if let ControlFlow::Break(()) = fun_name(n) {
33253342
break;
33263343
}
33273344
let h = 1;
33283345
}
33293346
}
33303347
3331-
fn $0fun_name(n: i32) -> bool {
3348+
fn $0fun_name(n: i32) -> ControlFlow<()> {
33323349
let m = n + 1;
33333350
if m == 42 {
3334-
return true;
3351+
return ControlFlow::Break(());
33353352
}
3336-
false
3353+
ControlFlow::Continue(())
33373354
}
33383355
"#,
33393356
);

0 commit comments

Comments
 (0)