]> git.lizzy.rs Git - rust.git/commitdiff
Don't include a ref if none was declared
authorJeroen Vannevel <jer_vannevel@outlook.com>
Wed, 5 Jan 2022 01:18:55 +0000 (01:18 +0000)
committerJeroen Vannevel <jer_vannevel@outlook.com>
Wed, 5 Jan 2022 01:18:55 +0000 (01:18 +0000)
crates/ide_assists/src/handlers/extract_variable.rs

index fb48c0b4f12da237ac35ed1e4252f2e601a96397..39a4700915f6bef6fb0d186b612719b5ec1e7a49 100644 (file)
@@ -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)]
@@ -1088,6 +1094,46 @@ struct S {
 fn foo(s: &S) {
     let $0z = &s.sub.field.field;
     z.do_thing();
+}"#,
+        );
+    }
+
+    #[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();
 }"#,
         );
     }