Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide_assists/src/handlers/extract_function.rs39
1 files changed, 38 insertions, 1 deletions
diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs
index 63b0a91ce5..8c7fb03f7a 100644
--- a/crates/ide_assists/src/handlers/extract_function.rs
+++ b/crates/ide_assists/src/handlers/extract_function.rs
@@ -878,7 +878,7 @@ impl FunctionBody {
// We can move the value into the function call if it's not used after the call,
// if the var is not used but defined outside a loop we are extracting from we can't move it either
// as the function will reuse it in the next iteration.
- let move_local = !has_usages && defined_outside_parent_loop;
+ let move_local = (!has_usages && defined_outside_parent_loop) || ty.is_reference();
Param { var, ty, move_local, requires_mut, is_copy }
})
.collect()
@@ -4335,4 +4335,41 @@ fn $0fun_name(a: _) -> _ {
"#,
);
}
+
+ #[test]
+ fn test_jeroen() {
+ check_assist(
+ extract_function,
+ r#"
+pub struct Foo {
+ field: u32,
+}
+
+pub fn testfn(arg: &mut Foo) {
+ $0arg.field = 8; // write access
+ println!("{}", arg.field); // read access$0
+ // Simulating access after the extracted portion
+ arg.field = 16; // write access
+ println!("{}", arg.field); // read access
+}
+"#,
+ r#"
+pub struct Foo {
+ field: u32,
+}
+
+pub fn testfn(arg: &mut Foo) {
+ fun_name(arg); // read access
+ // Simulating access after the extracted portion
+ arg.field = 16; // write access
+ println!("{}", arg.field); // read access
+}
+
+fn $0fun_name(arg: &mut Foo) {
+ arg.field = 8;
+ println!("{}", arg.field);
+}
+"#,
+ );
+ }
}