about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJeroen Vannevel <jer_vannevel@outlook.com>2022-01-05 01:18:55 +0000
committerJeroen Vannevel <jer_vannevel@outlook.com>2022-01-05 01:18:55 +0000
commitcd5ad4e5007c0de29c487bb2763db7e3457b2a2c (patch)
tree3a90b9e0d0334423885e411765682a8d488e5efa
parent817f47828c86683e6950576eb213e9d9d2524bf8 (diff)
downloadrust-cd5ad4e5007c0de29c487bb2763db7e3457b2a2c.tar.gz
rust-cd5ad4e5007c0de29c487bb2763db7e3457b2a2c.zip
Don't include a ref if none was declared
-rw-r--r--crates/ide_assists/src/handlers/extract_variable.rs52
1 files changed, 49 insertions, 3 deletions
diff --git a/crates/ide_assists/src/handlers/extract_variable.rs b/crates/ide_assists/src/handlers/extract_variable.rs
index fb48c0b4f12..39a4700915f 100644
--- a/crates/ide_assists/src/handlers/extract_variable.rs
+++ b/crates/ide_assists/src/handlers/extract_variable.rs
@@ -53,7 +53,13 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
     }
 
     let ref_kind: RefKind = if let Some(receiver_type) = get_receiver_type(&ctx, &to_extract) {
-        if receiver_type.is_mutable_reference() { RefKind::MutRef } else { RefKind::Ref }
+        if receiver_type.is_mutable_reference() {
+            RefKind::MutRef
+        } else if receiver_type.is_reference() {
+            RefKind::Ref
+        } else {
+            RefKind::None
+        }
     } else {
         RefKind::None
     };
@@ -86,7 +92,7 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext) -> Option
             let reference_modifier = match ref_kind {
                 RefKind::MutRef => "&mut ",
                 RefKind::Ref => "&",
-                RefKind::None => ""
+                RefKind::None => "",
             };
 
             match anchor {
@@ -180,7 +186,7 @@ fn get_receiver(expression: ast::Expr) -> Option<ast::Expr> {
 enum RefKind {
     Ref,
     MutRef,
-    None
+    None,
 }
 
 #[derive(Debug)]
@@ -1091,4 +1097,44 @@ fn foo(s: &S) {
 }"#,
         );
     }
+
+    #[test]
+    fn test_extract_var_regular_parameter() {
+        check_assist(
+            extract_variable,
+            r#"
+struct X;
+
+impl X {
+    fn do_thing(&self) {
+
+    }
+}
+
+struct S {
+    sub: X
+}
+
+fn foo(s: S) {
+    $0s.sub$0.do_thing();
+}"#,
+            r#"
+struct X;
+
+impl X {
+    fn do_thing(&self) {
+
+    }
+}
+
+struct S {
+    sub: X
+}
+
+fn foo(s: S) {
+    let $0x = s.sub;
+    x.do_thing();
+}"#,
+        );
+    }
 }