Skip to content

Commit

Permalink
Auto merge of #16009 - werifu:fix-extract-function, r=Veykril
Browse files Browse the repository at this point in the history
fix: bug in extract_function.rs

There is a little bug in extract_function: It appends `use path::to::ControlFlow;` if the function created contains string "ControlFlow".

 A case below (also in the test named `does_not_import_control_flow` which will fail in the original code)

<img width="322" alt="image" src="https://github.com/rust-lang/rust-analyzer/assets/53432474/4b80bb58-0cfd-4d56-b64c-d9649eed336e">
<img width="391" alt="image" src="https://github.com/rust-lang/rust-analyzer/assets/53432474/3d7262f4-8a4c-44ea-822d-304b8b23fe28">

Now I have changed the condition determining whether adding import statement. Only when the new function body contains ControlFlow::Break or ControlFlow::Continue can the import statement be added.

Last related PR: #10309
  • Loading branch information
bors committed Dec 7, 2023
2 parents 9975650 + 05e8b92 commit 49dd380
Showing 1 changed file with 27 additions and 1 deletion.
28 changes: 27 additions & 1 deletion crates/ide-assists/src/handlers/extract_function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,12 @@ pub(crate) fn extract_function(acc: &mut Assists, ctx: &AssistContext<'_>) -> Op
_ => format_function(ctx, module, &fun, old_indent, new_indent),
};

if fn_def.contains("ControlFlow") {
// There are external control flows
if fun
.control_flow
.kind
.is_some_and(|kind| matches!(kind, FlowKind::Break(_, _) | FlowKind::Continue(_)))
{
let scope = match scope {
ImportScope::File(it) => ImportScope::File(builder.make_mut(it)),
ImportScope::Module(it) => ImportScope::Module(builder.make_mut(it)),
Expand Down Expand Up @@ -4968,6 +4973,27 @@ pub fn testfn(arg: &mut Foo) {
fn $0fun_name(arg: &mut Foo) {
arg.field = 8;
}
"#,
);
}
#[test]
fn does_not_import_control_flow() {
check_assist(
extract_function,
r#"
//- minicore: try
fn func() {
$0let cf = "I'm ControlFlow";$0
}
"#,
r#"
fn func() {
fun_name();
}
fn $0fun_name() {
let cf = "I'm ControlFlow";
}
"#,
);
}
Expand Down

0 comments on commit 49dd380

Please sign in to comment.