Unnamed repository; edit this file 'description' to name the repository.
fix: no deref index-expr for extract_function
Example --- ```rust fn foo() { let mut arr = [1i32]; $0arr[0] = 3;$0 let _ = arr; } ``` **Before this PR** ```rust fn foo() { let mut arr = [1i32]; fun_name(&mut arr); let _ = arr; } fn $0fun_name(arr: &mut [i32; 1]) { *arr[0] = 3; } ``` **After this PR** ```rust fn foo() { let mut arr = [1i32]; fun_name(&mut arr); let _ = arr; } fn $0fun_name(arr: &mut [i32; 1]) { arr[0] = 3; } ```
A4-Tacks 6 weeks ago
parent 7b6e124 · commit 043421f
-rw-r--r--crates/ide-assists/src/handlers/extract_function.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/extract_function.rs b/crates/ide-assists/src/handlers/extract_function.rs
index fa5bb39c54..4865aa7173 100644
--- a/crates/ide-assists/src/handlers/extract_function.rs
+++ b/crates/ide-assists/src/handlers/extract_function.rs
@@ -2088,7 +2088,11 @@ fn fix_param_usages(
for (param, usages) in usages_for_param {
for usage in usages {
match usage.syntax().ancestors().skip(1).find_map(ast::Expr::cast) {
- Some(ast::Expr::MethodCallExpr(_) | ast::Expr::FieldExpr(_)) => {
+ Some(
+ ast::Expr::MethodCallExpr(_)
+ | ast::Expr::FieldExpr(_)
+ | ast::Expr::IndexExpr(_),
+ ) => {
// do nothing
}
Some(ast::Expr::RefExpr(node))
@@ -3212,6 +3216,32 @@ fn $0fun_name(n: &mut i32) {
}
#[test]
+ fn mut_index_from_outer_scope() {
+ check_assist(
+ extract_function,
+ r#"
+//- minicore: index
+fn foo() {
+ let mut arr = [1i32];
+ $0arr[0] = 3;$0
+ let _ = arr;
+}
+"#,
+ r#"
+fn foo() {
+ let mut arr = [1i32];
+ fun_name(&mut arr);
+ let _ = arr;
+}
+
+fn $0fun_name(arr: &mut [i32; 1]) {
+ arr[0] = 3;
+}
+"#,
+ );
+ }
+
+ #[test]
fn mut_field_from_outer_scope() {
check_assist(
extract_function,